Я писал программу на x86_64
ассемблере yasm
которая читает строку из консольного ввода и вдруг понял, что после этих строк:
mov rax, SYS_read
mov rdi, STDIN
lea rsi, byte [char]
mov rdx, 1
syscall
значения регистров r11
и rcx
изменены. Регистр r11
не является регистром аргументов (согласно соглашению о вызовах). Так почему?
Минимальный пример кода
section .data
SYS_read equ 0
SYS_exit equ 60
SUCCESS_EXIT equ 0
STDIN equ 0
section .bss
char: resb 1
section .text
global _start
_start:
xor r11, r11
xor rcx, rcx
mov rax, SYS_read
mov rdi, STDIN
lea rsi, byte [char]
mov rdx, 1
syscall
end:
mov rax, SYS_exit
mov rdi, SUCCESS_EXIT
syscall
Непосредственно перед меткой end
метки r11
и rcx
имеют следующие значения (сеанс gdb
):
rcx 0x4000d5 4194517
r11 0x246 582
syscall
в ответе... stackoverflow.com/q/49358425/4271923 ( это в основном то, что вам нужно проверить: felixcloutier.com/x86/SYSCALL.html - изменяетrcx
иr11
). - person Ped7g   schedule 19.03.2018