2013-07-26 5 views
0

Я читаю руководство по программированию nasm в Linux и есть вещь, на которую я не могу найти ответ.регистры и прерывания в сборке

Рассмотрим следующий код:

mov eax, 4 
mov ebx, 1 
mov ecx, buffer 
int 0x80 

Насколько я понимаю, это устанавливает параметры в соответствующие регистры, а затем «толкает» их к исполнению. Мой вопрос в том, почему eax будет хранить syscall, а не ebx? Почему ecx хранит все, что мы хотим напечатать на экране? Существуют ли технические различия между eax и ebx, или это просто соглашение об именах? Если это так, где хранится таблица «имя регистра - функция»?

Благодаря

ответ

3

Вот что ваша программа делать:

; print a byte to stdout 
mov eax, 4   ; the system interprets 4 as "write" 
mov ebx, 1   ; standard output (print to terminal) 
mov ecx, buffer  ; pointer to the value being passed 
mov edx, 1   ; size of the buffer 
int 0x80    ; call the kernel 

Atfer, что это специфическая система ...

Как говорится в следующем документе для системы Linux звонки, номера sys_call хранятся в eax.

Я хотел бы предложить, чтобы взглянуть на этот очень хороший документ: http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html

Число системных вызовов будут помещены в регистр eax. Другие значения помещаются в остальные регистры перед вызовом программного прерывания int 0x80. После каждого syscall целое число возвращается в eax.

Чтобы ответить specically:

Мой вопрос, почему EAX будет хранить системный вызов, не EBX?

Это специфичный для системы. Система определяет, что это должно быть так, так оно и есть.

Почему ecx хранит вещи, которые мы хотим распечатать на экране?

То же самое ...

Есть некоторые технические различия между EAX и EBX, или это просто именование?

  • EAX - Накопитель Регистрация
  • EBX - базовый регистр
  • ECX - Counter Регистрация
  • EDX - регистр данных
  • ESI - Индекс Источник
  • EDI - Индекс назначения
  • EBP - базовый указатель
  • ESP - Stack P ointer

Источник: http://www.swansontec.com/sregisters.html

+0

> Для Linux вы сохраните номер sys_call в EAX, например. ОК, вопрос в том, почему мы храним его там и где еще это задокументировано. Я думал, что это очень важный вопрос, и он содержится в некоторых официальных документах. –

+0

Теперь это то, что я искал. Благодаря! –

4

Это специфическая система вещь, так что вы должны прочитать руководство вашей операционной системы. То, что вы описываете, выглядит как системный вызов Linux. Это well documented. Программное прерывание само по себе не имеет семантики относительно регистров, но ОС сообщит вам, какие данные он ожидает в разных регистрах и в стеке и как он передает результат.

Смежные вопросы