Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
汇编成C,printf函数_C_Assembly_X86 - Fatal编程技术网

汇编成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);
}