Я хочу писать программы на сборке SysV ABI x86_64, и до сих пор я передавал аргументы в регистры совершенно случайным образом.
Но я только что увидел на этом форуме, что для этого есть стандарт. Мы должны передать RDI, RSI, RDX и RCX (в том же порядке).
Теперь я задаю себе два вопроса.
Во-первых, ESI и EDI не должны использоваться только во время операции со строками? Что произойдет, если я захочу передать в качестве аргумента целое число, а не строку?
Во-вторых, что, если мне нужно передать 32-битный аргумент, а не 64-битный аргумент? Например, если я хочу создать идентификатор для системного вызова write
, я бы написал это:
;; void write(int fd, const void *buf, size_t count);
;; Inputs : ESI = offset string, EDX = number of characters to write, EBX = file descriptor
;; Outputs : <none>
;; Clobbers : <none>
write:
mov ecx, esi
mov eax, 4
int 0x80
ret
Но со стандартом, как я могу переместить значения из 64-битных регистров в 32 -битовые регистры? Потому что я не могу этого сделать:
mov ecx, rdi ; impossible