<分区>
; 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
中的字符的指针时,它就起作用了。我做错了什么?
<分区>
; 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
中的字符的指针时,它就起作用了。我做错了什么?
最佳答案
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
关于linux - 为什么我不能使用 int 0x80 从指向堆栈内存的指针进行 sys_write?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10105871/