Существуют ли правила использования регистров на ассемблере - PullRequest
1 голос
/ 03 марта 2012

Язык ассемблера довольно прост, но я не совсем понимаю, как использовать регистры, например:

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.Существует ли соглашение о том, какой регистр должен содержать?

1 Ответ

3 голосов
/ 03 марта 2012

Конечно, важно, какие регистры используются при выполнении системного вызова. eax содержит номер системного вызова (в данном случае 4), а ebx, ecx, edx, esi, edi и ebp содержат аргументы системного вызова в этом порядке. Первый аргумент должен храниться в ebx, второй в ecx и т. Д., Иначе не имеет смысла.

Смотрите здесь для списка системных вызовов Linux. Как видите, системный вызов № 4 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 = количество символов для печати (len в вашем коде)

РЕДАКТИРОВАТЬ: Вот еще одна таблица , с которой каждый регистр должен быть заполнен для конкретных системных вызовов. Эти две ссылки также содержат дополнительную информацию о системных вызовах, которые, возможно, стоит прочитать:

...