gpt4 book ai didi

Linux X86-64 汇编和 printf

转载 作者:IT王子 更新时间:2023-10-29 00:55:26 28 4
gpt4 key购买 nike

我正在阅读一些 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

最佳答案

Linux(和 Windows)x86-64 calling convention前几个参数在堆栈上,而是在寄存器中

参见 http://www.x86-64.org/documentation/abi.pdf (第 20 页)

具体来说:

  1. If the class is MEMORY, pass the argument on the stack.
  2. If the class is INTEGER, the next available register of the sequence %rdi, %rsi, %rdx, %rcx, %r8 and %r9 is used.
  3. If the class is SSE, the next available vector register is used, the registers are taken in the order from %xmm0 to %xmm7.
  4. If the class is SSEUP, the eightbyte is passed in the next available eightbyte chunk of the last used vector register.
  5. If the class is X87, X87UP or COMPLEX_X87, it is passed in memory.

INTEGER 类是适合通用寄存器的任何内容,因此您也可以将其用于字符串指针。

关于Linux X86-64 汇编和 printf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10857273/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com