Assembly 调用函数后%esp会发生什么情况?

Assembly 调用函数后%esp会发生什么情况?,assembly,x86,att,Assembly,X86,Att,我在做一些装配练习,发现了一个我无法解决的问题。他们告诉我%esp=0x08c28f6a。 然后他们告诉我有一个函数: 函数:movw 0(%esp),%bx ret 0x80482ae:调用函数 0x80484a4:XXXXXXX 我不明白调用函数后%esp和%bx的值是多少,而且我不清楚0(%esp)的含义。我知道在调用函数时,下一条指令的地址会被推入堆栈。但是什么内容被移动到%bx 函数的返回地址。 该代码将esp指示的值(偏移量为0)移动到ebx。这是回信地址。它允许pic代码在x86

我在做一些装配练习,发现了一个我无法解决的问题。他们告诉我%esp=0x08c28f6a。 然后他们告诉我有一个函数:

函数:movw 0(%esp),%bx

ret

0x80482ae:调用函数

0x80484a4:XXXXXXX


我不明白调用函数后%esp和%bx的值是多少,而且我不清楚0(%esp)的含义。我知道在调用函数时,下一条指令的地址会被推入堆栈。但是什么内容被移动到%bx

函数的返回地址。 该代码将esp指示的值(偏移量为0)移动到ebx。这是回信地址。它允许pic代码在x86中工作,并用于生成函数地址,例如

call ebx+2000 ;;  call printf

esp的值不是通过读取来修改的

好的,我想我得到了,但是,0(%esp)是堆栈顶部的值吗?(函数的返回值?)。在32位代码中调用函数时,ESP将递减4,并且调用后的指令指针(返回地址)将写入该内存<代码>调用函数是一条5字节的指令。调用后的指令将是0x80482ae+5=0x80482b3。在这种情况下,ESP显然是在0x08c28f6a启动的,因此当调用
funct
时,ESP比调用前低4个字节(0x08c28f6a-4=0x8C28F66)。因此,传输后控制为function
funct
内存地址0(%ESP)处的2个字节将是返回地址(0x82b3)的下2个字节,然后移动该地址以注册BXIn对以下注释的响应
movw%esp,%bx
无效。ESP为32位寄存器,BX为16位。这是不允许的。如果是
movl%esp,%ebx
则当前堆栈指针(esp)将复制到ebx。在这种情况下,将值0x8C28F66置于EBX中