2017-02-11 5 views
0

Ниже приведено привет мир программа на языке ассемблера x86. Я знаю, что делает каждый регистр, но почему я не могу использовать другой регистр вместо указанных?Использование регистров в ассемблере x86 под Linux

Например, если я использую rbx вместо rax, код не работает.

section .data 
    text db "Hello World",10 
section .text 
    global _start 
_start: 
    mov rax, 1 
    mov rdi, 1 
    mov rsi, text 
    mov rdx, 14 
    syscall 

    mov rax, 60 
    mov rdi, 0 
    syscall 
+1

Если вы используете 'rbx' вместо' rax' для чего? Ваш вопрос кажется мне непонятным. – byxor

+0

rbx вместо rax – Ankit

+0

Что делает 'syscall'? Оставляет ли он определенные значения в 'rax' для вас? – byxor

ответ

3

Когда вы звоните в операционную систему, операционная система должна знать, чего вы хотите. В Linux операционная система просматривает регистры общего назначения rax, rdi, rsi, rdx, r10, r8 и r9. В этих регистрах ядро ​​обнаруживает множество значений:

rax: 0x00000001 
rdi: 0x00000001 
rsi: 0x0040
rdx: 0x0000000e 
r10: 0x00000042 
r8: 0xdeadbeef 
r9: 0x00000023 

Как ядро ​​знает, какие значения представляют что? Они все выглядят одинаково! Решение состоит в том, что существует соглашение. Во-первых, ядро ​​просматривает rax, чтобы проверить, какую функцию вы хотите. Функция 1 - SYS_write. Для SYS_write он ожидает, что rdi будет содержать дескриптор файла для записи в (1, stdout), в rsi он ожидает указатель на данные для записи (0x00400123, указатель на строку "Hello World"), а в rdx он ожидает количество байтов написать.

Единственный способ для ядра определить, какие данные имеют смысл использовать соглашение, в котором используются определенные регистры для определенных фрагментов данных.

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