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

标签 linux assembly x86-64 system-calls

<分区>

; 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/

相关文章:

assembly - 在 MIPS 中类型转换

linux - Linux下thumb汇编

c - 适用于 Windows 的硬件性能计数器 API

assembly - 使用 XSAVE 和 XRSTOR 的英特尔 x86

linux - 在 Linux 中运行二进制补丁后使其他线程中的缓存无效(使用 IPI?)

linux - 我可以运行使用 2 个不同命令行的脚本吗?

linux - 更新 Scala 版本

c - 在缓冲区溢出返回地址被不正确的地址覆盖,但它仍然有效

python - 如何使用 python 脚本启动/终止应用程序?

linux - 删除每行中的第一个方括号及其内容(bash)