使用汇编语言寄存器是否有规则

时间:2012-03-03 03:18:55

标签: assembly cpu-registers

汇编语言非常简单,但我对如何使用寄存器感到困惑:

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'。我所做的就是更改lenmsg的注册表。是否有关于哪个寄存器必须包含的约定?

1 个答案:

答案 0 :(得分:3)

当然,在执行系统调用时使用哪些寄存器很重要。 eax包含系统调用的编号(在本例中为4),ebxecxedxesiedi和{ {1}}按顺序保存系统调用的争论者。第一个参数必须存储在ebp中,第二个参数存储在ebx中,依此类推,否则没有意义。

Look here获取Linux系统调用列表。如您所见,系统调用号4是ecx

sys_write

因此,您的寄存器必须设置为:

  • ssize_t sys_write(unsigned int fd, const char * buf, size_t count) - eax
  • 的系统调用号= 4
  • sys_write - ebx =文件描述符,fd
  • 为1
  • stdout - ecx =指向字符串的指针(代码中为buf
  • msg - edx =要打印的字符数量(代码中为count

编辑: Here's another table,每个寄存器应填写特定的系统调用。这两个链接还包含有关可能值得阅读的系统调用的更多信息: