这是我的警告.
Missing sentinel in function call
Run Code Online (Sandbox Code Playgroud)
我怎么能删除它.
我正在使用linux和gcc编译器.
我想拿起一点x86.我正在使用gcc -S -O0在64位mac上进行编译.
C中的代码:
printf("%d", 1);
Run Code Online (Sandbox Code Playgroud)
输出:
movl $1, %esi
leaq LC0(%rip), %rdi
movl $0, %eax ; WHY?
call _printf
Run Code Online (Sandbox Code Playgroud)
我不明白为什么在调用'printf'之前%eax被清除为0.由于printf返回打印的字符数量为%eax我最好的猜测,因此将其归零以准备它,printf但我认为printf必须负责准备它.而且,相反,如果我调用自己的功能int testproc(int p1),则gcc认为没有必要准备%eax.所以我想知道为什么gcc对待printf和testproc不同.
int max(int n, ...)
Run Code Online (Sandbox Code Playgroud)
我正在使用cdecl调用约定,其中调用者在被调用者返回后清理变量.
我想知道怎么做宏va_end,va_start和va_arg工作?
调用者是否将参数数组的地址作为max的第二个参数传递?
为什么al包含汇编中的矢量参数数量?
为什么向量参数与被调用者的正常参数有任何不同?