movl %ebx, %esi
movl $.LC1, %edi
movl $0, %eax
call printf
我使用下面的asm代码来打印ebx寄存器中的内容。当我使用
movl $1,%eax
int 0x80
在第一种情况下,我得到了正确的答案,但是分割错误。我正在使用gnu汇编程序和at&t语法。我怎样才能解决这个问题?
最佳答案
根据代码判断,您可能处于64位模式(请确认),在这种情况下,指针的大小为64位。在一个位置依赖于linux的可执行文件movl $.LC1, %edi
是安全的,编译器使用什么,但是为了使代码位置独立,并且能够处理符号地址在您可以使用leaq .LC1(%rip), %rdi
的低32位之外。
此外,确保:
你在你的函数中保留rbx
的值
堆栈指针根据需要对齐
这段代码适用于64位:
.globl main
main:
push %rbx
movl $42, %ebx
movl %ebx, %esi
leaq .LC1(%rip), %rdi
movl $0, %eax
call printf
xor %eax, %eax
pop %rbx
ret
.data
.LC1: .string "%d\n"