一尘不染

为什么我不能使用int 0x80从指向堆栈存储器的指针进行sys_write?

linux

; NASM
push 30 ; ‘0’

mov rax, 4 ; write
mov rbx, 1 ; stdout
mov rcx, rsp ; ptr to character on stack
mov rdx, 1 ; length of string = 1
int 80h

上面的代码不会将任何内容输出到stdout。当我对中的字符进行ptr时,它会起作用section .data。我究竟做错了什么?


阅读 283

收藏
2020-06-07

共1个答案

一尘不染

amd64使用系统调用比一个不同的方法int 0x80,但可能仍然与32位库工作装等。而对x86一个会做:

mov eax, SYSCALL_NUMBER
mov ebx, param1
mov ecx, param2
mov edx, param3
int 0x80

amd64一个反而会做到这一点:

mov rax, SYSCALL_NUMBER_64 ; different from the x86 equivalent, usually
mov rdi, param1
mov rsi, param2
mov rdx, param3
syscall

对于您想要做的事情,请考虑以下示例:

        bits 64
        global _start

section .text

_start:
        push            0x0a424242
        mov             rdx, 04h
        lea             rsi, [rsp]
        call            write
        call            exit
exit:
        mov             rax, 60     ; exit()
        xor             rdi, rdi    ; errno
        syscall

write:
        mov             rax, 1      ; write()
        mov             rdi, 1      ; stdout
        syscall
        ret
2020-06-07