- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我注意到,有时当我编译 C 代码时,有时会在方法 1 中生成汇编代码:
STR R11, [SP, #-4]!
ADD R11, SP, #0
SUB SP, SP, #4
有时在方法 2 中:
STMFD SP!, {R11, LR}
ADD R11, SP, #4
SUB SP, SP, #4
第一种和第二种的区别在于第二种是将LR存入栈中。
现在我面临一个问题,我的函数像第一个方法一样开始,使用链接寄存器 (BL) 调用另一个函数,并且由于我的函数首先不保存 LR,它导致了一个严重的问题.如果我可以告诉编译器使用第二种方法它可以解决我的问题。
可能与该函数使用内联汇编调用内部函数有关,因此“不识别”存在对另一个函数的调用并且认为没有保存LR的意义。调用内联汇编是有义务的,因为被调用的函数获取 SP 的值作为参数。
这是一个 22 条军规的情况,希望有人能帮我解决这个问题。谢谢!
最佳答案
将 lr
标记为已损坏以使编译器保存它:
extern void foo(void);
extern void bar(void)
{
asm ( "bl foo" : : : "lr" );
}
生成以下代码:
bar:
str lr, [sp, #-4]!
bl foo
ldr lr, [sp], #4
bx lr
参见 the documentation更多细节。请记住也将您使用的所有其他寄存器标记为已损坏。否则编译器可能会在其中之一中放置一个变量。您可能还需要将所有调用者保存的寄存器标记为已损坏。
关于在 arm gcc 中控制函数的 prelog 和 epilog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37562932/
我定义了一个带有描述、选项和结尾的解析器。当我使用 --help 运行应用程序时,它会按预期输出关于 epilog 的帮助。但是,如果 --help 与 --verbose 一起出现,我只想查看结语。
是否可以使用 Visual Studio 编译器编写 2 个在调用其他函数之前和函数执行之后被调用的函数?在 gcc 中,你可以用 __cyg_profile_func_*() 做到这一点职能: vo
我正在寻找可以实现一些序言代码和结尾代码的设计模式。让我解释一下: 我有一个函数(其中有很多)几乎做同样的事情: 这是伪代码,但实际上它是用 C# 4.5 编写的 public IDatabaseEr
我正在寻找可以实现一些序言代码和结尾代码的设计模式。让我解释一下: 我有一个函数(其中有很多)几乎做同样的事情: 这是伪代码,但实际上它是用 C# 4.5 编写的 public IDatabaseEr
我有一个场景,我有很多具有以下模式的函数 RETURN_TYPE FOO( TYPE PARM1, TYPE PARM2) { PROLOG(PARM1, PARM2)
我想展开一个 x64 调用堆栈,所以我尝试按照我在此处找到的“UNWIND 过程”进行操作: http://msdn.microsoft.com/en-us/library/8ydc79k6.aspx
我注意到,有时当我编译 C 代码时,有时会在方法 1 中生成汇编代码: STR R11, [SP, #-4]! ADD R11, SP, #0 SUB SP, SP, #4 有时在方法 2 中: ST
我正在一个 dll 中编写一些插件代码,该代码由我无法控制的主机调用。 主机假定插件作为 __stdcall 函数导出。主机被告知函数的名称和它期望的参数的详细信息,并通过 LoadLibrary、G
我正在尝试写入 XML 文档,从列表的 ArrayList 中获取数据 for (int i = 0; i )[i]; headname.Replace
我是一名优秀的程序员,十分优秀!