x86 Assembly pushl/popl don't work with “Error: suffix or operands invalid”

后端 未结 5 722
逝去的感伤
逝去的感伤 2020-11-29 01:45

I\'m a newbie to assembly programming, working through Programming Ground Up on an Ubuntu x86_64 desktop with GNU assembler v2.20.1.

I\'ve been able to assemble/link

5条回答
  •  既然无缘
    2020-11-29 02:48

    In 64-bit mode you cannot push and pop 32-bit values; you need pushq and popq.

    Also, you will not get a proper exit this way. On 32-bit x86, you would need to set %eax to 1 to select the exit() system call, and set %ebx to the exit code you actually wish. On 64-bit x86 (that's what you are using), conventions are different: the system call number for exit() is 60, not 1; the first system call parameter goes in %rdi, not %rbx; the system-call invocation opcode is not int $0x80 but the special, x86-64-only opcode syscall.

    Which leads to:

    .section .data
    .section .text
    .globl _start
    _start:
        pushq   $60
        popq    %rax
        pushq   $1
        popq    %rdi
        syscall
    

    (each push/pop sequence can be replaced with a simple mov (like mov $60, %eax) of course; I suppose that you are trying to explicitly test push and pop, optimize for code-size, or avoid 0 bytes in the machine code (for an exploit payload))


    Related:

    • What are the calling conventions for UNIX & Linux system calls on i386 and x86-64
    • What happens if you use the 32-bit int 0x80 Linux ABI in 64-bit code?

提交回复
热议问题