Π£ΡΠ΅Π±Π½ΠΎ-ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΠΎΡΠΎΠ±ΠΈΠ΅ ΠΏΠΎ Π΄ΠΈΡΡΠΈΠΏΠ»ΠΈΠ½Π΅ Β«ΠΡΡΠΈΡΠ»ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠΈΡΡΠ΅ΠΌΡ ΠΈ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ½ΡΠ΅ ΡΠ΅ΡΠΈΒ»
- ΠΠ°Π½Π½Π°Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠΊΠ° ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π° Π΄Π»Ρ ΡΡΡΠ΄Π΅Π½ΡΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΡ ΠΠ‘ Linux/MacOS
- ΠΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΡΡΠ΅ΡΠΏΡΠ²Π°ΡΡΠΈΠΌ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎΠΌ ΠΏΠΎ ΡΠ·ΡΠΊΡ Assembler ΠΈ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ΅ ΠΠ‘
- Π¦Π΅Π»Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠΊΠΈ - Π΄Π°ΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ± Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ΅ ΠΈ ΡΠΎΠΌ ΠΊΠ°ΠΊ ΠΎΠ½ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ Ρ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠΎΠΌ
- ΠΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ, ΡΡΠΎ Π½Π° Unix-ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ ΠΠ‘, Π²Ρ ΠΏΠΈΡΠΈΡΠ΅ Π½Π° nasm ΠΈ Π΄Π΅Π±Π°ΠΆΠΈΡΠ΅ Π² gdb
Π‘Π°ΠΌΡΠΉ Π½ΠΈΠ·ΠΊΠΈΠΉ ΡΡΠΎΠ²Π΅Π½Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ β ΠΌΠ°ΡΠΈΠ½Π½ΡΠΉ ΡΠ·ΡΠΊ (ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π΄Π²ΠΎΠΈΡΠ½ΡΡ ΠΊΠΎΠ΄ΠΎΠ² ΠΌΠ°ΡΠΈΠ½Π½ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈ ΠΎΠΏΠ΅ΡΠ°Π½Π΄ΠΎΠ²). ΠΠΈΡΠ°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°ΠΌΠΈ Π² Π²ΠΈΠ΄Π΅ Π΄Π²ΠΎΠΈΡΠ½ΡΡ ΡΠΈΡΠ΅Π» ΠΎΡΠ΅Π½Ρ ΡΠ»ΠΎΠΆΠ½ΠΎ, ΠΏΠΎΡΡΠΎΠΌΡ Π²ΠΎ Π²ΡΠ΅Ρ ΠΌΠ°ΡΠΈΠ½Π°Ρ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½ ΡΠ·ΡΠΊ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ° β ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π°Π±ΠΎΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π΄Π²ΠΎΠΈΡΠ½ΡΠ΅ ΡΠΈΡΠ»Π° Π·Π°ΠΌΠ΅Π½Π΅Π½Ρ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ (ΠΌΠ½Π΅ΠΌΠΎΠ½ΠΈΠΊΠ°ΠΌΠΈ, Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ ADD, SUB ΠΈ MUL) ΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΎΠΏΠ΅ΡΠ°Π½Π΄ΠΎΠ² (ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠΌ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΡΠ΅Π΅ΠΊ ΠΏΠ°ΠΌΡΡΠΈ β VAR, string1, ΡΠ΅Π³ΠΈΡΡΡΠΎΠ² β AX, DL, Π°Π΄ΡΠ΅ΡΠΎΠ² β ΠΌΠ΅ΡΠΎΠΊ).
- ΠΡΠΎ ΡΠ°Π·Π½ΡΠ΅ Π²ΠΈΠ΄Ρ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠΎΠ²
- ΠΠΎΡΠ΅ΠΌΡ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅Ρ ΡΡΠΎ ΠΊΡΡΡΠΎ, Π―Π½Π΄Π΅ΠΊΡ, ΠΆΡΡΠ½Π°Π» ΠΠΎΠ΄
- Π‘Π±ΠΎΡΠ½ΠΈΠΊ ΡΠ΅ΡΡΡΡΠΎΠ² Π΄Π»Ρ ΠΆΠ΅Π»Π°ΡΡΠΈΡ ΡΡΠΈΡΡ asm
- Π’ΡΡΠΎΡΠΈΠ°Π», Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΡΠ°ΡΡΠΈΡΠ½ΠΎ ΡΠΏΠΈΡΠ°Π½Π° ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠΊΠ°
- Π’ΡΡΠΎΡΠΈΠ°Π» Π΄Π»Ρ ΡΡΡΠ΄Π΅Π½ΡΠΎΠ² CS Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΏΡΠΎ nasm
ΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΏΠΈΡΠ°ΡΡ Π½Π° Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ΅ Π²Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ: ΠΡΠ»ΠΈ Π·Π΄Π΅ΡΡ Π½Π΅Ρ Π²Π°ΡΠ΅ΠΉ ΠΠ‘, ΡΠΎ ΠΊΠΎΠ½ΡΡΠΈΠ±ΡΡΡΠ½ΠΈΡΠ΅ Π² ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ, ΠΎΠ±Π»Π΅Π³ΡΠΈΡΠ΅ ΠΆΠΈΠ·Π½Ρ ΡΡΡΠ΄Π΅Π½ΡΠΎΠ²
- ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π΄Π»Ρ nasm
- MacOS -
brew install nasm
- Debian\Ubuntu\Mint -
sudo apt install nasm
- Arch -
sudo pacman -S nasm
- MacOS -
- Π΄Π΅Π±Π°Π³Π³Π΅Ρ
- MacOS M1 - ΠΏΡΠΈΠ΄ΡΡΡΡ Π²Π·ΡΡΡ lldb
brew install lldb
- MacOs -
brew install gdb
- Debian\Ubuntu\Mint -
sudo apt install gdb
- Arch - `sudo pacman -S gdb'
- MacOS M1 - ΠΏΡΠΈΠ΄ΡΡΡΡ Π²Π·ΡΡΡ lldb
- objdump - ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΠΌΠ°ΡΠΈΠ½Π½ΡΠΉ ΠΊΠΎΠ΄ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠ³ΠΎ Π±ΠΈΠ½Π°ΡΡ
- MacOS
brew install objdump
- Π΅ΡΠ»ΠΈ Ρ Π²Π°Ρ Π΅Π³ΠΎ ΡΠΆΠ΅ Π½Π΅Ρ - Debian\Ubuntu\Mint -
sudo apt install objdump
- Arch -
sudo pacman -S objdump
- MacOS
- Π»ΠΈΠ½ΠΊΠ΅Ρ - ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ Ρ Π²Π°Ρ Π΅ΡΡΡ
ld
, Π΅ΡΠ»ΠΈ Π²Π΄ΡΡΠ³ Π½Π΅Ρ, ΡΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ ΡΠ΅ΡΠ΅Π· ΠΏΠ°ΠΊΠ΅ΡΠ½ΡΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ
; ----------------------------------------------------------------------------------------.
; ΠΠ°ΠΏΡΡΠΊ: nasm -fmacho64 hello.asm && ld hello.o && ./a.out
; ----------------------------------------------------------------------------------------
global start
section .text
start:
mov rax, 0x02000004 ; Π‘ΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² write
mov rdi, 1 ; Π€Π°ΠΉΠ»ΠΎΠ²ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π΄Π»Ρ stdout
mov rsi, message ; ΠΠ΄ΡΠ΅Ρ Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π»Π΅ΠΆΠΈΡ Π±ΡΡΠ΅Ρ Π΄Π»Ρ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π°
mov rdx, 13 ; Π Π°Π·ΠΌΠ΅Ρ Π±ΡΡΠ΅ΡΠ° Π² Π±Π°ΠΉΡΠ°Ρ
syscall ; ΠΡΠ·ΡΠ²Π°Π΅ΠΌ write
mov rax, 0x02000001 ; Π‘ΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² exit
xor rdi, rdi ; ΠΡΠΈΡΠ°Π΅ΠΌ ΡΠ΅Π³ΠΈΡΡΡ Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π½Π°Ρ
ΠΎΠ΄ΡΡΡΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ Π΄Π»Ρ Π²ΡΠ·ΠΎΠ²Π°
syscall ; ΠΡΠ·ΡΠ²Π°Π΅ΠΌ exit
section .data
message: db "Hello, World", 10 ; 10 - ΠΊΠΎΠ΄ ΡΠΈΠΌΠ²ΠΎΠ»Π° ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° ΡΡΡΠΎΠΊΠΈ
; ----------------------------------------------------------------------------------------.
; ΠΠ°ΠΏΡΡΠΊ: nasm -felf64 hello.asm && ld hello.o && ./a.out
; ----------------------------------------------------------------------------------------
global _start
section .text
_start:
mov eax, 4 ; Π‘ΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² write
mov ebx, 1 ; Π€Π°ΠΉΠ»ΠΎΠ²ΡΠΉ Π΄Π΅ΡΠΊΡΠΈΠΏΡΠΎΡ Π΄Π»Ρ stdout
mov ecx, message ; ΠΠ΄ΡΠ΅Ρ Π² ΠΊΠΎΡΠΎΡΠΎΠΌ Π»Π΅ΠΆΠΈΡ Π±ΡΡΠ΅Ρ Π΄Π»Ρ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π°
mov edx, 13 ; Π Π°Π·ΠΌΠ΅Ρ Π±ΡΡΠ΅ΡΠ° Π² Π±Π°ΠΉΡΠ°Ρ
int 80h ; ΠΡΠ·ΡΠ²Π°Π΅ΠΌ write
mov eax, 1 ; Π‘ΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² exit
mov ebx, 0 ; ΠΡΠ·ΡΠ²Π°Π΅ΠΌ exit
int 80h
section .data
message:
db "Hello, World", 10 ; 10 - ΠΊΠΎΠ΄ ΡΠΈΠΌΠ²ΠΎΠ»Π° ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° ΡΡΡΠΎΠΊΠΈ
ΠΠ»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΠΊ ΡΠ΄ΡΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΎΠΊΠΎΠ½ΡΡΠ»ΡΡΠΈΡΠΎΠ²Π°ΡΡΡΡ Ρ ΡΠ°Π±Π»ΠΈΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ² (Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΠΎΠΈΡΠΊΠ°ΡΡ Π² ΠΈΠ½ΡΠ΅ΡΠ½Π΅ΡΠ΅ syscall table Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Π²Π°ΡΠ΅ΠΉ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΡ ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ). ΠΡΠΈΠΌΠ΅Ρ Π΄Π»Ρ x86_64
ΠΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ Π²Ρ Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ Π½ΡΠΆΠ½ΠΎ ΠΊΠ°ΠΊ-ΡΠΎ ΡΠΎΠ±ΡΠ°ΡΡ ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ. ΠΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π²Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΠΈ ΠΊΠΎΠ½ΡΠΎΠ»ΡΠ½ΡΡ ΡΡΠΈΠ»ΠΈΡΡ nasm
, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²Π°ΠΌ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄. ΠΠ΄Π½Π°ΠΊΠΎ ΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ»ΠΎΠΆΠ½Π΅Π΅, ΡΠ΅ΠΌ Ρ ΠΎΠ±ΡΡΠ½ΡΠΌΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΡΠ΅ΠΌΡΠΌΠΈ ΡΠ·ΡΠΊΠ°ΠΌΠΈ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ· ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ. ΠΠΎΡ Π½Π΅Π±ΠΎΠ»ΡΡΠ°Ρ ΡΡΠ°ΡΡΡ Π½Π° ΡΠ΅ΠΌΡ.
Π― ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΡ Π½Π΅ ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡΡ Π²ΡΠ΅ ΡΡΠΈ ΡΠ°Π³ΠΈ ΡΡΠΊΠ°ΠΌΠΈ, Π° Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΡΠΈΠ»ΠΈΡΠΎΠΉ make. Π ΠΈΡΠΎΠ³Π΅ Ρ Π²Π°Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡΡ ΡΡΠΎ-ΡΠΎ Π²ΡΠΎΠ΄Π΅:
run: task_exec
./task_exec
task_exec: task.o
ld -o task_exec task.o
task.o:
nasm -f macho64 -g -F DWARF task.asm
clean:
rm task.o task_exec
Π’ΠΎΠ³Π΄Π°:
make run - ΡΠΎΠ±ΡΠ°ΡΡ ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ
make clean - ΡΠ΄Π°Π»ΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΡΠΉ ΠΈ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ ΡΠ°ΠΉΠ»
ΠΠ΅ Π·Π°Π±ΡΠ²Π°ΠΉΡΠ΅ Π²ΡΠ·ΡΠ²Π°ΡΡ clean ΠΏΠΎΡΠ»Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΊΠΎΠ΄Π°, Π»ΠΈΠ±ΠΎ Π½Π°ΠΏΠΈΡΠΈΡΠ΅ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΠΉ Makefile
- ΠΠ°Π½Π½Π°Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠΊΠ° ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π° Π΄Π»Ρ ΡΡΡΠ΄Π΅Π½ΡΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΡ ΠΠ‘ Linux/MacOS
- ΠΠ΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΡΡΠ΅ΡΠΏΡΠ²Π°ΡΡΠΈΠΌ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎΠΌ ΠΏΠΎ ΡΠ·ΡΠΊΡ Assembler ΠΈ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ΅ ΠΠ‘
- Π¦Π΅Π»Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠΊΠΈ - Π΄Π°ΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ± Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ΅ ΠΈ ΡΠΎΠΌ ΠΊΠ°ΠΊ ΠΎΠ½ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΠ΅Ρ Ρ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠΎΠΌ
- ΠΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ, ΡΡΠΎ Π½Π° Unix-ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΡ ΠΠ‘, Π²Ρ ΠΏΠΈΡΠΈΡΠ΅ Π½Π° nasm ΠΈ Π΄Π΅Π±Π°ΠΆΠΈΡΠ΅ Π² gdb, ΡΠΎΠ±ΠΈΡΠ°ΠΉΡΠ΅ ΡΠ΅ΡΠ΅Π· make
ΠΠ°Π΄Π°Π½ΠΈΡ ΡΠΌΠΎΡΡΠ΅ΡΡ Π² ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠΉ ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠΊΠ΅, Π² Π½Π΅ΠΉ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΠ΅ΠΎΡΠΈΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π³Π»ΡΠ±ΠΆΠ΅, ΡΠ΅ΠΌ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π·Π΄Π΅ΡΡ.
- ΠΠ°ΡΡΡΠΎΠΈΡΡ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ ΡΠΊΠ°Π·Π°Π½ΠΎ Π²ΡΡΠ΅
- Π‘ΠΊΠΎΠΏΠΈΡΡΠΉΡΠ΅ ΠΏΡΠΈΠΌΠ΅Ρ Ρ "Hello world" ΠΈ ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡ ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ
- ΠΠ½Π°ΡΡ ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ²ΠΈΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π² ΠΠ
- ΠΠ΅ Π·Π°Π±ΡΠ²Π°Π΅ΠΌ, Π΄Π»Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΡΠΌΠΎΡΡΠΈΡΠ΅ Π½Π° ΡΠ°Π·ΠΌΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ΅Π³ΠΈΡΡΡΠ° Π² ΠΊΠΎΡΠΎΡΡΠΉ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ Π΅Ρ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ, ΠΈΠ½Π°ΡΠ΅ Π²Π°Ρ ΡΠΈΠ»ΡΠ½ΠΎ ΡΠ΄ΠΈΠ²ΠΈΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ
- ΠΠ½Π°ΡΡ ΠΊΠ°ΠΊ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π½Π°Π΄ Π½ΠΈΠΌΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΡΡΡΡ
ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ
- Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΡ
- Π°ΡΠΈΡΠΌΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΡ
- ΠΠ½Π°ΡΡ ΠΊΠ°ΠΊ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΡΠ»ΠΎΠ²ΠΈΡ Π² Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ΅
- Π£ΠΌΠ΅ΡΡ ΠΎΡΠ΄Π΅Π±Π°ΠΆΠΈΡΡ ΡΠ²ΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ
- ΠΡΠΎΠ½Π°Π±Π»ΡΠ΄Π°ΡΡ ΠΊΠ°ΠΊ ΠΌΠ΅Π½ΡΡΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² ΡΠ΅Π³ΠΈΡΡΡΠ°Ρ
- ΠΡΠΈΠ²ΡΠΊΠ½ΡΡΡ ΠΊ ΠΊΠΎΠ½ΡΠΎΠ»ΡΠ½ΠΎΠΌΡ Π΄Π΅Π±Π°Π³Π³ΠΈΠ½Π³Ρ, Π»ΡΠ±ΠΈΡΠ΅Π»ΡΠΌ Π‘ΠΈ ΠΎΠ½ ΡΠΎΡΠ½ΠΎ ΠΏΡΠΈΠ³ΠΎΠ΄ΠΈΡΡΡΡ
ΠΡΠΈ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΡ ΡΠ½Π°ΡΠ°Π»Π° ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅, Π·Π°ΡΠ΅ΠΌ Π΅Ρ ΡΠ°Π·ΠΌΠ΅Ρ, Π° Π·Π°ΡΠ΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅.
myVariable db 5
- ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ myVariable, ΡΠ°Π·ΠΌΠ΅ΡΠΎΠΌ 1 Π±Π°ΠΉΡ, ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ 5
ΠΠΎΡ 4 ΠΎΡΠ½ΠΎΠ²Π½ΡΡ
dX
ΠΏΡΠ΅Π²Π΄ΠΎ-ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π΄Π»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΎΠ±ΡΡΠ²ΠΈΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
db - Define Byte - 1 Π±Π°ΠΉΡ
dw - Define Word - 2 Π±Π°ΠΉΡΠ°
dq - Define Doubleword - 4 Π±Π°ΠΉΡΠ°
dt - Define Quadword - 8 Π±Π°ΠΉΡ
ΠΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡΡΠ²ΠΈΡΡ ΡΡΠΎ-ΡΠΎ ΠΏΠΎΠ±ΠΎΠ»ΡΡΠ΅, Π½ΠΎ Π²Π°ΠΌ ΡΡΠΎ Π½Π΅ Π½ΡΠΆΠ½ΠΎ , Π΄Π° ΠΈ Π² Π»Π°Π±ΠΎΡΠ°ΡΠΎΡΠ½ΡΡ ΡΠ°Π±ΠΎΡΠ°Ρ Π½Π΅ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ
ΠΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡΡΠ²Π»ΡΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠΈΠΏΡ Π΄Π°Π½Π½ΡΡ :
; ΠΠ°Π·Π²Π°Π½ΠΈΡ ΡΠ±ΡΠ°Π», ΡΠΌΠΎΡΡΠΈΡΠ΅ Π½Π° ΡΠΎΡΠΌΠ°Ρ ΠΈ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ
db 0x55 ; Π ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π»Π΅ΠΆΠΈΡ Π±Π°ΠΉΡ ΡΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ 0x55
db 'a',0x55 ; ΠΠΎΠΆΠ½ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Ρ, ΠΎΠ½ΠΈ Π±ΡΠ΄ΡΡ ΠΏΠ΅ΡΠ΅Π²Π΅Π΄Π΅Π½Ρ Π² ΠΊΠΎΠ΄Ρ ASCII
db 'hello',13,10,'$' ; ΠΠΎΠΆΠ½ΠΎ Π΄Π°ΠΆΠ΅ ΡΡΡΠΎΡΠΊΠΈ
dw 0x1234 ; ΠΡΡΠ³ΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± Π·Π°ΠΏΠΈΡΠ°ΡΡ 0x34 0x12
dw 'a' ; 0x61 - ΠΊΠΎΠ΄ ΡΠΈΠΌΠ²ΠΎΠ»Π° ASCII Π² 16-Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅
dw 'ab' ; 0x61 0x62 - 2 ΠΊΠΎΠ΄Π° ΡΠΈΠΌΠ²ΠΎΠ»Π°
dw 'abc' ; 0x61 0x62 0x63 0x00 - Π Π²ΠΎΡ ΡΠ°ΠΊ Π±ΡΠ΄Π΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΡΡΠΎΠΊΠ°
dd 1.234567e20 ; Π ΠΌΠΎΠΆΠ½ΠΎ ΡΠΈΡΠ»ΠΎ Ρ ΠΏΠ»Π°Π²Π°ΡΡΠ΅ΠΉ ΡΠΎΡΠΊΠΎΠΉ
dq 0x123456789abcdef0 ; ΠΠΎΡΡΠΌΠΈΠ±Π°ΠΉΡΠΎΠ²Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ
dq 1.234567e20 ; double-precision ΡΠΈΡΠ»ΠΎ Ρ ΠΏΠ»Π°Π²Π°ΡΡΠ΅ΠΉ ΡΠΎΡΠΊΠΎΠΉ
dt 1.234567e20 ; extended-precision ΡΠΈΡΠ»ΠΎ Ρ ΠΏΠ»Π°Π²Π°ΡΡΠ΅ΠΉ ΡΠΎΡΠΊΠΎΠΉ
-
ΠΡΡΠ΅ΠΌΠ±Π»Π΅Ρ ΡΡΠΎ Π½Π΅ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΡΠ·ΡΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ! Π£ Π²Π°Ρ Π½Π΅Ρ ΡΠΈΠΏΠΎΠ² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π±ΡΠ΄ΡΡ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡ ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΈΠΌ Π·Π°Ρ ΠΎΡΠ΅ΡΡΡ!
-
ΠΠΎΠ³Π΄Π° Π²Ρ ΡΠΎΠ±ΠΈΡΠ°Π΅ΡΠ΅ΡΡ ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π² ΡΠ΅Π³ΠΈΡΡΡ - ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅, ΡΡΠΎ ΠΎΠ½Π° Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°, Π²ΠΎΡ Π²Π°ΠΌ ΠΊΡΠ°ΡΠΈΠ²Π°Ρ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠ°
-
ΠΠ΅ ΠΏΡΡΠ°ΠΉΡΠ΅ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΡ ΠΈ ΡΠ΅Π³ΠΈΡΡΡΡ Π΄Π»Ρ ΡΠΈΡΠ΅Π» Ρ ΠΏΠ»Π°Π²Π°ΡΡΠ΅ΠΉ ΡΠΎΡΠΊΠΎΠΉ, Π΄ΠΎ Π»Π°Π±ΠΎΡΠ°ΡΠΎΡΠ½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ #3 Π²Ρ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΡΠΎΠ»ΠΊΠ½ΡΡΡΡΡ Ρ Π½ΠΈΠΌΠΈ
-
ΠΠ½ΡΡΡΡΠΊΡΠΈΠΈ, ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠ΅ Π½Π°ΠΏΡΡΠΌΡΡ Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΌΠΈ ΠΊΡΠ°ΠΉΠ½Π΅ ΡΠ΅Π΄ΠΊΠΈ, ΠΎΠ±ΡΡΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°ΡΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠ΅ ΡΠ΅Π³ΠΈΡΡΡΡ, Π° Π·Π°ΡΠ΅ΠΌ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Ρ Π½ΠΈΠΌΠΈ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°, ΠΊΠΎΡΠΎΡΡΡ Π²Ρ Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΠΈ Π±ΡΠ΄Π΅ΡΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π½Π° ΡΠ²ΠΎΠ΅ΠΉ ΠΌΠ°ΡΠΈΠ½Π΅, Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π² Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠΉ ΠΈΠ»ΠΈ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ ΠΏΠ°ΠΌΡΡΠΈ. ΠΡΠΎ Π½Π΅ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΡΡΠΎ ΠΈ Π½Π°ΡΡΠΎΡΡΠ°Ρ ΠΏΠ°ΠΌΡΡΡ ΠΌΠ°ΡΠΈΠ½Ρ!
Π ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠΊΠ΅ Π½Π΅ ΡΠΌΠ΅ΡΡΠΈΡΡ Π²ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΠ°ΠΌΡΡΠΈ Π² Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ΅
Π ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠΊΠ΅ Π½Π΅ ΡΠΌΠ΅ΡΡΠΈΡΡ Π²ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΠΏΠ°ΠΌΡΡΠΈ Π² Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ΅, Π΅ΡΠ»ΠΈ Π²Π°ΠΌ ΡΡΠΎ-ΡΠΎ Π½Π΅ΠΏΠΎΠ½ΡΡΠ½ΠΎ, ΡΠΎ ΡΠΏΡΠΎΡΠΈΡΠ΅ Ρ ΠΏΡΠ΅ΠΏΠΎΠ΄Π°Π²Π°ΡΠ΅Π»Ρ / ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΠΏΠΎΠ³ΡΠ³Π»ΠΈΡΡ ΠΈΠ»ΠΈ ΠΏΠΎΠ΄Π΅Π±Π°ΠΆΠΈΡΡ ΡΠ²ΠΎΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΠΎΠΆΠ΅ΡΠ΅ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΡΡΠΎΡΠΈΠ°Π»Ρ, Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·ΠΈΡΡΡΡΠΈΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ, Π²ΡΠΎΠ΄Π΅ ΡΠ°ΠΊΠΎΠ³ΠΎ, ΡΡΠΎ ΡΠΈΠ»ΡΠ½ΠΎ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ Π² ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠΈ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ ΡΡΡΠΊΠ° ΠΈ ΠΏΠ°ΠΌΡΡΠΈ.
Π Nasm ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎ Π»Π΅ΠΆΠΈΡ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ Π² ΠΏΠ°ΠΌΡΡΠΈ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠ²Π°Π΄ΡΠ°ΡΠ½ΡΡ
ΡΠΊΠΎΠ±ΠΎΠΊ - [memory_address]
. ΠΡΠΏΠΎΠΌΠ½ΠΈΡΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ ΠΈΠ· C ΠΈ C++, ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½Π°
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
[rbp] ; ΠΠ±ΡΠ°ΡΠΈΠ»ΠΈΡΡ ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π»Π΅ΠΆΠΈΡ Π² rbp
[rbx - 8] ; ΠΠ±ΡΠ°ΡΠΈΠ»ΠΈΡΡ ΠΊ Π°Π΄ΡΠ΅ΡΡ rbx, ΡΠΌΠ΅ΡΡΠ½Π½ΠΎΠΌΡ Π½Π° 8 Π½Π°Π·Π°Π΄
// C
int some_value = 123;
int *rbp = &some_value;
// ΠΡΠ»ΠΈ ΠΌΡ ΡΠ°Π·ΡΠΌΠ΅Π½ΡΠ΅ΠΌ rbp, ΡΠΎ ΡΡΠΎ Π±ΡΠ΄Π΅Ρ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ [rbp]
ΠΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π·Π°Π²ΠΈΡΡΡ ΠΎΡ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ° ΠΈ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ° (GNU, NASM, FASM ΠΈ ΡΠ΄). ΠΠ΄Π½Π°ΠΊΠΎ Π΅ΡΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠ΅ Ρ ΠΊΠΎΡΠΎΡΡΠΌΠΈ Π½Π°ΠΌ ΠΈ ΠΏΡΠ΅Π΄ΡΡΠΎΠΈΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ. ΠΡΠ»ΠΈ Π²Ρ ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΠΈΡΡ Ρ ΡΠ΅ΠΌ-ΡΠΎ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΌ Π΄Π»Ρ Π²Π°ΡΠ΅ΠΉ ΠΌΠ°ΡΠΈΠ½Ρ, ΡΠΎ ΡΡΠΎ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΡΡΠ°Π½Π½ΠΎ, ΡΠΊΠΎΡΠ΅Π΅ Π²ΡΠ΅Π³ΠΎ Π·Π°Π΄Π°ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΏΡΠΎΡΠ΅.
ΠΠΎΡ ΡΡΠΈΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ Π²Π°ΠΌ Ρ 99% Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡΡ Ρ Π²Π°ΡΠΈΡ Π΄Π»Ρ ΠΏΠ΅ΡΠ²ΠΎΠΉ Π»Π°Π±ΠΎΡΠ°ΡΠΎΡΠ½ΠΎΠΉ:
ΠΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ ΠΏΠ°ΠΌΡΡΡΡ
mov x, y ; ΠΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°Π΅Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ y Π² x, ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ x = y
lea x, y ; mov Π΄Π»Ρ MacOS, ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅ Π»ΡΡΡΠ΅ ΠΏΠΎΠ³ΡΠ³Π»ΠΈΡΡ
ΠΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠ΅
and x, y ; ΠΠ°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π² x ΠΏΠΎΠ±ΠΈΡΠΎΠ²ΠΎΠ΅ x & y
or x, y ; ΠΠ°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π² x ΠΏΠΎΠ±ΠΈΡΠΎΠ²ΠΎΠ΅ x | y
xor x, y ; ΠΠ°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π² x XOR(x, y)
ΠΡΠΈΡΠΌΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅
add x, y ; ΠΠ°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π² x sum(x, y)
sub x, y ; ΠΠ°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π² x <- x - y
inc x ; Π£Π²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅Ρ x Π½Π° 1 == x++
dec x ; Π£ΠΌΠ΅Π½ΡΡΠ°Π΅Ρ x Π½Π° 1 == x--
ΠΡΠΎΠ±ΡΠ΅
syscall n ; Π‘ΠΎΠ²Π΅ΡΡΠ°Π΅Ρ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² n
jmp label ; Π‘ΠΎΠ²Π΅ΡΡΠ°Π΅Ρ ΠΏΡΡΠΆΠΎΠΊ Π½Π° ΠΌΠ΅ΡΠΊΡ label
ΠΠ°ΠΌ ΡΠ°ΡΡΠΎ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π²Π΅ΡΠ²Π»Π΅Π½ΠΈΠ΅ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅. ΠΠΎ Π²ΡΠ΅Ρ
Π²ΡΡΠΎΠΊΠΎΡΡΠΎΠ²Π½Π΅Π²ΡΡ
ΡΠ·ΡΠΊΠ°Ρ
Π΅ΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ if-else
. ΠΠΎ Π²ΠΎΡ Π² Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ΅ Π²ΡΡ Ρ
ΠΈΡΡΠ΅Π΅.
Π‘ΡΡΠ΅ΡΡΠ²ΡΡΡ ΠΎΡΠΎΠ±ΡΠ΅ "ΡΠ»Π°Π³ΠΎΠ²ΡΠ΅" ΡΠ΅Π³ΠΈΡΡΡΡ, Π²ΠΎΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ΡΠΉ ΡΡΡΠΎΡΠΈΠ°Π». ΠΠ° ΠΏΡΠ°ΠΊΡΠΈΠΊΠ΅ Π΄Π»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΎΡΡΡΠ΅ΡΡΠ²ΠΈΡΡ Π²Π΅ΡΠ²Π»Π΅Π½ΠΈΠ΅ Π² Π°ΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ ΠΌΠ΅ΡΠΊΠΈ ΠΈ ΠΏΡΡΠΆΠΊΠΈ.
ΠΠ΅ΡΠΊΠΈ - ΠΎΡΠΌΠ΅ΡΠΊΠΈ Π² ΠΊΠΎΠ΄Π΅, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ jmp
ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ°ΡΡΡΡ ΠΏΠΎ Π½ΠΈΠΌ, ΡΠ°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΡΠΎΠ·Π΄Π°Π²Π°Ρ Π²Π΅ΡΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΡΠΈΠΊΠ»Ρ.
.loop: ; ΠΠ΅ΡΠΊΠ° Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ".loop"
jmp .loop ; ΠΡΡΠΆΠΎΠΊ Π½Π° ΡΡΡ ΠΌΠ΅ΡΠΊΡ, ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π±Π΅ΡΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ ΡΠΈΠΊΠ»
ΠΡΡΠΆΠΊΠΈ - Π²ΠΈΠ΄ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΉ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ ΡΠΏΡΠ°Π²Π»ΡΡΡ Ρ ΠΎΠ΄ΠΎΠΌ ΠΈΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΠΎΠΆΠ½ΠΎ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΡ ΠΈΡ Π½Π°:
- Conditional - ΠΏΡΡΠΆΠΊΠΈ Ρ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ΠΌ - ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»Ρ Π²Π΅ΡΠ²Π»Π΅Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ
- Unconditional - Π±Π΅Π·ΡΡΠ»ΠΎΠ²Π½ΡΠ΅ - ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Ρ ΠΎΠ΄ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Π±Π΅Π·ΡΡΠ»ΠΎΠ²Π½ΠΎ
Unconditional jump - ΠΎΠ½ ΠΆΠ΅ jmp
ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ-ΡΠΎ Π²ΡΠΎΠ΄Π΅ Π²ΡΡ
ΠΎΠ΄Π° ΠΈΠ· ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΡΠ°Π·ΠΌΠ΅ΡΡΠΈΠ»ΠΈ ΠΏΠΎΠ΄ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ ΠΌΠ΅ΡΠΊΠΎΠΉ
// ΠΡΡ ΠΊΠ°ΠΊΠΎΠΉ-ΡΠΎ ΠΊΠΎΠ΄
jmp .exit ; ΠΠ°ΠΊΠΎΠ½ΡΠΈΠ»ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈ Π·Π°Π²Π΅ΡΡΠ°Π΅ΠΌ Π΅Ρ, Π½Π΅ Π΄ΠΎΠΉΠ΄Ρ Π΄ΠΎ Π²ΡΠΎΡΠΎΠ³ΠΎ jmp
// ΠΠ½ΠΎΠ³ΠΎ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-ΡΠΎ ΠΊΠΎΠ΄Π°, Π΄ΠΎ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΌΠΎΠΆΠ΅Ρ Π½Π΅ Π΄ΠΎΠΉΡΠΈ
jmp .exit ; ΠΠ°ΠΊΠΎΠ½ΡΠΈΠ»ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈ Π·Π°Π²Π΅ΡΡΠ°Π΅ΠΌ Π΅Ρ
.exit
mov rdi, 0
syscall
Conditional jump - ΠΎΡΠΎΠ±ΡΠΉ Π²ΠΈΠ΄ jmp
, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΌΠΎΡΡΠΈΡ Π½Π° ΡΠ»Π°Π³ΠΎΠ²ΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΡ
ΠΠ½ΡΡΡΡΠΊΡΠΈΡ - Π‘ΠΌΡΡΠ» - Π€Π»Π°Π³ΠΎΠ²ΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΡ, Π½Π° ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ½Π° ΡΠΌΠΎΡΡΠΈΡ
JE/JZ - a == b || a - b == 0 - ZF
JNE/JNZ - a != b || a - b != 0 - ZF
JG/JNLE - a > b - OF, SF, ZF
JGE/JNL - a >= b - OF, SF
JL/JNGE - a < b - OF, SF
JLE/JNG - a <= b - OF, SF, ZF
ΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΎΡΠ΄Π΅Π±Π°ΠΆΠΈΡΡ ΡΡΠΎ-ΡΠΎ Π½Π° ΠΡΡΠ΅ΠΌΠ±Π»Π΅ΡΠ΅ Π²Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ ΡΡΠ΅Π΄Π° Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Ρ Π΄Π΅Π±Π°Π³Π³Π΅ΡΠΎΠΌ ΠΈΠ»ΠΈ ΠΊΠΎΠ½ΡΠΎΠ»ΡΠ½ΡΠΉ Π΄Π΅Π±Π±Π°Π³Π΅Ρ, ΠΊΠ°ΠΊ ΡΠΊΠ°Π·Π°Π½ΠΎ Π²ΡΡΠ΅. Π’Π°ΠΊΠΆΠ΅ ΡΡΠΎΠ±Ρ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π±ΠΈΠ½Π°ΡΠ½ΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΠΏΡΠΎΡΠ΅ Π²ΡΠ΅Π³ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ objdump
.
ΠΠ°ΠΊ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π΅Π±Π°Π³Π³Π΅ΡΠΎΠΌ:
- Π±ΡΡΡΡΡΠΉ Π³Π°ΠΉΠ΄
- ΡΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π½ΡΠΉ Π³Π°ΠΉΠ΄
- Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π½ΡΠΉ ΠΈ ΡΠ»ΠΎΠΆΠ½ΡΠΉ Π³Π°ΠΉΠ΄
Π Π΅ΡΠ»ΠΈ Π΅ΡΡ ΠΏΡΠΎΡΠ΅?
- Π‘ΠΎΠ±Π΅ΡΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Ρ ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ΅ΠΉ, Π² Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠΎΠ² ΡΠ»Π°Π³
-g
ΠΠ΄Π΅ `-g -F DWARF` - ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΎΡΠ»Π°Π΄ΠΎΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΈ Π΅Ρ ΡΠΎΡΠΌΠ°Ρ - [DWARF](https://dwarfstd.org).
- ΠΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ Π·Π°ΠΏΡΡΡΠΈΡΡ Π΄Π΅Π±Π°Π³Π³Π΅Ρ Π² ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Π²Π°ΡΠ΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°:
gdb exec.out
- x86lldb task_exec
- M1 ΠΠ°Π»Π΅Π΅ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΡΡΠ°Π²ΠΈΡΡbreakpoin
, ΡΠΎ Π΅ΡΡΡ ΡΠΎΡΠΊΡ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π° Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ΅Π³ΠΈΡΡΡΠΎΠ², ΡΡΡΠΊ Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅. Π‘Π΄Π΅Π»Π°ΡΡ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉb
, ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°ΡΡ Π²ΠΎΡ ΡΠ°ΠΊb // ΠΏΠΎΡΡΠ°Π²ΠΈΡΡ ΡΠΎΡΠΊΡ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π½Π° ΡΠ΅ΠΊΡΡΠ΅ΠΉ Π»ΠΈΠ½ΠΈΠΈ b main // ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π½Π° Π²Ρ ΠΎΠ΄Π΅ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ b task.asm:10 // ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π½Π° 10 Π»ΠΈΠ½ΠΈΠΈ b fn // ΠΏΠΎΡΡΠ°Π²ΠΈΡΡ ΡΠΎΡΠΊΡ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π½Π° ΡΡΠ½ΠΊΡΠΈΠΈ(ΠΌΠ΅ΡΠΊΠ΅) fn
- Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ Π΄Π΅Π±Π°Π³Π³Π΅ΡΠ° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΠΊΡΡΡ Π²ΡΠ΅Π³ΠΎ, Π½ΠΎ Π²ΠΎΡ ΠΏΠ°ΡΠΊΠ° ΠΏΠΎΠ»Π΅Π·Π½ΡΡ
Π΄Π»Ρ Π»Π°Π±ΠΎΡΠ°ΡΠΎΡΠ½ΡΡ
ΡΠ°Π±ΠΎΡ ΠΊΠΎΠΌΠΌΠ°Π½Π΄
(gdb) r // Π±Π΅ΠΆΠ°ΡΡ Π΄ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΠΎΡΠΊΠΈ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ (gdb) s // step into == ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΈΠ»ΠΈ Π·Π°ΠΉΡΠΈ Π²Π½ΡΡΡΡ (gdb) n // step over == ΠΏΡΠΎΡΡΠΎ ΠΈΡΠΏΠΎΠ»Π½ΠΈΡΡ (gdb) finish
(gdb) info registers // Π²ΡΠ΅ ΠΊΡΠΎΠΌΠ΅ Π²Π΅ΠΊΡΠΎΡΠ½ΡΡ ΠΈ Ρ ΠΏΠ»Π°Π²Π°ΡΡΠ΅ΠΉ ΡΠΎΡΠΊΠΎΠΉ (gdb) info all-registers // Π²ΠΎΠΎΠ±ΡΠ΅ Π²ΡΠ΅ ΡΠ΅Π³ΠΈΡΡΡΡ (gdb) info registers {reg_name} // ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ ΡΠ΅Π³ΠΈΡΡΡΠ°