汇编成C,printf函数

Fra*_*nXh 0 c x86 assembly

我有这个汇编代码,我认为它的作用是使用该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)

Pro*_*Sim 5

作为您的程序集的非常直译,

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。或者您可能缺少代码片段中的初始化代码。