【问题标题】:Why I can't compile this assembly successfully?为什么我不能成功编译这个程序集?
【发布时间】:2011-04-04 12:19:24
【问题描述】:

引用自this question

.text
    call start
    str:
        .string "test\n"
    start:
    movl    $4, %eax
    movl    $1, %ebx
    pop     %ecx
    movl    $5, %edx
    int     $0x80
    ret

gcc -c test.S 给出:

test.S: Assembler messages:
test.S:8: Error: suffix or operands invalid for `pop'

【问题讨论】:

    标签: assembly


    【解决方案1】:

    pop 只是命令。在 at&t 语法中,您必须推迟操作数维度。所以你必须用“popl”改变“pop”行

    编辑

    1. 正确的答案是 Jens Björnhager 的答案,因为在我的 64 位笔记本电脑上,您的代码通过指定它是 32 位架构来正确组装。
    2. 操作数维度不是强制性的,但强烈建议。

    【讨论】:

    【解决方案2】:

    您可能在 64 位系统上尝试编译 32 位程序集。使用 -m32 强制 gcc 编译 32 位:

    gcc -m32 -c test.S
    

    编辑:

    64 位版本:

    .text
        call start
        str:
            .string "test\n"
        start:
        movl    $1, %eax
        movl    $1, %edi
        popq    %rsi
        movl    $5, %edx
        syscall
    
        movl    $60,%eax
        movl    $0, %edi
        syscall
    

    【讨论】:

    • 我以为所有 32 位指令(包括 16 位指令)在 64 位上仍然可用,但我错了。这里有一个网页解释了为什么上面的 popl 指令不起作用。 x86-64.org/documentation/assembly.html
    • 它可以工作,很酷,但是如何在 64 位机器上使用输出?我尝试使用 stackoverflow.com/questions/5094934/… 的输出来重现它,但它不起作用。
    • 即32位汇编,你需要重写一切以符合64位ABI。我正在使用您的程序的 x86-64 版本更新我的答案。
    • 但是很多 32 位程序也可以在 64 位机器上运行,对吧?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 2014-10-09
    • 1970-01-01
    • 2018-12-05
    相关资源
    最近更新 更多