【发布时间】:2019-12-13 21:44:51
【问题描述】:
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。 这里发生了什么?
【问题讨论】:
-
您在使用非工作代码时会遇到哪些错误(如果有)?你如何建造?你如何运行(如果你可以构建)?你所说的“不起作用”是什么意思?请花点时间刷新how to ask good questions,以及this question checklist。
-
你不能随意使用寄存器。系统调用需要特定寄存器中的特定参数。请参阅system call table。对于 sys_write,
ebx必须包含文件描述符、ecx缓冲区和edx长度。 PS:我怀疑你使用了masm,这更有可能是nasm。 -
nasm -f elf mycode.asm --> ld -m elf_i386 -s -o mycode mycode.oi 没有出现错误,构建阶段似乎没问题,但是当我使用 ebx 寄存器时输出什么都没有
-
" 我没有收到错误,构建阶段似乎还可以" 汇编器和链接器不了解系统调用的语义。那是操作系统的事情。您需要遵循操作系统指定的调用约定。
-
@Jester 哦,谢谢。我不知道这些信息。有什么书可以推荐给像我这样的菜鸟吗?
标签: linux assembly x86 nasm system-calls