微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ASM调用Printf

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] 举报,一经查实,本站将立刻删除。

相关推荐