0

Учитывая этот код:x86 Linux вызов вызова вызова?

section  .text 
global  _start        
_start:           ;tell linker entry point 
    mov  edx,len       ;message length 
    mov  ecx,msg        ;message to write 
    mov  ebx,1        ;file descriptor (stdout) 
## mov  eax,4        ;system call number (sys_write) 
    int  0x80        ;call kernel 
    mov  eax,1        ;system call number (sys_exit) 
    int  0x80        ;call kernel 

section  .data 

msg  db 'Hello, world!',0xa     ;our dear string 
len  equ $ - msg       ;length of our dear string 

Как ядро ​​знают, что msg в ecx, len в edx, и т.д.? Мы не передаем аргументы «ядру»?

ответ

1

Вот как вы передаете аргументы. В вызывающем соглашении для системных вызовов указано, какие регистры содержат аргументы. Ядро ожидает их там, и вы должны поместить их туда. См. Также this reference.

В то время как обычное 32-разрядное соглашение cdecl использует стек для передачи аргументов, существуют аналогичные соглашения в пользовательском режиме (в частности, fastcall), которые также используют регистры для передачи аргументов. Стандартные соглашения для x86-64 также делают это.

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