我有这个汇编代码,我认为它的作用是使用该printf
函数进行打印。我对 C 不是很熟悉,但我创建了一个 main 函数,并打印出printf("%d, %d", x, y)
x 和 y 都为零的地方。
我将 C 代码转换为汇编代码,但得到了完全不同的东西。有人可以帮我理解下面的汇编代码是做什么的吗?
mov %edx,0x8(%esp)
mov %eax,0x4(%esp)
movl $0x80486a0,(%esp)
call 8048360 <printf@plt>
Run Code Online (Sandbox Code Playgroud)
作为您的程序集的非常直译,
mov %edx,0x8(%esp)
Run Code Online (Sandbox Code Playgroud)
将 edx 中的值移动到偏移量 8 处的堆栈上(esp + 8)
mov %eax,0x4(%esp)
Run Code Online (Sandbox Code Playgroud)
将 eax 中的值移动到堆栈中的偏移量 4 (esp + 4)
movl $0x80486a0,(%esp)
Run Code Online (Sandbox Code Playgroud)
将 [32 位值] 0x80486a0 移动到偏移量 0 处的堆栈上
这是将函数的参数放置在堆栈上的一种非常基本的方式——RTL 或 C 顺序。最低偏移量处的值是第一个参数(在这种情况下,是字符串文字在内存中的地址),最高偏移量处的值是最后一个参数。
当您拨打电话时:
call 8048360 <printf@plt>
Run Code Online (Sandbox Code Playgroud)
您的程序将跳转到给定的地址(您的反汇编程序已将其标识为 printf 函数),从堆栈中读取值,执行打印操作,然后返回到您的代码,在您调用后的下一条指令处恢复操作。
我猜你的来源看起来像这样:
void main()
{
int x =0, y=0;
printf("%d, %d", x, y);
}
Run Code Online (Sandbox Code Playgroud)
根据您的操作系统/编译器,您可能会保证 eax 和 edx 在启动时的值为 0。或者您可能缺少代码片段中的初始化代码。