|
|
1
7
不,它们没有归零。覆盖列表的用途(通常称为 打击者名单 )通知GCC,根据asm指令,clobber列表中列出的寄存器将被修改,因此编译器应保留任何当前处于活动状态的寄存器。
例如,在x86上
这将得到C变量中结果的第一部分和第二部分
正如我们告诉GCC的那样
关于你的第二个问题(为什么你会看到一个登记册列在一个
然后,这里的代码从堆栈中弹出一个项目,但是它不关心实际值——它可能只是保持堆栈平衡,或者该值在该代码路径中不需要。以这种方式书写,而不是:
|
|
|
2
5
如果“调零”的意思是“寄存器中的值被替换为0,以防止我知道其他函数在做什么”,那么不,寄存器在使用前不会调零。但这不重要,因为你告诉GCC你打算这么做 百货商店 那里的信息,不是你想要的 阅读 将此信息提供给GCC,以便(阅读文档)在完成汇编代码时“无需猜测哪些寄存器或内存位置将包含要使用的数据”(例如,不必记住数据是否位于堆栈寄存器或其他寄存器)。
使现代化
另一种方法是保存和恢复每个汇编代码块的每个寄存器。在具有大量寄存器的RISC机器上,可能会变得昂贵(例如,安腾有128个通用寄存器、128个浮点寄存器和64个1位寄存器)。 我已经有一段时间没写汇编代码了。我使用GCC的命名寄存器特性的经验比使用特定寄存器的经验多得多。那么,看一个例子:
由于GCC的编译器部分不检查汇编代码,因此它不会保护其中的数据
|
|
|
3
4
我怀疑覆盖列表只是给GCC一个提示,在ASM调用中不要在这些寄存器中存储任何有价值的内容;由于GCC不分析您给它的ASM,并且某些指令有副作用,会触及代码中未明确命名的其他寄存器,因此这是告诉GCC的方法。 |