gpt4 book ai didi

linux - ebx 寄存器在 NASM 中不起作用,但 ecx 可以工作

转载 作者:太空宇宙 更新时间:2023-11-04 05:56:31 24 4
gpt4 key购买 nike

section .data:
msg: db "Hello !"
msglen: equ $-msg

section .text:
global _start:

_start:
mov ebx,msg
mov ecx,msglen
mov eax,4
int 80h
mov eax,1
int 80h

上面的代码不起作用。但下面的代码运行良好。

section .data:
msg: db "Hello !"
msglen: equ $-msg

section .text:
global _start:

_start:
mov ecx,msg
mov edx,msglen
mov eax,4
int 80h
mov eax,1
int 80h

我所做的就是将 ebx 更改为 ecx,将 ecx 更改为 edx。这里发生了什么?

最佳答案

您的第二个代码之所以有效,是因为 write(0, "string", len) 恰好有效。 FD 0 是标准输入,但在终端中,程序通常与所有 3 个标准 FD 一起运行,引用在 TTY 上以读/写方式打开的相同文件描述。

因此您可以写入标准输入,除非您将其重定向到文件。

在您的 _start 入口点进入用户空间之前,内核会将所有寄存器清零,因此如果您不设置它,则 EBX = 0。 write(2)将文件描述符作为其第一个参数。

使用strace ./a.out查看您的系统调用。

<小时/>

您的第一个代码不起作用,因为 write("string", len, 0) 将指针作为文件描述符编号传递,因此 sys_write 将返回 -EBADF (如果它首先检查 len 是否是有效指针,则返回 -EFAULT )。唯一有效的 fd 将为 0、1 或 2,除非您使用 ./a.out 12345>&1 之类的重定向来打开 fd 12345 作为 1 的副本。再次使用strace

并阅读有关系统调用调用约定的文档。 What are the calling conventions for UNIX & Linux system calls on i386 and x86-64有链接。

另请参阅https://stackoverflow.com/tags/x86/info更多文档/手册和指南的链接。

关于linux - ebx 寄存器在 NASM 中不起作用,但 ecx 可以工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57374330/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com