首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ASM调用Printf

ASM调用Printf
EN

Stack Overflow用户
提问于 2013-01-05 06:00:30
回答 2查看 8.5K关注 0票数 1
代码语言:javascript
运行
复制
movl %ebx, %esi
movl $.LC1, %edi
movl $0, %eax
call printf

我使用以下asm代码打印EBX寄存器中的内容。当我用

代码语言:javascript
运行
复制
movl $1,%eax
int 0x80

在第一种情况下,echo $?得到正确的答案,但分割错误。我正在使用GNU汇编程序和AT&T语法。我怎样才能解决这个问题?

EN

回答 2

Stack Overflow用户

发布于 2013-01-05 14:06:11

从代码判断,您可能处于64位模式(请确认),在这种情况下,指针的大小为64位。在Linux上,位置依赖的可执行文件movl $.LC1, %edi是安全的,编译器使用的是什么,但是要使代码位置独立,并且能够处理位于低32位之外的符号地址,您可以使用leaq .LC1(%rip), %rdi

此外,确保:

  • 在函数中保留rbx的值
  • 堆栈指针按需要对齐。

此代码在64位中适用于我:

代码语言:javascript
运行
复制
.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"
票数 1
EN

Stack Overflow用户

发布于 2013-01-05 06:49:11

编辑:正如Jester所指出的,这个答案只适用于x86 (32位) asm,而提供的示例更可能适用于x86-64。

这是因为printf有可变数量的参数。printf调用不会为您恢复堆栈,您需要自己进行。

在您的示例中,您需要编写(32位程序集):

代码语言:javascript
运行
复制
push %ebx
push $.LC1
call printf
add $8, %esp  // 8 : 2 argument of 4 bytes
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14169140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档