我目前正在重构c代码,里面有汇编代码:
asm("movl $8, %esi\n\t"
movl $.LC0, %edi\n\t"
"movl $0, %eax");
每个寄存器的含义是什么?在c代码中,没有其他asm代码分配$ 8或$ .LC0,我假设$ 0只是零值
答案 0 :(得分:3)
在汇编级别,.LC0
是一个标签,只能在编译器输出中找到,而不是手写汇编。
以.LC
开头的标签由gcc生成,用于标记字符串文字的位置。 movl $.LC0, %edi
最可能的含义是%edi
将指向编译器在源文件中遇到的第一个字符串文字。但这显然不是一件干净的事情。
如果您正在尝试对某些恶意代码进行逆向工程,那么您可能必须展示整个事情才能使其有意义。 C和汇编之间的全球互动指向了一些混淆的尝试。
如果您没有尝试对某些恶意代码进行逆向工程...现在就开始考虑此代码是恶意的。
答案 1 :(得分:1)
他们什么都不提;这个内联的asm片段是垃圾,如果恰当地使用正确的编译器和正确的优化选项正确编译正确的周围代码,它将只做任何有用的事情,这样编译器生成的代码就像片段那样工作预计。
请参阅inline-assembly标记wiki,以获取解释如何编写GNU C内联asm代码的教程和文档的链接。
这段代码不仅在技术上“不安全”,它实际上会因为对周围代码或优化选项的轻微更改而中断,因为它不会告诉编译器它认为它修改的C值是什么。
代码片段中唯一具有任何已知含义的东西是立即常数0和8.在AT& T语法中,immediates以$
为前缀。 (mov .LC0, %edi
(没有$)将是来自该地址的加载,而不是将地址放入寄存器。但是你不知道编译器决定用.LC0
标记哪个常量,或者什么编译器将使用%edi
,因此这是无用的)请参阅x86标记wiki以获取x86文档和汇编程序手册的链接。
有关编译器生成代码的示例,请参阅the Godbolt compiler explorer中C中的Hello World的asm。