汇编成C,printf函数
我有这个汇编代码,我认为它的作用是使用汇编成C,printf函数,c,assembly,x86,C,Assembly,X86,我有这个汇编代码,我认为它的作用是使用printf函数打印。我对C不是很熟悉,但我创建了一个主函数,并打印出printf(“%d,%d”,x,y),其中x和y都是零 我将C代码转换为汇编代码,但得到了完全不同的东西。有人能帮我理解下面的汇编代码是做什么的吗 mov %edx,0x8(%esp) mov %eax,0x4(%esp) movl $0x80486a0,(%esp) call
printf
函数打印。我对C不是很熟悉,但我创建了一个主函数,并打印出printf(“%d,%d”,x,y)
,其中x和y都是零
我将C代码转换为汇编代码,但得到了完全不同的东西。有人能帮我理解下面的汇编代码是做什么的吗
mov %edx,0x8(%esp)
mov %eax,0x4(%esp)
movl $0x80486a0,(%esp)
call 8048360 <printf@plt>
mov%edx,0x8(%esp)
mov%eax,0x4(%esp)
movl$0x80486a0,(%esp)
致电8048360
从外观上看,这会将三个参数放入堆栈中——两个int来自edx
和eax
,加上看起来像地址的内容——可能是它为存储字符串文本(即格式字符串)而选择的地址。之后,它调用printf
因此,底线是,它看起来像是您在问题中给出的源代码的一个非常简单的实现。作为对程序集的直译
mov %edx,0x8(%esp)
将edx中的值移动到偏移量8(esp+8)处的堆栈上
将eax中的值移动到偏移量4(esp+4)处的堆栈上
将[32位值]0x80486a0移动到偏移量为0的堆栈上
这是将函数的参数放置在堆栈上的一种非常基本的方法——RTL或C顺序。最小偏移量处的值是第一个参数(在本例中,是字符串文本在内存中的地址),最大偏移量处的值是最后一个参数
当你打电话时:
call 8048360 <printf@plt>
根据您的操作系统/编译器,您可以保证eax和edx在启动时的值为0。或者您可能缺少代码段中的初始化代码。mov%edx,0x8(%esp)
:正在将edx的值移动到堆栈指针(带0x8偏移量)。mov%eax,0x4(%esp)
:参见上文。movl$0x80486a0,(%esp)
:正在堆栈指针中加载地址0x80486a0。call 8048360
:正在调用函数printf。汇编根据汇编程序和体系结构的不同而有所不同,最好说明您使用的是哪种编译器,以及C编译器是什么…+1,以获得如此好的解释。:)谢谢你的回答:D,但我有一个问题:“代码段中的初始化代码”是什么。谢谢你的回答,但我有一个问题。我仍然不明白在我的代码中这一行是如何完成的:movl$0x80486a0,(%esp):正在堆栈指针中加载地址0x80486a0。这样做的不是您的代码,而是调用函数的标准方式。无论何时调用任何函数,它都是在程序集级别执行的方式。堆栈指针由函数的起始地址填充,以便系统知道下一步执行哪行代码。当代码加载地址为0x80486a0的堆栈指针时,意味着下一步将执行位于内存中地址
0x80486a0
处的代码。
movl $0x80486a0,(%esp)
call 8048360 <printf@plt>
void main()
{
int x =0, y=0;
printf("%d, %d", x, y);
}