Перенос stepik в подпапку
This commit is contained in:
@@ -15,6 +15,7 @@
|
||||
- Callee-saved (надо сохранять и восстанавливать в функции): RBX, RSP, RBP, R12–R15.
|
||||
|
||||
### Порядок передачи аргументов
|
||||
#### Для call
|
||||
- 1–6-й целочисленные/указательные: RDI, RSI, RDX, RCX, R8, R9.
|
||||
- Вещественные/векторные: XMM0–XMM7 (независимо от целочисленных).
|
||||
- 7-й и далее, а также переполнение по типам — через стек. Компиляторы обычно размещают их с выравниванием по 8/16.
|
||||
@@ -26,26 +27,6 @@
|
||||
- Небольшие структуры (до 16 байт) могут возвращаться через регистры (классы INTEGER/SSE распределяются по RAX/RDX или XMM0/XMM1).
|
||||
- Большие структуры возвращаются через скрытый указатель: вызывающий передаёт адрес буфера (sret), а функция заполняет его.
|
||||
|
||||
### Типичный каркас функции на NASM (Linux)
|
||||
; extern printf
|
||||
; global main
|
||||
; section .data
|
||||
; msg db "x=%d", 10, 0
|
||||
; section .text
|
||||
; main:
|
||||
; push rbp
|
||||
; mov rbp, rsp
|
||||
; ; на входе rsp%16==8 → для вызова нужно выровнять до 16
|
||||
; sub rsp, 8 ; выравнивание стека перед call
|
||||
; lea rdi, [rel msg] ; 1-й аргумент (fmt) → RDI
|
||||
; mov esi, 42 ; 2-й аргумент (int) → ESI
|
||||
; xor eax, eax ; AL=0: нет XMM-аргументов (variadic правило)
|
||||
; call printf
|
||||
; add rsp, 8 ; вернуть выравнивание
|
||||
; xor eax, eax ; return 0
|
||||
; pop rbp
|
||||
; ret
|
||||
|
||||
### Памятка при написании кода
|
||||
- До call: выровняй стек (RSP%16==0), подготовь регистры аргументов, AL для varargs.
|
||||
- После call: результат смотри в RAX/XMM0; считай, что caller-saved испорчены — сохрани важное заранее.
|
||||
|
||||
Reference in New Issue
Block a user