小编Ken*_*ico的帖子

被调用方如何知道参数是通过寄存器而不是堆栈传递的

假设我们得到一个简单的程序

#include <cstdio>

int main(int argc, char* argv[]) {
    int n = argc;
    if (n > 1) {
        n = 1;
    }else {
        n = -1;
    }
    printf("%d\n", n);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

g++ main.cpp -S -O1在ubuntu x64下使用Windows子系统生成的汇编代码和汇编代码段

subq    $8, %rsp
cmpl    $1, %edi
setg    %dl
movzbl  %dl, %edx
leal    -1(%rdx,%rdx), %edx
movl    $.LC0, %esi
movl    $1, %edi
movl    $0, %eax
call    __printf_chk
movl    $0, %eax
addq    $8, %rsp
ret
Run Code Online (Sandbox Code Playgroud)

push没有访问内存的指令,也没有访问内存的指令。因此,n必须通过传递参数%edx。现在,我想知道c库函数如何__printf_chk知道其中%edx …

c++ assembly g++ x86-64 calling-convention

1
推荐指数
1
解决办法
81
查看次数

标签 统计

assembly ×1

c++ ×1

calling-convention ×1

g++ ×1

x86-64 ×1