movl %ebx, %esi
movl $.LC1, %edi
movl $0, %eax
call printf
我使用以下asm代码打印EBX寄存器中的内容。当我用
movl $1,%eax
int 0x80
在第一种情况下,echo $?
得到正确的答案,但分割错误。我正在使用GNU汇编程序和AT&T语法。我怎样才能解决这个问题?
发布于 2013-01-05 14:06:11
从代码判断,您可能处于64位模式(请确认),在这种情况下,指针的大小为64位。在Linux上,位置依赖的可执行文件movl $.LC1, %edi
是安全的,编译器使用的是什么,但是要使代码位置独立,并且能够处理位于低32位之外的符号地址,您可以使用leaq .LC1(%rip), %rdi
。
此外,确保:
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"
发布于 2013-01-05 06:49:11
编辑:正如Jester所指出的,这个答案只适用于x86 (32位) asm,而提供的示例更可能适用于x86-64。
这是因为printf有可变数量的参数。printf调用不会为您恢复堆栈,您需要自己进行。
在您的示例中,您需要编写(32位程序集):
push %ebx
push $.LC1
call printf
add $8, %esp // 8 : 2 argument of 4 bytes
https://stackoverflow.com/questions/14169140
复制相似问题