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"

10-08 08:11
查看更多