Когда вы звоните в операционную систему, операционная система должна знать, чего вы хотите. В 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 он ожидает количество байтов написать.
Единственный способ для ядра определить, какие данные имеют смысл использовать соглашение, в котором используются определенные регистры для определенных фрагментов данных.
Если вы используете 'rbx' вместо' rax' для чего? Ваш вопрос кажется мне непонятным. – byxor
rbx вместо rax – Ankit
Что делает 'syscall'? Оставляет ли он определенные значения в 'rax' для вас? – byxor