为什么我无法使用 int 0x80从指针sys_write堆栈内存?


; 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

上面的代码不会打印任何内容到标准输出。当我给 section .data 中的一个角色一个 ptr 时,它会起作用.我做错了什么?

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

30 decimal 是 ASCII"记录分隔符"的代码。不管那是什么,它可能不是一个可打印的字符。

另一方面,30 个十六进制(NASM 术语中的 30h 或 0x30)是 ASCII"0"的代码。

此外,您需要使用 64 位 ABI。

最新更新