【发布时间】:2020-06-08 08:56:11
【问题描述】:
在气体里有这个:
.text
.globl main
main:
xor %eax, %eax
lea str(%rip), %rdi
call printf
call exit
str: .byte 0x7F, "ELF", 1,1,1,0
我认为.byte 指令可以像在 nasm 中那样连接
db 0x7F, "ELF", 1, 1, 1, 0 ; e_ident
来源:http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html
【问题讨论】:
-
请注意,如果您希望它实际运行,您必须在调用
printf之前对齐堆栈。在调用之前添加任何push指令。 -
@NateEldredge 对齐只是惯例。如果程序很复杂,这将是一个问题,但是由于调用一个函数,然后调用另一个函数,因此对齐不是生活必需的,它仍然可以正常工作
-
当前 glibc
printf在违反 ABI 时不会崩溃,但有趣的事实是:scanf确实出错,即使没有 FP 参数。 glibc scanf Segmentation faults when called from a function that doesn't align RSP。允许函数依赖 ABI 保证的正确性,因此违反它们是个坏主意。当它碰巧起作用时,您可以提供玩具示例,但请注意您在做什么。 -
这不仅仅是惯例。
printf和其他库函数可以并且有时会执行仅在堆栈对齐时才有效的指令。幸运的是,它现在可能恰好可以使用printf的特定参数集以及使用特定编译器构建的特定libc,但它可能随时中断。调用 C 函数时,堆栈对齐不是可选的。
标签: assembly x86-64 string-literals gnu-assembler