Skip to content

Olex1313/cs-cn

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

17 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Π£Ρ‡Π΅Π±Π½ΠΎ-мСтодичСскоС пособиС ΠΏΠΎ дисциплинС Β«Π’Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ систСмы ΠΈ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹Π΅ сСти»

  • Данная ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΡ‡ΠΊΠ° ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для студСнтов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… ОБ Linux/MacOS
  • НС являСтся ΠΈΡΡ‡Π΅Ρ€ΠΏΡ‹Π²Π°ΡŽΡ‰ΠΈΠΌ руководством ΠΏΠΎ языку Assembler ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅ Π’Π‘
  • ЦСль ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΡ‡ΠΊΠΈ - Π΄Π°Ρ‚ΡŒ прСдставлСниС ΠΎΠ± ассСмблСрС ΠΈ Ρ‚ΠΎΠΌ ΠΊΠ°ΠΊ ΠΎΠ½ взаимодСйствуСт с ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠΌ
  • ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Π½Π° Unix-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ОБ, Π²Ρ‹ ΠΏΠΈΡˆΠΈΡ‚Π΅ Π½Π° nasm ΠΈ Π΄Π΅Π±Π°ΠΆΠΈΡ‚Π΅ Π² gdb

ВСорСтичСскиС свСдСния

Π‘Π°ΠΌΡ‹ΠΉ Π½ΠΈΠ·ΠΊΠΈΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ программирования – ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ язык (ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… ΠΊΠΎΠ΄ΠΎΠ² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ²). ΠŸΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ Π² Π²ΠΈΠ΄Π΅ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… чисСл ΠΎΡ‡Π΅Π½ΡŒ слоТно, поэтому Π²ΠΎ всСх ΠΌΠ°ΡˆΠΈΠ½Π°Ρ… прСдусмотрСн язык ассСмблСра – символичСскоС прСдставлСниС Π½Π°Π±ΠΎΡ€Π° ΠΊΠΎΠΌΠ°Π½Π΄, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ числа Π·Π°ΠΌΠ΅Π½Π΅Π½Ρ‹ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ (ΠΌΠ½Π΅ΠΌΠΎΠ½ΠΈΠΊΠ°ΠΌΠΈ, Π½Π°ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ ADD, SUB ΠΈ MUL) ΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ² (ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ячССк памяти – VAR, string1, рСгистров – AX, DL, адрСсов – ΠΌΠ΅Ρ‚ΠΎΠΊ).

ΠŸΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅

ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΠΊΠΎΠ΄Ρƒ

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π° ассСмблСрС Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ: Если здСсь Π½Π΅Ρ‚ вашСй ОБ, Ρ‚ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΈΠ±ΡŒΡŽΡ‚Π½ΠΈΡ‚Π΅ Π² ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ, ΠΎΠ±Π»Π΅Π³Ρ‡ΠΈΡ‚Π΅ Тизнь студСнтов

  • компилятор для nasm
    • MacOS - brew install nasm
    • Debian\Ubuntu\Mint - sudo apt install nasm
    • Arch - sudo pacman -S nasm
  • Π΄Π΅Π±Π°Π³Π³Π΅Ρ€
    • MacOS M1 - придётся Π²Π·ΡΡ‚ΡŒ lldb brew install lldb
    • MacOs - brew install gdb
    • Debian\Ubuntu\Mint - sudo apt install gdb
    • Arch - `sudo pacman -S gdb'
  • objdump - ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ бинаря
    • MacOS brew install objdump - Ссли Ρƒ вас Π΅Π³ΠΎ ΡƒΠΆΠ΅ Π½Π΅Ρ‚
    • Debian\Ubuntu\Mint - sudo apt install objdump
    • Arch - sudo pacman -S objdump
  • Π»ΠΈΠ½ΠΊΠ΅Ρ€ - скорСС всСго Ρƒ вас Π΅ΡΡ‚ΡŒ ld, Ссли Π²Π΄Ρ€ΡƒΠ³ Π½Π΅Ρ‚, Ρ‚ΠΎ установитС Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°ΠΊΠ΅Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€

Как Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Hello world

MacOS

; ----------------------------------------------------------------------------------------.
; 	Запуск: 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 - ΠΊΠΎΠ΄ символа ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки

Linux

; ----------------------------------------------------------------------------------------.
; 	Запуск: 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

ΠŸΡ€ΠΎ Π»Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€Π½ΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ #1

Задания ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΡ‡ΠΊΠ΅, Π² Π½Π΅ΠΉ ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‚Π΅ΠΎΡ€ΠΈΡŽ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π³Π»ΡƒΠ±ΠΆΠ΅, Ρ‡Π΅ΠΌ описано здСсь.

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ #1 Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ

  • ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΠΊ сказано Π²Ρ‹ΡˆΠ΅
    • Π‘ΠΊΠΎΠΏΠΈΡ€ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ с "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.

Как ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΄Π΅Π±Π°Π³Π³Π΅Ρ€ΠΎΠΌ:

А Ссли Π΅Ρ‰Ρ‘ ΠΏΡ€ΠΎΡ‰Π΅?

  1. Π‘ΠΎΠ±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ с ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ, Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ компиляторов Ρ„Π»Π°Π³ -g
    Π“Π΄Π΅  `-g -F DWARF` - ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΈ Π΅Ρ‘ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ - [DWARF](https://dwarfstd.org).
    
  2. Π’Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π΄Π΅Π±Π°Π³Π³Π΅Ρ€ Π² ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅ с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ вашСго исполняСмого Ρ„Π°ΠΉΠ»Π°: gdb exec.out - x86 lldb task_exec - M1 Π”Π°Π»Π΅Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ breakpoin, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΡƒ остановки ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° значСния рСгистров, стэк Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ это ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ b, ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ
    b // ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΡƒ остановки Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π»ΠΈΠ½ΠΈΠΈ
    b main // ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π½Π° Π²Ρ…ΠΎΠ΄Π΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ
    b task.asm:10 // ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π½Π° 10 Π»ΠΈΠ½ΠΈΠΈ
    b fn // ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΠΎΡ‡ΠΊΡƒ остановки Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ(ΠΌΠ΅Ρ‚ΠΊΠ΅) fn
    
  3. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄ Π΄Π΅Π±Π°Π³Π³Π΅Ρ€Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΡƒΡ‡Ρƒ всСго, Π½ΠΎ Π²ΠΎΡ‚ ΠΏΠ°Ρ‡ΠΊΠ° ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… для Π»Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€Π½Ρ‹Ρ… Ρ€Π°Π±ΠΎΡ‚ ΠΊΠΎΠΌΠΌΠ°Π½Π΄

    Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ

    (gdb) r // Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π΄ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΈ остановки
    (gdb) s // step into == ΠΈΡΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ Π·Π°ΠΉΡ‚ΠΈ Π²Π½ΡƒΡ‚Ρ€ΡŒ
    (gdb) n // step over == просто ΠΈΡΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ
    (gdb) finish
    

    Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ ΠΎ памяти

    (gdb) info registers // всС ΠΊΡ€ΠΎΠΌΠ΅ Π²Π΅ΠΊΡ‚ΠΎΡ€Π½Ρ‹Ρ… ΠΈ с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ
    (gdb) info all-registers // Π²ΠΎΠΎΠ±Ρ‰Π΅ всС рСгистры
    (gdb) info registers {reg_name} // ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ рСгистра
    

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •