汇编语言非常简单,但我对如何使用寄存器感到困惑:
section .data
msg db "Hello, world!",0xa
len equ $ - msg
section .text
global _start
_start:
;write our string to stdout
mov edx,len
mov ecx,msg
mov eax,4
int 0x80
;and exit
mov ebx,0
mov eax,1
int 0x80
它工作正常,但当我将代码更改为:
section .data
msg db "Hello, world!",0xa
len equ $ - msg
section .text
global _start
_start:
;write our string to stdout
mov ebx,len
mov edx,msg
mov eax,4
int 0x80
;and exit
mov ebx,0
mov eax,1
int 0x80
它会编译,但不会显示'Hello, World'
。我所做的就是更改len
和msg
的注册表。是否有关于哪个寄存器必须包含的约定?
答案 0 :(得分:3)
当然,在执行系统调用时使用哪些寄存器很重要。 eax
包含系统调用的编号(在本例中为4),ebx
,ecx
,edx
,esi
,edi
和{ {1}}按顺序保存系统调用的争论者。第一个参数必须存储在ebp
中,第二个参数存储在ebx
中,依此类推,否则没有意义。
Look here获取Linux系统调用列表。如您所见,系统调用号4是ecx
:
sys_write
因此,您的寄存器必须设置为:
ssize_t sys_write(unsigned int fd, const char * buf, size_t count)
- eax
sys_write
- ebx
=文件描述符,fd
stdout
- ecx
=指向字符串的指针(代码中为buf
)msg
- edx
=要打印的字符数量(代码中为count
)编辑: Here's another table,每个寄存器应填写特定的系统调用。这两个链接还包含有关可能值得阅读的系统调用的更多信息: