在c ++中的函数内执行汇编。

|      长getesp(){     __asm __(\“ mov%esp,%eax \”);     }     void main(){     printf(\“%08X \\ n \”,getesp()+ 4);     } 为什么esp在设置堆栈框架之前指向值,并且与下面的代码有什么区别?     void main(){    __asm __(\“ mov%esp,%eax \”);    }     
已邀请:
我做了did0ѭ之后
getesp:
    pushl   %ebp
    movl    %esp, %ebp
    subl    $4, %esp
#APP
# 4 \"xxt.c\" 1
    movl %esp,%eax
# 0 \"\" 2
#NO_APP
    leave
    ret


main:
    leal    4(%esp), %ecx
    andl    $-16, %esp
    pushl   -4(%ecx)
    pushl   %ebp
    movl    %esp, %ebp
    pushl   %ecx
    subl    $20, %esp
    call    getesp
    addl    $4, %eax
    movl    %eax, 4(%esp)
    movl    $.LC0, (%esp)
    call    printf
    addl    $20, %esp
    popl    %ecx
    popl    %ebp
    leal    -4(%ecx), %esp
    ret
getesp
具有一个
pushl
,它操纵
esp
,并在行内的ѭ6and和
ebp
中获得被操纵的
esp
。 进行函数调用以获取堆栈指针并将其放入
main
肯定是不同的,并且相差12个字节(在此特定情况下)。这是因为当您执行
call
时会推入
eip
(如果不是跨段的,并且对于linux / unix正常程序执行来说只是is10ѭ)(需要引用),接下来在
getesp
函数内部还有另一个inside13ѭ和
ebp
,之后是堆栈指针减去4。因为
eip
ebp
是4个字节,所以总差现在为12个字节。实际上我们可以在函数调用版本中看到。 没有该函数调用,将不会按
eip
和进行其他
esp
操作,因此我们在进行主设置后将获得
esp
值。 我对AT&T不满意,因此下面是英特尔语法和Intex语法asm转储中的相同代码。请注意,在将主值内的
__asm__
进入
a
printf
调用中,没有推键或其他
esp
修改,因此,main内的
__asm__
获得了通过
sub     esp, 20
行在主线中设置的
esp
值。如上所述,通过调用
getesp
得到的值是(期望值)-12。 C代码
#include <stdio.h>

int a;

long getesp() {
__asm__(\"mov a, esp\");
}

int main(void) 
{

    __asm__(\"mov a,esp\");
    printf(\"%08X\\n\",a);

    getesp ();
    printf(\"%08X\\n\",a);
}
在我的情况下,输出是针对特定运行的:
BF855D00
BF855CF4
英特尔语法转储为:
getesp:
    push    ebp
    mov     ebp, esp
    sub     esp, 4
#APP
# 7 \"xt.c\" 1
    mov a, esp
# 0 \"\" 2
#NO_APP
    leave
    ret


main:
    lea     ecx, [esp+4]
    and     esp, -16
    push    DWORD PTR [ecx-4]
    push    ebp
    mov     ebp, esp
    push    ecx
    sub     esp, 20
#APP
# 12 \"xt.c\" 1
    mov a,esp
# 0 \"\" 2
#NO_APP
    mov     eax, DWORD PTR a
    mov     DWORD PTR [esp+4], eax
    mov     DWORD PTR [esp], OFFSET FLAT:.LC0
    call    printf
    call    getesp
    mov     eax, DWORD PTR a
    mov     DWORD PTR [esp+4], eax
    mov     DWORD PTR [esp], OFFSET FLAT:.LC0
    call    printf
    add     esp, 20
    pop     ecx
    pop     ebp
    lea     esp, [ecx-4]
    ret
我希望这有帮助。     

要回复问题请先登录注册