我想拿起一点x86.我正在使用gcc -S -O0在64位mac上进行编译.
C中的代码:
printf("%d", 1);
输出:
movl    $1, %esi
leaq    LC0(%rip), %rdi
movl    $0, %eax        ; WHY?
call    _printf
我不明白为什么在调用'printf'之前%eax被清除为0.由于printf返回打印的字符数量为%eax我最好的猜测,因此将其归零以准备它,printf但我认为printf必须负责准备它.而且,相反,如果我调用自己的功能int testproc(int p1),则gcc认为没有必要准备%eax.所以我想知道为什么gcc对待printf和testproc不同.
假设我在寄存器中有一个整数,我该如何打印?你能展示一个简单的示例代码吗?
我已经知道如何打印一个字符串,如"你好,世界".
我正在Linux上开发.
我正在阅读一些linux汇编手册,并找到了使用printf()函数的想法.我需要它以二进制形式将调试原因的寄存器值输出到终端,但现在我只是尝试用文本测试该函数.
我被困了,因为当我使用pushq而不是pushl时出现段错误.如何更改此程序以输出字符串和二进制形式的寄存器?
.data
input_prompt:
    .string "Hello, world!"
printf_format:
    .string "%5d "
printf_newline:
    .string "\n"
size:
    .long 0
.text
.globl main
main:
    pushq $input_prompt
    call  printf
    movl  $0, %eax
    ret
它由GCC编制为:
gcc tmp.S -o tmp