movl %ebx,%esi movl $.LC1,%edi movl $0,%eax call printf
我使用下面的asm代码来打印EBX寄存器中的内容。 当我使用
movl $1,%eax int 0x80
和echo $? 我得到了正确的答案,但在第一种情况下,分段错误。 我正在使用GNU汇编程序和AT&T语法。 我该如何解决这个问题?
如何从Linux上的汇编代码调用C库?
在32位操作系统上,虚拟8086模式下运行16位程序吗?
问题重新:我的C ++由gcc生成的程序集
禁用EXCEPTION_DEBUG_EVENT传递给附加的debugging器
replace一个进程esp值与其他,以获得一个局部variables
根据代码判断,你可能是64位模式(请确认),在这种情况下,指针的大小是64位。 您应该用leaq .LC1,%rdi (或leaq .LC1(%rip),%rdi )替换movl $.LC1,%edi ,它应该可以工作。
此外,请确保:
你在你的函数中保留rbx价值
堆栈指针按需要对齐
这个代码适用于我64位:
.globl main main: push %rbx movl $42,%ebx movl %ebx,%esi leaq .LC1,%rdi movl $0,%eax call printf xor %eax,%eax pop %rbx ret .data .LC1: .string "%dn"
编辑 :正如Jester指出的,这个答案只适用于x86(32位)asm,而提供的样本更可能是x86-64。
这是因为printf具有可变数量的参数。 printf调用不会为你恢复堆栈,你需要自己做。
在你的例子中,你需要写(32位汇编):
push %ebx push $.LC1 call printf add $8,%esp // 8 : 2 argument of 4 bytes
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。