Push ассСмблСр: Π”Π½Π΅Π²Π½ΠΈΠΊΠΈ Ρ‡Π°ΠΉΠ½ΠΈΠΊΠ°

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

Π”Π½Π΅Π²Π½ΠΈΠΊΠΈ Ρ‡Π°ΠΉΠ½ΠΈΠΊΠ°

Π”Π½Π΅Π²Π½ΠΈΠΊΠΈ Ρ‡Π°ΠΉΠ½ΠΈΠΊΠ°

Π‘Ρ‚Π΅ΠΊ.
Π’ΠΎΡΡŒΠΌΠΎΠΉ дСнь

Π‘Ρ‚Π΅ΠΊ — ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ выдСлСнная ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти для ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΈΠ»ΠΈ сохранСния Π΄Π°Π½Π½Ρ‹Ρ….

ΠœΡ‹ всё врСмя наблюдаСм Ρ‚Π°ΠΊΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ записи (prax03.com):

00000000: B80300     mov  ax,00003
00000003: CD10       int  010
00000005: B402       mov  ah,002
00000007: 8B167501   mov  dx,[0175]
0000000B: CD10       int  010
0000000D: FEC6       inc  dh
0000000F: 80C203     add  dl,003
00000012: 89167501   mov  [0175],dx
00000016: B409       mov  ah,009
00000018: BA5001     mov  dx,00150
0000001B: CD21       int  021
0000001D: 803E760119 cmp  b,[0176],019
00000022: 75E1       jne  000000005
00000024: B410       mov  ah,010
00000026: CD16       int  016
00000028: CD20       int  020

Π― имСю Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ адрСса растут Π²Π½ΠΈΠ·. 0 — Π²Ρ‹ΡˆΠ΅ всСх (ΠΊΠ°ΠΊ пСрвая строка Π² ΠΊΠ½ΠΈΠ³Π΅), 28 — ниТняя строчка.

Π’Π°ΠΊ Π²ΠΎΡ‚ Π² этой систСмС отобраТСния стСк растёт Π²Π²Π΅Ρ€Ρ…

.

Π”Π½ΠΎ стСка находится ΠΏΠΎ самому ΡΡ‚Π°Ρ€ΡˆΠ΅ΠΌΡƒ адрСсу, Π° Π²Π΅Ρ€ΡˆΠΈΠ½Π° — ΠΏΠΎ самому ΠΌΠ»Π°Π΄ΡˆΠ΅ΠΌΡƒ адрСсу.

На Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ рСгистр-ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ESP — это Π΅Π³ΠΎ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Stack Pointer — ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ стСка).

Π’ΠΈΠ΄ΠΈΡ‚Π΅, prax03 Π² строкС 12h сохраняСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ рСгистра DX, Π° Π² строкС 07 ΠΏΡ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π΅ Ρ†ΠΈΠΊΠ»Π° ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ восстанавливаСт это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ стСк ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎ, Π½ΠΎ Ссли Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π· ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ рСгистры, Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ Π΄Π΅Π»Π°Ρ‚ΡŒ это Ρ‡Π΅Ρ€Π΅Π· стСк. Для записи Π² стСк Π΅ΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Π° PUSH.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

push EDX    ; Ρ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒ Π² стСк (ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π² стСк)
...
pop  EDX    ; ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΈΠ· стСка Π² EDX (Π²Ρ‹Ρ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒ Π² EDX)

Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

push EDX    ; ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π² стСк
...
pop  EAX    ; ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΈΠ· стСка Π² EAX (Π² EAX Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ Π² EDX)

ΠŸΡ€ΠΈΡ‡Ρ‘ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² стСк ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ.

push EAX    ; ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π² стСк
push EBX    ; ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π² стСк
push ECX    ; ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π² стСк
push EDX    ; ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π² стСк
push 01234h ; ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π² стСк
. ..
pop  ESI    ; ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΈΠ· стСка (Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 01234h Π±Ρ‹Π»ΠΎ свСрху, Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΎΠ½ΠΎ ΠΈ Π²Ρ‹ΠΉΠ΄Π΅Ρ‚)
pop  EDX    ; ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΈΠ· стСка Π² EDX
pop  ECX    ; ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΈΠ· стСка Π² ECX
pop  EBX    ; ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΈΠ· стСка Π² EBX
pop  EAX    ; ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ ΠΈΠ· стСка Π² EAX

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ значСния ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡŽΡ‚ΡΡ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС. Π’Π΅Ρ€ΡˆΠΈΠ½Π° Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠ΅Ρ€Π²ΠΎΠΉ, Π° Π΄Π½ΠΎ послСдним. На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅, слава Π‘ΠΎΠ³Ρƒ, ΠΌΡƒΠ΄Ρ€ΠΈΡ‚ΡŒ со стСком придётся ΠΌΠ°Π»ΠΎ, Π½ΠΎ Ссли Π²Ρ‹ Π½Π΅ ΡƒΠ»ΠΎΠ²ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ, Ρ‚ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎΠ²Π°Ρ‚ΠΎ.

ΠœΠ°Ρ‚Ρ€ΠΎΡ! Ну-ΠΊΠ° ΠΈΠ΄ΠΈ сюда… Π§Ρ‚ΠΎ Ρ‚ΡƒΡ‚ Ρƒ тСбя Π² ΠΊΠΎΡ€Π·ΠΈΠ½ΠΊΠ΅? О, Π·Π°Π²Ρ‚Ρ€Π°ΠΊ! Π’Π°ΠΊ, свСрху яйца, ΠΏΠΎΠ΄Π΅Ρ€ΠΆΠΈ, Π±ΡƒΡ‚Π΅Ρ€Π±Ρ€ΠΎΠ΄, Π±ΡƒΡ‚Ρ‹Π»ΠΊΠ°… ΠΏΠΎΠ΄ΡƒΡˆΠΊΠ°? А Π·Π°Ρ‡Π΅ΠΌ Ρ‚Π΅Π±Π΅ ΠΏΠΎΠ΄ΡƒΡˆΠΊΠ°? Π’Ρ‹ Ρ‡Ρ‚ΠΎ, Π½Π° Π²Π°Ρ…Ρ‚Π΅ ΡΠΏΠ°Ρ‚ΡŒ собрался! А Π½Ρƒ, ΠΎΡ‚Π΄Π°ΠΉ сюда ΠΊΠΎΡ€Π·ΠΈΠ½Ρƒ. Π―ΠΉΡ†Π°-Ρ‚ΠΎ сырыС, Ρ‡Ρ‘Ρ€Ρ‚ тСбя Π΄Π΅Ρ€ΠΈ! И Π±ΡƒΡ‚Π΅Ρ€Π±Ρ€ΠΎΠ΄Ρ‹ ΠΈΠ·ΠΌΠ°Π·Π°Π», ΠΈ ΠΏΠΎΠ΄ΡƒΡˆΠΊΡƒ испортил. Какого ΡˆΠ»Π΅ΠΉΡ„Π° Ρ‚Ρ‹ ΠΈΡ… Π½Π΅ сварил? Иди ΠΎΡ‚ΡΡŽΠ΄Π°, сам знаю, Ρ‡Ρ‚ΠΎ яйца свСрху ΠΊΠ»Π°Π΄ΡƒΡ‚.

ΠŸΠ°ΠΌΡΡ‚ΡŒ ΠΏΠΎΠ΄ стСк выдСляСт Windows.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ осмыслСнно вСрнёмся ΠΊ нашСй ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΠΎΠ΄ Ρ„ΠΎΡ€Ρ‚ΠΎΡ‡ΠΊΠΈ:


АдрСса   Π±Π°ΠΉΡ‚Ρ‹         ΠΈΠΌΠ΅Π½Π° ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹                          ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ
00401000 6A 00         push  0                                ; /Style = MB_OK|MB_APPLMODAL
00401002 68 00304000   push  00403000                         ; |Title = "It's the first your program for Win32"
00401007 68 21304000   push  00403021                         ; |Text = "Assembler language for Windows is a fable!"
0040100C 6A 00         push  0                                ; |hOwner = NULL
0040100E E8 07000000   call &lt jmp.
&user32.MessageBoxA&gt ; \MessageBoxA 00401013 6A 00 push 0 ; /ExitCode = 0 00401015 E8 06000000 call &lt jmp.&kernel32.ExitProcess&gt ; \ExitProcess 0040101A FF25 08204000 jmp dword ptr ds:[&lt user32.MessageBo&gt ; user32.MessageBoxA 00401020 FF25 00204000 jmp dword ptr ds:[&lt kernel32.ExitPro&gt ; kernel32.ExitProcess

Команда Push ΠΊΠ»Π°Π΄Ρ‘Ρ‚ Π² стСк ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π² Π½Π΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Оно ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Π²Π° Π±Π°ΠΉΡ‚Π° ΠΈΠ»ΠΈ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅. Π’ 32-Π±ΠΈΡ‚Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… это Π±ΡƒΠ΄Π΅Ρ‚ 32-Π±ΠΈΡ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ dword (4 Π±Π°ΠΉΡ‚Π°). Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ для нас Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² стСкС 4 Π±Π°ΠΉΡ‚Π°.

Push 0        ; отправляСт Π² стСк Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 00000000
Push 00403000 ; отправляСт Π² стСк Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 00403000
Push 00403021 ; отправляСт Π² стСк Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 00403021
Push 0        ; отправляСт Π² стСк Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 00000000

Π­Ρ‚ΠΎ, СстСствСнно, Ρ†Π΅Π»ΠΎΠ΅ ΠΈ для «ΡƒΠ΄ΠΎΠ±ΡΡ‚Π²Π°» чтСния, младший Π±Π°ΠΉΡ‚ ΡƒΠΆΠ΅ справа, ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ слСва.

ΠœΠ°Ρ‚Ρ€ΠΎΡ, Ρ‚Ρ‹ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΠ», Ρ‡Ρ‚ΠΎ Π½Π° Π½Π°ΡˆΠΈΡ… Ρ‡Π΅Ρ€Ρ‚Π΅ΠΆΠ°Ρ… Π² Ρ†Π΅Π»ΠΎΠΉ Π±ΠΎΠ΅Π²ΠΎΠΉ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅ Π‘ΠΈΠ½Π°Ρ€Π½ΠΈΠΊΠΎΠ² Π±Π°ΠΉΡ‚Ρ‹ строятся ΠΏΠΎ ΡΡ‚Π°Ρ€ΡˆΠΈΠ½ΡΡ‚Π²Ρƒ слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ? ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ младший — самый Π»Π΅Π²Ρ‹ΠΉ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ — самый ΠΏΡ€Π°Π²Ρ‹ΠΉ (Π½Π° Ρ„ΠΈΠ³ Ρ‚Π°ΠΊΠΈΠ΅ Ρ‡Π΅Ρ€Ρ‚Ρ‘ΠΆΠΈ :).
Π£ Π½ΠΈΡ… Ρ‚Π°ΠΌ Π² Π³Π»Π°Π²Π½ΠΎΠΌ ΡˆΡ‚Π°Π±Π΅ Π΅ΡΡ‚ΡŒ Π΅Ρ‰Ρ‘ Π·Π°ΠΏΡƒΡ‚ΠΊΠ° — стСк. Он Π² Ρ‡Π΅Ρ€Ρ‚Π΅ΠΆΠ°Ρ… ΠΈΠ΄Ρ‘Ρ‚ ΠΎΡ‚ Π΄Π½Π° Π½Π°Π²Π΅Ρ€Ρ…. Π¦Π΅Π»Ρ‹Π΅ (word ΠΈΠ»ΠΈ dword) Π² Π½Ρ‘ΠΌ ΡƒΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ Ρ‚Π°ΠΊ: ΠΎΡ‚ Π΄Π½Π° Π½Π°Π²Π΅Ρ€Ρ….

Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, стСк ΠΏΡ€ΠΎΡ‰Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π² высоту, Ρ‡Π΅ΠΌ Π² ΠΎΠ΄Π½Ρƒ строку. Π’ΠΎΡ‚ Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ Π² стСкС ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ строки 40100Eh Π² нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.

00000000
00403021
00403000
00000000
........

КаТдая строка здСсь — ΠΎΠ΄Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² стСкС. ΠŸΠΎΠ½ΡΡ‚ΠΈΠ΅ Π΄Π½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ наглядно ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚, ΠΊΠ°ΠΊ устроСн стСк.

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΡƒΠ΄Π°Π»ΠΈΠΌ ΠΈΠ· исходника эту строку:

	invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK

И впишСм вмСсто Π½Π΅Ρ‘ Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

  push 0AAAAAAAAh
  push 0BBBBBBBBh
  push 0CCCCCCCCh
  push 0DDDDDDDDh

  pop  EAX
  pop  ECX
  pop  EDX
  pop  EBX

Π‘ΠΎΠ±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π΅Ρ‰Ρ‘ Ρ€Π°Π·. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Π² Olly.

Π’ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΄Π΅Π»Π°Π»ΠΈ Π² ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ΅ CodeView клавишСй F10, называСтся ΠΏΠΎ-ΡƒΠΌΠ½ΠΎΠΌΡƒ:
пошаговая трассировка исполняСмого ΠΊΠΎΠ΄Π° Π±Π΅Π· Π·Π°Ρ…ΠΎΠ΄Π° Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹. Π’ Olly Ρ‚Π°ΠΊΠΎΠΉ «ΡˆΠ°Π³» выполняСт клавиша F8.


АдрСса   Π‘Π°ΠΉΡ‚Ρ‹        ИмСна ΠžΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹
00401000 68 AAAAAAAA  push AAAAAAAA
00401005 68 BBBBBBBB  push BBBBBBBB
0040100A 68 CCCCCCCC  push CCCCCCCC
0040100F 68 DDDDDDDD  push DDDDDDDD
00401014 58           pop  eax
00401015 59           pop  ecx
00401016 5A           pop  edx
00401017 5B           pop  ebx

Когда Π²Ρ‹ Π΄ΠΎΠΉΠ΄Ρ‘Ρ‚Π΅ Π΄ΠΎ строки 401014h (F8 Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ€Π°Π·Π°), стСк Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ:

0012FFB4  DDDDDDDD
0012FFB8  CCCCCCCC
0012FFBC  BBBBBBBB
0012FFC0  AAAAAAAA
...        ...

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π² ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ΅, ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ! НиТняя правая Ρ‡Π°ΡΡ‚ΡŒ.

Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Π»ΠΈ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ укладываСтся свСрху. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ, стСк растёт Π²Π²Π΅Ρ€Ρ…. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ, рСгистр ESP с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ Π½ΠΎΠ²Ρ‹ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ стСка ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ. И ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΈΠ· стСка ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ESP увСличиваСтся Π½Π° 4 (ΠΈΠ»ΠΈ Π½Π° 2 Π² 16-Π±ΠΈΡ‚Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…).

А Π΅Ρ‰Ρ‘ стСк Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ, ΠΈΠ½Π°Ρ‡Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ваши Π΄Π°Π½Π½Ρ‹Π΅ Π² стСкС ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ ΠΈΠ»ΠΈ просто большС Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ Π² ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ½Π° Π·Π°Π½ΠΈΠΌΠ°Π»Π° Ρ€Π°Π½ΡŒΡˆΠ΅ — это ΠΈ Π΅ΡΡ‚ΡŒ Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π½ΠΈΠ΅. Если Π²Ρ‹ Ρ‚Π°ΠΊ Π½Π΅ сдСлаСтС, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ.

Π‘Ρ‚Π΅ΠΊ, ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ, самоС слоТноС понятиС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΠ²ΠΎΠΈΡ‚ΡŒ для написания ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π½Π° АссСмблСрС. ЧСстно-чСстно, Ссли Π²Ρ‹ ΠΏΠΎΠΉΠΌΡ‘Ρ‚Π΅ это, Π·Π½Π°Ρ‡ΠΈΡ‚, Π²Ρ‹ Ρ‚ΠΎΡ‡Π½ΠΎ смоТСтС ΠΎΡΠ²ΠΎΠΈΡ‚ΡŒ всё ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π½ΡƒΠΆΠ½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°, помню, я Ρ‚Ρ€ΠΈ дня ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΠ» Π½Π° ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ стСка. Калашников ΠΎΠ±ΠΌΠ°Π½ΡƒΠ», сказал, Ρ‡Ρ‚ΠΎ это просто. Π’Π°ΠΊ ΠΈ Π±Ρ‹Π»ΠΎ, ΠΊΠΎΠ³Π΄Π° я Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использовал, Π° Π²ΠΎΡ‚ ΠΊΠΎΠ³Π΄Π° свои ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΊΠΈ стал ΠΏΠΈΡΠ°Ρ‚ΡŒ, стСк Π²Ρ‹Π·Π²Π°Π» наибольшиС затруднСния.

Π’Ρ€ΠΈ дня — Π΄ΡƒΠΌΠ°ΡŽ, это Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ для самого слоТного фокуса.

Π§Ρ‚ΠΎΠ± ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π² стСк, ΠΏΠΈΡˆΠΈΡ‚Π΅:

push Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ
Команда PUSH
ΠŸΡ€ΠΎΠΈΡΡ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ΠžΡ‚ Π°Π½Π³Π». слова push — Ρ‚ΠΎΠ»ΠΊΠ°Ρ‚ΡŒ
Π€ΠΎΡ€ΠΌΠ°Ρ‚push ΠΎΠΏΠ΅Ρ€Π°Π½Π΄
ДСйствиСВолкаСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² стСк
ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅Π•ΡΠ»ΠΈ Π½ΡƒΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒ Π² стСк всС 8 рСгистров ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния (EAX, EBX, ECX, EDX, EBP, ESP, ESI, EDI), Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ PUSHA/PUSHAD

Π§Ρ‚ΠΎΠ± Π΄ΠΎΡΡ‚Π°Ρ‚ΡŒ число с «Π²Π΅Ρ€Ρ…ΡƒΡˆΠΊΠΈ стСка» ΠΊΡƒΠ΄Π°-Ρ‚ΠΎ, ΠΏΠΈΡˆΠΈΡ‚Π΅:

pop ΠΊΡƒΠ΄Π°-Ρ‚ΠΎ
Команда POP
ΠŸΡ€ΠΎΠΈΡΡ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ΠžΡ‚ Π°Π½Π³Π». слова pop — ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ, Ρ€Π°ΡΠΊΠΎΡˆΠ΅Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ
Π€ΠΎΡ€ΠΌΠ°Ρ‚POP ΠΎΠΏΠ΅Ρ€Π°Π½Π΄
Π”Π΅ΠΉΡΡ‚Π²ΠΈΠ΅Π˜Π·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· стСка
ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅Π•ΡΠ»ΠΈ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΡΡ‚Π°Ρ‚ΡŒ ΠΈΠ· стСка всС РОН, ΡƒΠ»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ PUSHA, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ POPA/POPAD

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ (prax06.com).

НабСритС Π² Hiew’e эти Π±Π°ΠΉΡ‚Ρ‹:

B8 CD 20 50-EB FD

Π’Π΅ΠΏΠ΅Ρ€ΡŒ посмотритС Π½Π° асмовый Π²ΠΈΠ΄:


АдрСса    Π‘Π°ΠΉΡ‚Ρ‹   ИмСна   ΠžΠΏΠ΅Ρ€Π°Π½Π΄Ρ‹
00000000: B8CD20  mov     ax,020CD 
00000003: 50      push    ax
00000004: EBFD    jmps    000000003

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€.


00000000: B8CD20  mov     ax,020CD 

Π­Ρ‚Π° строка ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π² рСгистр AX Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 20CD.


00000003: 50      push    ax

Π­Ρ‚Π° строка ΠΊΠ»Π°Π΄Ρ‘Ρ‚ Π² стСк word (слово) 20CDh ΠΈΠ· рСгистра EAX. ΠŸΡ€ΠΈΡ‡Ρ‘ΠΌ Π² памяти слово Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΎ — CD,20h.


00000004: EBFD    jmps    000000003

А Π²ΠΎΡ‚ эта строка Π·Π°Ρ†ΠΈΠΊΠ»ΠΈΠ²Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ строки с адрСсом 03. Π’ΠΎ Π΅ΡΡ‚ΡŒ послС выполнСния строки 03 Π² строкС 04 Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ²Π΅Ρ€ΡˆΠ°Ρ‚ΡŒΡΡ бСзусловный ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ строкС 03.


Π’Π°ΠΊ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΆΠ΅ этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π΅ Π²Π΅ΡˆΠ°Π΅Ρ‚ ΠΊΠΎΠΌΠΏ Π² Π”ΠžΠ‘ ΠΈ Π½Π΅ виснСт сам Π² WinXP? ЗапуститС ΠΈ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Π° выполнится Π·Π° Π΄ΠΎΠ»ΠΈ сСкунды.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ Ρ…ΠΈΡ‚Ρ€ΠΎΡΡ‚ΡŒ Π² CV сами, Π½ΠΎ это Π·Π°ΠΉΠΌΡ‘Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя :).

ЧСстно скаТу, Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ Ρ‚ΠΈΠΏΠ° CodeView Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Ρ€Π°Π·Π±ΠΎΡ€Π° этого пустячка.

Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ простыС DOS-ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ стСк ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² своих цСлях, Ρ‡Ρ‚ΠΎ сбиваСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ рСгистра ESP ΠΌΠ΅ΠΆΠ΄Ρƒ шагами. Π—Π΄Π΅ΡΡŒ Π±Ρ‹ Π»ΡƒΡ‡ΡˆΠ΅ всСго Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠΎΠ΄ SoftIce’ΠΎΠΌ. И Ρ‚ΠΎΠ³Π΄Π° Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ «Ρ€ΠΎΠ²Π½ΠΎ» ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 32637 Ρ€Π°Π· Π·Π°ΠΏΠΈΡˆΠ΅Ρ‚ Π² стСк Π΄Π²Π° Π±Π°ΠΉΡ‚Π° CD20h. ПослСдний Ρ€Π°Π· Π±Π°ΠΉΡ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ вписаны вмСсто ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ «jmp 03».

CD20h — это ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ int 20h (Π²Ρ‹Π·ΠΎΠ² прСрывания Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΊΠ°ΠΊ Π²Ρ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅Ρ‚Π΅).

Π‘Ρ‚Π΅ΠΊ Π² com-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ начинаСтся Π½Π° Π΄Π½Π΅ Π΅Ρ‘ сСгмСнта (FFFE — послСдний адрСс, ΠΊΡ€Π°Ρ‚Π½Ρ‹ΠΉ Π΄Π²ΡƒΠΌ).

ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ стСк всё растёт ΠΈ растёт Π²Π²Π΅Ρ€Ρ… ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ Π΅Π³ΠΎ Π½Π΅ остановит, ΠΊΡ€ΠΎΠΌΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅Π³ΠΎ ΠΈΠ»ΠΈ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.

И Π²ΠΎΡ‚ ΠΎΠ½ заполняСт всё свободноС мСсто Π² сСгмСнтС, Π° Π·Π°Ρ‚Π΅ΠΌ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π·Π°Ρ‚ΠΈΡ€Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ (Π² этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΈΡ… Π½Π΅Ρ‚). Π”Π°Π»Π΅Π΅ затираСтся ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Вакая ситуация называСтся ошибкой пСрСполнСния стСка. Для DOS-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ данная ошибка — ΠΎΠ΄Π½Π° ΠΈΠ· самых распространённых.

Π’ Win32-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ выдСлСния стСка Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π·Π²ΠΈΡ‚ (ОБь сама занимаСтся этим вопросом, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ срСдства Π·Π°Ρ‰ΠΈΡ‰Ρ‘Π½Π½ΠΎΠ³ΠΎ Ρ€Π΅ΠΆΠΈΠΌΠ°). Однако ошибки пСрСполнСния стСков — всё Π΅Ρ‰Ρ‘ настоящий Π²Ρ‹Π·ΠΎΠ² для программистов, особСнно Π² сфСрС бСзопасности. Π’Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ³Π»ΠΈ Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ ΠΈΠ·-Π·Π° Ρ‚Π°ΠΊΠΎΠΉ ошибки стСк Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ.

Π’Π΅Π΄ΡŒ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° просто отправляла Π΄Π°Π½Π½Ρ‹Π΅ CD20h Π² стСк. Но Π·Π°Ρ‚Π΅ΠΌ стСк вырос (адрСс Π² ESP ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ»ΡΡ!) Π΄ΠΎ значСния, Ρ€Π°Π²Π½ΠΎΠ³ΠΎ адрСсу ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ JMP 0103 (Π² CodeView этого Π½Π΅ Π²ΠΈΠ΄Π½ΠΎ!). И Π²ΠΎΡ‚, послС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ выполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ push AX, происходит чудСсноС ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² исполняСмый ΠΊΠΎΠ΄.

Π’ CodeView Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ самый интСрСсный ΠΌΠΎΠΌΠ΅Π½Ρ‚ этого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°. Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚Π΅ рСгистр указатСля стСка (ESP). НапримСр, установитС Π² Π½Ρ‘ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 200h (Ρ‡Ρ‚ΠΎΠ± Π΄ΠΎΠ»Π³ΠΎ Π½Π΅ Ρ‚Ρ€Π΅ΠΉΡΠΈΡ‚ΡŒ). ПослС этого — F10 ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·, ΠΈ ΠΏΡ€ΠΎΠ³Π° Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π΅Ρ‰Ρ‘ ΠΈ Π΅Ρ‰Ρ‘ Ρ€Π°Π·. ΠœΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ, Π²Ρ‹ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ Ρ‚Π°ΠΊΠΎΠΉ фокус ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² своих цСлях ;).

ΠŸΡ€Π΅Π΄Π»Π°Π³Π°ΡŽ Π²Π°ΠΌ Π΅Ρ‰Ρ‘ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Win32.

Π£Ρ‡Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ русскиС Π±ΡƒΠΊΠ²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π² ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅ ANSI (стандарт для Ρ„ΠΎΡ€Ρ‚ΠΎΡ‡Π΅ΠΊ).

prax07.asm:

      .386
      .model flat, stdcall
      option casemap :none   ; case sensitive
;#########################################################################
      include \masm32\include\windows. inc
      include \masm32\include\user32.inc
      include \masm32\include\kernel32.inc
      includelib \masm32\lib\user32.lib
      includelib \masm32\lib\kernel32.lib
;#########################################################################
    .data
	MsgBoxCaption  db "It's my first command line for Win32",0
	MsgBoxText     db "АргумСнты ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚",0
;#########################################################################
    .code

start:
	call   GetCommandLine ; API. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π² EAX адрСс ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки
	mov    ECX,512d       
	add    ECX,EAX        

   unquote:	              ; ΠœΠ΅Ρ‚ΠΊΠ° Ρ†ΠΈΠΊΠ»Π° нахоТдСния Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ
	inc    EAX
	cmp    EAX,ECX
	jz     NO
	cmp    byte ptr[EAX],22h
   jnz unquote

   Arg_search:               ; ΠœΠ΅Ρ‚ΠΊΠ° Ρ†ΠΈΠΊΠ»Π° нахоТдСния Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки
	inc    EAX              
	cmp    byte ptr[EAX],0  
	jz     NO               
	cmp    byte ptr[EAX],20h
   jz  Arg_search               



  push   0
  push   offset MsgBoxCaption
  push   EAX
  push   0
  call   MessageBox           ; Π’Ρ‹Π·ΠΎΠ² API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° сообщСния Π½Π° экран

  push   0                    ; ΠŸΡƒΡΡ‚ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π°
  call   ExitProcess          ; Π’Ρ‹Π·ΠΎΠ² API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π°

NO:
  push   0                    ; ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ "MB_OK"
  push   offset MsgBoxCaption ; ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ "адрСс Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°"
  push   offset MsgBoxText    ; ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ "адрСс тСкста сообщСния"
  push   0                    ; ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ "Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ΅ ΠΎΠΊΠ½ΠΎ"
  call   MessageBox           ; Π’Ρ‹Π·ΠΎΠ² API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° сообщСния Π½Π° экран

  push   0                    ; ΠŸΡƒΡΡ‚ΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π°
  call   ExitProcess          ; Π’Ρ‹Π·ΠΎΠ² API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π°

end start

НабСритС, поТалуйста, сами ΡΠ΅ΠΊΡ†ΠΈΡŽ ΠΊΠΎΠ΄Π°. Π― ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ Ρƒ вас Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠΈ, ΠΈ это ΠΎΡ‡Π΅Π½ΡŒ ускорит процСсс обучСния.

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ± ΠΏΡ€ΠΈΠΌΠ΅Ρ€ сдСлал Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΅ΠΌΡƒ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΎ, запуститС Π΅Π³ΠΎ с ΠΊΠ°ΠΊΠΈΠΌ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ Ρ‚ΠΈΠΏΠ°:
prax07.exe qwerty

Ну Ρ‡Ρ‚ΠΎ ΠΆ, ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ Olly — ваш Π»ΡƒΡ‡ΡˆΠΈΠΉ Π΄Ρ€ΡƒΠ³. ΠŸΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ Π²ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΊΠ»ΡŽΡ‡ Π² ΠΏΠΎΠ»Π΅ «Arguments». НС Ρ‚ΠΎΡ€ΠΎΠΏΠΈΡ‚Π΅ΡΡŒ, ΠΏΠΎΠ΄ΡƒΠΌΠ°ΠΉΡ‚Π΅ Ρ‡Ρ‚ΠΎ ΠΊ Ρ‡Π΅ΠΌΡƒ.

Π—Π΄Π΅ΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ 3 API-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

  • GetCommandLine — Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π² рСгистр EAX адрСс ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ вмСстС с ΠΏΡƒΡ‚Ρ‘ΠΌ Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°Ρ…. НапримСр:
    «D:\tut\prax07.exe » qwerty
  • MessageBox — Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π²Ρ‹Π²ΠΎΠ΄Π° сообщСний Π½Π° экран.
  • ExitProcess — функция Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ.

ΠžΡΡ‚Π°Π»Π°ΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ ΠΏΠΎΠΊΠ° Π½Π΅ Π·Π½Π°Π΅Ρ‚Π΅ Π² этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. Команда CALL, Π½ΠΎ это цСлая Ρ‚Π΅ΠΌΠ°. И, ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΡ€ΠΎΡ‡ΠΈΠΌ, послСдняя тСорСтичСская Ρ‚Π΅ΠΌΠ° Π² Π½Π°ΡˆΠΈΡ… ΡƒΡ€ΠΎΠΊΠ°Ρ….

Bitfry


НаписаниС ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ° ΠΊΠΎΠ΄Π° Π½Π° ассСмблСрС x86/x64 Π² Linux

БСгодня ΠΌΡ‹ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ Π½Π° ассСмблСрС. Вопрос Β«Π·Π°Ρ‡Π΅ΠΌ ΠΊΠΎΠΌΡƒ-Ρ‚ΠΎ Π² Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ тысячСлСтии ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΉΡ‚ΠΈ Π² Π³ΠΎΠ»ΠΎΠ²Ρƒ ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π½Π° ассСмблСрС» раскрыт Π² Π·Π°ΠΌΠ΅Ρ‚ΠΊΠ΅ Π—Π°Ρ‡Π΅ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ всякиС Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ Π²Π΅Ρ‰ΠΈ, поэтому здСсь ΠΌΡ‹ ΠΊ Π½Π΅ΠΌΡƒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ. ΠžΡ‚ΠΌΠ΅Ρ‡Ρƒ, Ρ‡Ρ‚ΠΎ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… поста ΠΌΡ‹ сосрСдоточимся Π½Π° вопросС компиляции ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π½Π° ассСмблСрС. Π‘Π°ΠΌ ΠΆΠ΅ язык ассСмблСра заслуТиваСт ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ большого поста, Π° Ρ‚ΠΎ ΠΈ сСрии постов.

Если Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅ ассСмблСр, Ρ‚ΠΎ любая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° для вас β€” open source.

Народная ΠΌΡƒΠ΄Ρ€ΠΎΡΡ‚ΡŒ.

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

БущСствуСт Π΄Π²Π° ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ассСмблСрных синтаксиса β€” Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ AT&T-синтаксис ΠΈ Intel-синтаксис. Они Π½Π΅ сильно Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΈ Π»Π΅Π³ΠΊΠΎ пСрСводятся ΠΎΠ΄ΠΈΠ½ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ. Π’ ΠΌΠΈΡ€Π΅ Windows принято ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ синтаксис Intel. Π’ ΠΌΠΈΡ€Π΅ *nix систСм, Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, практичСски всСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ синтаксис AT&T, Π° синтаксис Intel встрСчаСтся ΠΊΡ€Π°ΠΉΠ½Π΅ Ρ€Π΅Π΄ΠΊΠΎ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π΅ perf). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Windows, ΠΊΠ°ΠΊ извСстно, Π½Π΅ сущСствуСт, Π΄Π°Π»Π΅Π΅ ΠΌΡ‹ сосрСдоточимся Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ AT&T-синтаксисС πŸ™‚

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ΠΎΠ² ассСмблСра сущСствуСт ΠΌΠ½ΠΎΠ³ΠΎ. ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ GNU Assembler (ΠΎΠ½ ΠΆΠ΅ GAS, ΠΎΠ½ ΠΆΠ΅ /usr/bin/as). Π‘ΠΊΠΎΡ€Π΅Π΅ всСго, ΠΎΠ½ ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ вашСй систСмС. К Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅, Ссли Π²Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ΡΡŒ GCC ΠΈ ΡΠΎΠ±ΠΈΡ€Π°Π΅Ρ‚Π΅ΡΡŒ ΠΏΠΈΡΠ°Ρ‚ΡŒ ассСмблСрныС вставки Π² ΠΊΠΎΠ΄Π΅ Π½Π° C, Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ с этим ассСмблСром Π²Π°ΠΌ прСдстоит Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ. Из достойных Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ² GAS ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ NASM ΠΈ FASM.

НаконСц, язык ассСмблСра отличаСтся Π² зависимости ΠΎΡ‚ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ процСссора. Пока Ρ‡Ρ‚ΠΎ ΠΌΡ‹ сосрСдоточимся Π½Π° ассСмблСрС для x86 (ΠΎΠ½ ΠΆΠ΅ i386) ΠΈ x64 (ΠΎΠ½ ΠΆΠ΅ amd64), Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΈΠΌΠ΅Π½Π½ΠΎ с этими Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°ΠΌΠΈ приходится Ρ‡Π°Ρ‰Π΅ всСго ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π΅Π»ΠΎ. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, ARM Ρ‚ΠΎΠΆΠ΅ вСсьма распространСн, Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½Π° Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π°Ρ… ΠΈ ΠΏΠ»Π°Π½ΡˆΠ΅Ρ‚Π°Ρ…. Π•Ρ‰Π΅ ΠΈΠ· ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ популярного Π΅ΡΡ‚ΡŒ SPARC ΠΈ PowerPC, Π½ΠΎ ΡˆΠ°Π½ΡΡ‹ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ с Π½ΠΈΠΌΠΈ вСсьма ΠΌΠ°Π»Ρ‹. ΠžΡ‚ΠΌΠ΅Ρ‡Ρƒ, Ρ‡Ρ‚ΠΎ x86 ΠΈ x64 ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ, Π½ΠΎ эти Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ ΠΏΠΎΡ…ΠΎΠΆΠΈ, поэтому я Π½Π΅ Π²ΠΈΠΆΡƒ Π² этом большого смысла.

Β«Hello, worldΒ» Π½Π° int 0x80

Рассмотрим Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹ΠΉ Β«Hello, worldΒ» для Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ x86 ΠΈ Linux:

.data
msg:
Β  . ascii «Hello, world!\n»
Β  .set len, . — msg

.text

.globl _start
_start:
Β  # write
Β  mov $4, Β  %eax
Β  mov $1, Β  %ebx
Β  mov $msg, %ecx
Β  mov $len, %edx
Β  int $0x80

Β  # exit
Β  mov $1, Β  %eax
Β  xor %ebx, %ebx
Β  int $0x80

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ:

# Или: gcc -m32 -c hello-int80.s
as —32 hello-int80.s -o hello-int80.o
ld -melf_i386 -s hello-int80.o -o hello-int80

ΠšΠΎΡ€ΠΎΡ‚ΠΊΠΎ рассмотрим ΠΏΠ΅Ρ€Π²Ρ‹Π΅ нСсколько дСйствий, выполняСмых ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ: (1) ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ с ΠΌΠ΅Ρ‚ΠΊΠΈ _start, (2) Π² рСгистр eax кладСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 4, (3) Π² рСгистр ebx помСщаСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1, (4) Π² рСгистр ecx кладСтся адрСс строки, (5) Π² рСгистр edx кладСтся Π΅Π΅ Π΄Π»ΠΈΠ½Π°, (6) происходит ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ 0x80. Π’Π°ΠΊ Π² ΠΌΠΈΡ€Π΅ Linux Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ происходит Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ². ΠšΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ int 0x80 считаСтся ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌ ΠΈ ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΌ, Π½ΠΎ ΠΈΠ· сообраТСний ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ совмСстимости ΠΎΠ½ всС Π΅Ρ‰Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. Π”Π°Π»Π΅Π΅ ΠΌΡ‹ рассмотрим ΠΈ Π±ΠΎΠ»Π΅Π΅ Π½ΠΎΠ²Ρ‹Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹.

НСтрудно Π΄ΠΎΠ³Π°Π΄Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ eax β€” это Π½ΠΎΠΌΠ΅Ρ€ систСмного Π²Ρ‹Π·ΠΎΠ²Π°, Π° ebx, ecx ΠΈ edx β€” Π΅Π³ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. Какой систСмный Π²Ρ‹Π·ΠΎΠ² ΠΈΠΌΠ΅Π΅Ρ‚ ΠΊΠ°ΠΊΠΎΠΉ Π½ΠΎΠΌΠ΅Ρ€ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² Ρ„Π°ΠΉΠ»Π°Ρ…:

# для x86
/usr/include/x86_64-linux-gnu/asm/unistd_32.h
# для x64
/usr/include/x86_64-linux-gnu/asm/unistd_64.h

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ строчка ΠΈΠ· Ρ„Π°ΠΉΠ»Π° unistd_32.h:

… ΠΊΠ°ΠΊ Π±Ρ‹ Π½Π°ΠΌΠ΅ΠΊΠ°Π΅Ρ‚ Π½Π°ΠΌ, Ρ‡Ρ‚ΠΎ производится Π²Ρ‹Π·ΠΎΠ² write. Π’ свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΈΠ· man 2 write ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ этот систСмный Π²Ρ‹Π·ΠΎΠ² ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚:

#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count);

Π’ΠΎ Π΅ΡΡ‚ΡŒ, рассмотрСнный ΠΊΠΎΠ΄ эквивалСнтСн:

// напомню, Ρ‡Ρ‚ΠΎ stdout == 1
write(stdout, «Hello, world!\n», 14)

Π—Π°Ρ‚Π΅ΠΌ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ производится Π²Ρ‹Π·ΠΎΠ²:

// ΠΊΠΎΠΌΠ°Π½Π΄Π° `xor %ebx, %ebx` обнуляСт рСгистр %ebx
exit(0)

БовсСм нС слоТно!

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС систСмный Π²Ρ‹Π·ΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· 0x80 производится ΠΏΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ. РСгистру eax присваиваСтся Π½ΠΎΠΌΠ΅Ρ€ систСмного Π²Ρ‹Π·ΠΎΠ²Π° ΠΈΠ· unistd_32. h. Π”ΠΎ ΡˆΠ΅ΡΡ‚ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² рСгистры ebx, ecx, edx, esi, edi ΠΈ ebp. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ помСщаСтся Π² рСгистр eax. ЗначСния ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… рСгистров ΠΏΡ€ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΈΠ· систСмного Π²Ρ‹Π·ΠΎΠ²Π° ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ ΠΏΡ€Π΅ΠΆΠ½ΠΈΠΌΠΈ.

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ систСмного Π²Ρ‹Π·ΠΎΠ²Π° Ρ‡Π΅Ρ€Π΅Π· sysenter

Начиная с i586 появилась инструкция sysenter, ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ прСдназначСнная (Ρ‡Π΅Π³ΠΎ нСльзя ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎΠ± инструкции int) для выполнСния систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ².

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€ использования Π΅Π΅ Π½Π° Linux:

.data
msg:
Β  .ascii «Hello, world!\n»
Β  len = . — msg

.text
.globl _start

_start:
Β  # write
Β  mov Β  $4, Β  %eax
Β  mov Β  $1, Β  %ebx
Β  mov Β  $msg, %ecx
Β  mov Β  $len, %edx
Β  push Β $write_ret
Β  push Β %ecx
Β  push Β %edx
Β  push Β %ebp
Β  mov Β  %esp, %ebp
Β  sysenter

write_ret:
Β  # exit
Β  mov Β  $1, Β  %eax
Β  xor Β  %ebx, %ebx
Β  push Β $exit_ret
Β  push Β %ecx
Β  push Β %edx
Β  push Β %ebp
Β  mov Β  %esp, %ebp
Β  sysenter

exit_ret:

Π‘Π±ΠΎΡ€ΠΊΠ° осущСствляСтся Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ сборкС ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°.

Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ‚ΠΎΡ‚ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ использовании int 0x80, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ΅Ρ€Π΅Π΄ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ sysenter Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² стСк адрСс, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ слСдуСт Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΎΠ²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ ΠΊΠΎΠ΅-ΠΊΠ°ΠΊΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ манипуляции с рСгистрами. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Ρ‹ этого Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΡΡŽΡ‚ΡΡ здСсь.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ sysenter Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ быстрСС int 0x80 ΠΈ являСтся ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ способом ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π½Π° x86.

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ систСмного Π²Ρ‹Π·ΠΎΠ²Π° Ρ‡Π΅Ρ€Π΅Π· syscall

Π”ΠΎ сих ΠΏΠΎΡ€ Ρ€Π΅Ρ‡ΡŒ шла ΠΎ 32-Ρ… Π±ΠΈΡ‚Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…. На x64 Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² осущСствляСтся Ρ‚Π°ΠΊ:

.data
msg:
Β  .ascii «Hello, world!\n»
Β  .set len, . — msg

.text

.globl _start
_start:
Β  # write
Β  mov Β $1, Β  %rax
Β  mov Β $1, Β  %rdi
Β  mov Β $msg, %rsi
Β  mov Β $len, %rdx
Β  syscall

Β  # exit
Β  mov Β $60, %rax
Β  xor Β %rdi, %rdi
Β  syscall

БобираСтся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

as —64 hello-syscall.s -o hello-syscall. o
ld -melf_x86_64 -s hello-syscall.o -o hello-syscall

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ всС Ρ‚ΠΎΡ‚ ΠΆΠ΅, Π½ΠΎ Π΅ΡΡ‚ΡŒ Π²Π°ΠΆΠ½Ρ‹Π΅ отличия. НомСра систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π½ΡƒΠΆΠ½ΠΎ Π±Ρ€Π°Ρ‚ΡŒ ΠΈΠ· unistd_64.h, Π° Π½Π΅ ΠΈΠ· unistd_32.h. Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, ΠΎΠ½ΠΈ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅. Π’Π°ΠΊ ΠΊΠ°ΠΊ это 64-Ρ… Π±ΠΈΡ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ΄, Ρ‚ΠΎ ΠΈ рСгистры ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ 64-Ρ… Π±ΠΈΡ‚Π½Ρ‹Π΅. НомСр систСмного Π²Ρ‹Π·ΠΎΠ²Π° помСщаСтся Π² rax. Π”ΠΎ ΡˆΠ΅ΡΡ‚ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² пСрСдаСтся Ρ‡Π΅Ρ€Π΅Π· рСгистры rdi, rsi, rdx, r10, r8 ΠΈ r9. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ помСщаСтся Π² рСгистр rax. ЗначСния, сохранСнныС Π² ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… рСгистрах, ΠΏΡ€ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΈΠ· систСмного Π²Ρ‹Π·ΠΎΠ²Π° ΠΎΡΡ‚Π°ΡŽΡ‚ΡΡ ΠΏΡ€Π΅ΠΆΠ½ΠΈΠΌΠΈ, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ рСгистров rcx ΠΈ r11.

Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½ΠΎ, Ρ‡Ρ‚ΠΎ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΠΎΠ΄ x64 ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΊΠ°ΠΊ Ρ‡Π΅Ρ€Π΅Π· syscall, Ρ‚Π°ΠΊ ΠΈ Ρ‡Π΅Ρ€Π΅Π· int 0x80.

ΠžΡ‚Π»Π°Π΄ΠΊΠ° ассСмблСрного ΠΊΠΎΠ΄Π° Π² GDB

Π‘Ρ‚Π°Ρ‚ΡŒΡ Π±Ρ‹Π»Π° Π±Ρ‹ Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΠΉ, Ссли Π±Ρ‹ ΠΌΡ‹ Π½Π΅ Π·Π°Ρ‚Ρ€ΠΎΠ½ΡƒΠ»ΠΈ вопрос ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ всСго этого хозяйства. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ всС Ρ€Π°Π²Π½ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠ»ΠΎΡ‚Π½ΠΎ сидим Π½Π° GNU-стэкС, Π² качСствС ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ GDB. По Π±ΠΎΠ»ΡŒΡˆΠΎΠΌΡƒ счСту, ΠΎΡ‚Π»Π°Π΄ΠΊΠ° Π½Π΅ сильно отличаСтся ΠΎΡ‚ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π½Π° C, Π½ΠΎ Π΅ΡΡ‚ΡŒ Π½ΡŽΠ°Π½ΡΡ‹.

НапримСр, Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ‚Π°ΠΊ просто Π²Π·ΡΡ‚ΡŒ ΠΈ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π±Ρ€Π΅ΠΉΠΊΠΏΠΎΠΈΠ½Ρ‚ Π½Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ main. Как ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ, Ρƒ вас попросту Π½Π΅Ρ‚ ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹Ρ… символов с ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ Ρ‚ΠΎΠΌ, Π³Π΄Π΅ эту main ΠΈΡΠΊΠ°Ρ‚ΡŒ. РСшСниС Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ адрСс Ρ‚ΠΎΡ‡ΠΊΠΈ Π²Ρ…ΠΎΠ΄Π° Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π±Ρ€Π΅ΠΉΠΊΠΏΠΎΠΈΠ½Ρ‚ Π½Π° этот адрСс:

Π£Π²ΠΈΠ΄ΠΈΠΌ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π²Ρ€ΠΎΠ΄Π΅:

[…]
Β  Β  Entry point: 0x4000b0
[…]

Π”Π°Π»Π΅Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ:

Какого-Π»ΠΈΠ±ΠΎ исходного ΠΊΠΎΠ΄Π° Ρƒ нас Ρ‚ΠΎΠΆΠ΅ Π½Π΅Ρ‚, поэтому ΠΊΠΎΠΌΠ°Π½Π΄Π° l Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. Π‘Π°ΠΌΠΈ ассСмблСрныС инструкции ΠΈ Π΅ΡΡ‚ΡŒ исходный ΠΊΠΎΠ΄! Π’Π°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ 5 ассСмблСрных инструкций:

По понятным ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ, ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠΉ строчкС ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ n ΠΈΠ»ΠΈ s Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. ВмСсто этих ΠΊΠΎΠΌΠ°Π½Π΄ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ инструкции β€” ni, si, ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

Π‘ΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ значСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΌΡ‹ Ρ‚ΠΎΠΆΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ. Однако Π½ΠΈΡ‡Ρ‚ΠΎ Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ значСния рСгистров:

info registers
p/x $rcx
p $xmm1
set $r15 = 0x123

НаконСц, стСктрСйсы Π½Π°ΠΌ Ρ‚ΠΎΠΆΠ΅ нСдоступны. Но Π½ΠΈΡ‡Ρ‚ΠΎ Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ 8 Π±Π»ΠΈΠΆΠ°ΠΉΡˆΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½Π° стСкС:

По Π±ΠΎΠ»ΡŒΡˆΠΎΠΌΡƒ счСту, это всС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° C ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ исходников. ΠšΡΡ‚Π°Ρ‚ΠΈ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ, Π² ΠΊΠ°ΠΊΠΎΠΉ ассСмблСрных ΠΊΠΎΠ΄ транслируСтся ваш ΠΊΠΎΠ΄ Π½Π° C, ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… способов:

gcc -S test.c -o —
objdump -d ./myprog

Как Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Hopper ΠΈΠ»ΠΈ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΌ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ дизассСмблСром.

Π’Π½Π΅Π·Π°ΠΏΠ½ΠΎ ΠΎΡ‚Π»Π°Π΄ΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, собранной Π±Π΅Π· -g ΠΈ/ΠΈΠ»ΠΈ с -O2, пСрСстала ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊΠΈΠΌ ΡƒΠΆ ΡΡ‚Ρ€Π°ΡˆΠ½Ρ‹ΠΌ Π΄Π΅Π»ΠΎΠΌ, Π½Π΅ Ρ‚Π°ΠΊ Π»ΠΈ?

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ качСствС домашнСго задания ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° ассСмблСрС, Π²Ρ‹Π²ΠΎΠ΄ΡΡ‰ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ Π΅ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки.

ΠŸΡ€ΠΈΠΌΠΈΡ‚Π΅ Π²ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π² Linux Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π΄Π²Π° способа ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ систСмный Π²Ρ‹Π·ΠΎΠ² β€” Ρ‡Π΅Ρ€Π΅Π· Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ vsyscall (считаСтся ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΌ, Π½ΠΎ поддСрТиваСтся для ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ совмСстимости) ΠΈ VDSO (ΠΏΡ€ΠΈΡˆΠ΅Π΄ΡˆΠΈΠΉ Π΅ΠΌΡƒ Π½Π° Π·Π°ΠΌΠ΅Π½Ρƒ). Π­Ρ‚ΠΈ способы основаны Π½Π° ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ страницы ядра Π² адрСсноС пространство процСсса ΠΈ ΠΏΡ€ΠΈΠ·Π²Π°Π½Ρ‹ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ², Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΉ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… тяТСлых дСйствий со стороны ядра систСмы. Π’ качСствС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π²Ρ‹Π·ΠΎΠ²Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ускорСн Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΠΎΠΆΠ½ΠΎ привСсти gettimeofday. К соТалСнию, рассмотрСниС vsyscall ΠΈ VDSO Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° Ρ€Π°ΠΌΠΊΠΈ Π΄Π°Π½Π½ΠΎΠ³ΠΎ поста. Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Π½ΠΈΡ… Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ ΠΏΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΌ Π½ΠΈΠΆΠ΅ ссылкам.

Бсылки ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅:

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, вас ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΠΎΠ²Π°Ρ‚ΡŒ ΡΡ‚Π°Ρ‚ΡŒΠΈ, посвящСнныС ассСмблСру, Π² Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π±Π»ΠΎΠ³Π°Ρ… alexanius-blog.blogspot.ru ΠΈ 0xax.blogspot.ru.

А ΠΊΠ°ΠΊΠΈΠ΅ инструмСнты (компилятор, ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊ, …) Π²Ρ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для программирования Π½Π° ассСмблСрС?

Π”ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅: Π¨ΠΏΠ°Ρ€Π³Π°Π»ΠΊΠ° ΠΏΠΎ основным инструкциям ассСмблСра x86/x64

ΠœΠ΅Ρ‚ΠΊΠΈ: Linux, АссСмблСр.

ASSEMBLER&WIN32. КУРБ ΠœΠžΠ›ΠžΠ”ΠžΠ“Πž Π‘ΠžΠ™Π¦Π. УРОК 3.mov β€” ΠΊΠΎΠΌΠ°Π½Π΄Π° ассСмблСра

Когда Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° ассСмблСрС, Π²Ρ‹ просто ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ процСссору. ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ процСссору β€” это просто ΠΊΠΎΠ΄Ρ‹ ΠΈΠ»ΠΈ ΠΊΠΎΠ΄Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈΠ»ΠΈ ΠΎΠΏΠΊΠΎΠ΄Ρ‹. ΠžΠΏΠΊΠΎΠ΄Ρ‹ β€” фактичСски Β«Ρ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΉ тСкст»- вСрсии ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹Ρ… ΠΊΠΎΠ΄ΠΎΠ². Из-Π·Π° этого, ассСмблСр считаСтся самым Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΌ языком программирования, всС Π² ассСмблСрС нСпосрСдствСнно прСобразовываСтся Π² ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹Π΅ ΠΊΠΎΠ΄Ρ‹. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, Ρƒ вас Π½Π΅Ρ‚ компилятора, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ язык высокого уровня Π² язык Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня, ассСмблСр Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠΎΠ΄Ρ‹ ассСмблСра Π² Π΄Π°Π½Π½Ρ‹Π΅.

Π’ этом ΡƒΡ€ΠΎΠΊΠ΅ ΠΌΡ‹ обсудим нСсколько ΠΎΠΏΠΊΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ΠΊ Π²Ρ‹Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡŽ, поразрядным опСрациям, ΠΈ Ρ‚.Π΄. Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠΏΠΊΠΎΠ΄Ρ‹: ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π°, сравнСния ΠΈ Ρ‚.Π΄, Π±ΡƒΠ΄ΡƒΡ‚ обсуТдСны ΠΏΠΎΠ·ΠΆΠ΅.

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π² Π²Π°ΡˆΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ послС Ρ‚ΠΎΡ‡ΠΊΠΈ с запятой. Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ Π² Π΄Π΅Π»ΡŒΡ„ΠΈ ΠΈΠ»ΠΈ си Ρ‡Π΅Ρ€Π΅Π· //.
Числа Π² ассСмблСрС ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒΡΡ Π² Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ, дСсятСричной ΠΈΠ»ΠΈ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠΉ систСмС. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π² ΠΊΠ°ΠΊΠΎΠΉ систСмС использовано число Π½Π°Π΄ΠΎ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ послС числа Π±ΡƒΠΊΠ²Ρƒ. Для Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠΉ систСмы ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ Π±ΡƒΠΊΠ²Π° b (ΠΏΡ€ΠΈΠΌΠ΅Ρ€: 0000010b, 001011010b), для дСсятСричной систСмы ΠΌΠΎΠΆΠ½ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ послС числа ΠΈΠ»ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π±ΡƒΠΊΠ²Ρƒ d (ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹: 4589, 2356d), для ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠΉ систСмы Π½Π°Π΄ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π±ΡƒΠΊΠ²Ρƒ h, ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½ΠΎΠ΅ число Π½Π°Π΄ΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ с Π½ΡƒΠ»Ρ‘ΠΌ Π² Π½Π°Ρ‡Π°Π»Π΅ (ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹: 00889h, 0AC45h, 056Fh, Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ F145Ch, Π‘123h).

Бамая пСрвая ΠΊΠΎΠΌΠ°Π½Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ Ρ…ΠΎΡ€ΠΎΡˆΠΎ всСм извСстная MOV. Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для копирования (Π½Π΅ ΠΎΠ±Ρ€Π°Ρ‰Π°ΠΉΡ‚Π΅ внимания Π½Π° имя ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹) значСния ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ мСста Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅. Π­Ρ‚ΠΎ β€˜ΠΌΠ΅ΡΡ‚ΠΎβ€™ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ рСгистр, ячСйка памяти ΠΈΠ»ΠΈ нСпосрСдствСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ°ΠΊ исходноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅). Бинтаксис ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

mov ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊ, источник

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ рСгистра Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ.

mov edx, ecx

Π’Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ содСрТаниС ecx Π² edx. Π Π°Π·ΠΌΠ΅Ρ€ источника ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: эта ΠΊΠΎΠΌΠ°Π½Π΄Π° β€” НЕ допустима:

mov al, ecx ; Π½Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ

Π­Ρ‚ΠΎΡ‚ ΠΎΠΏΠΊΠΎΠ΄ пытаСтся ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ DWORD (32-Π±ΠΈΡ‚Π½ΠΎΠ΅) Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Π±Π°ΠΉΡ‚ (8 Π±ΠΈΡ‚ΠΎΠ²). Π­Ρ‚ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сдСлано mov ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ (для этого Π΅ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹).

А эти ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Ρƒ Π½ΠΈΡ… источник ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊ Π½Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ:

mov al, bl
mov cl, dl
mov cx, dx
mov ecx, ebx

Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· памяти ΠΈ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ эго Π² рСгистр. Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° возьмСм ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ схСму памяти:

Β 

смСщСниС3435363738393A3B3C3D3E3F404142
Π΄Π°Π½Π½Ρ‹Π΅0D0A50324457257A5E72EF7DFFADC7

(ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π±Π»ΠΎΠΊ прСдставляСт Π±Π°ΠΉΡ‚)

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ смСщСния ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΎ здСсь ΠΊΠ°ΠΊ Π±Π°ΠΉΡ‚, Π½ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ это это β€” 32-разрядноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’ΠΎΠ·ΡŒΠΌΠ΅ΠΌ для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° 3A, это Ρ‚Π°ΠΊΠΆΠ΅ β€” 32-разрядноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅: 0000003Ah. Волько, Ρ‡Ρ‚ΠΎΠ±Ρ‹ с ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ пространство, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ малСнькиС смСщСния.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ Π½Π° смСщСниС 3A Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π²Ρ‹ΡˆΠ΅. Π”Π°Π½Π½Ρ‹Π΅ Π½Π° этом смСщСнии β€” 25, 7A, 5E, 72, EF, ΠΈ Ρ‚.Π΄. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ со смСщСния 3A, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² рСгистр, Π²Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ mov:

mov eax, dword ptr [0000003Ah]

ΠžΠ·Π½Π°Ρ‡Π°Π΅Ρ‚: ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ с Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ DWORD (32-Π±ΠΈΡ‚Π°) ΠΈΠ· памяти со смСщСниСм 3Ah Π² рСгистр eax. ПослС выполнСния этой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, eax Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 725E7A25h. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ это β€” инвСрсия Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎ находится Π² памяти: 25 7A 5E 72. Π­Ρ‚ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ значСния ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π² памяти, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ little endian . Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ самый младший Π±Π°ΠΉΡ‚ сохраняСтся Π² Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π·Π½Π°Ρ‡ΠΈΠΌΠΎΠΌ Π±Π°ΠΉΡ‚Π΅: порядок Π±Π°ΠΉΡ‚ΠΎΠ² Π·Π°Π΄ΠΎΠΌ Π½Π° ΠΏΠ΅Ρ€Π΅Π΄. Π― Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ эти ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΏΠΎΠΊΠ°ΠΆΡƒΡ‚ это:

dword (32-Π±ΠΈΡ‚) Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 10203040 ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚ΠΈΡ€ΠΈΡ‡Π½ΠΎΠ΅ сохраняСтся Π² памяти ΠΊΠ°ΠΊ: 40, 30, 20, 10
word (16-Π±ΠΈΡ‚) Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 4050 ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚ΠΈΡ€ΠΈΡ‡Π½ΠΎΠ΅ сохраняСтся Π² памяти ΠΊΠ°ΠΊ: 50, 40

ВСрнСмся ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ Π²Ρ‹ΡˆΠ΅. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ это Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΈ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€Π°ΠΌΠΈ:

mov cl, byte ptr [34h] ; cl ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0Dh
mov dx, word ptr [3Eh] ; dx ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 7DEFh

Π’Ρ‹, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, ΡƒΠΆΠ΅ поняли, Ρ‡Ρ‚ΠΎ прСфикс ptr ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π°Π΄ΠΎ Π±Ρ€Π°Ρ‚ΡŒ ΠΈΠ· памяти Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€. А прСфикс ΠΏΠ΅Ρ€Π΅Π΄ ptr ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π΄Π°Π½Π½Ρ‹Ρ…:
Byte β€” 1 Π±Π°ΠΉΡ‚
Word β€” 2 Π±Π°ΠΉΡ‚Π°
Dword β€” 4 Π±Π°ΠΉΡ‚Π°

Иногда Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ:

mov eax, [00403045h]

Π’Π°ΠΊ ΠΊΠ°ΠΊ eax β€” 32-разрядный рСгистр, ассСмблСр ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΅ΠΌΡƒ Ρ‚Π°ΠΊΠΆΠ΅ трСбуСтся 32-разрядноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΈΠ· памяти со смСщСниСм 403045h.

МоТно Ρ‚Π°ΠΊΠΆΠ΅ нСпосрСдствСнныС значСния:

mov edx, 5006h

Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° просто Π·Π°ΠΏΠΈΡˆΠ΅Ρ‚ Π² рСгистр edx, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 5006. Π‘ΠΊΠΎΠ±ΠΊΠΈ, [ ΠΈ ], ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ, для получСния значСния ΠΈΠ· памяти (Π² скобках находится смСщСниС), Π±Π΅Π· скобок, это просто нСпосрСдствСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

МоТно Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ рСгистр ΠΊΠ°ΠΊ ячСйку памяти (ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ 32-разрядным Π² 32-разрядных ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ…):

mov eax, 403045h ; ΠΏΠΈΡˆΠ΅Ρ‚ Π² eax Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 403045
mov cx, [eax] ; ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π² рСгистр CX Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Ρ€Π°Π·ΠΌΠ΅Ρ€Π° word) ΠΈΠ· памяти
; ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π² EAX (403045)

Π’ mov cx, [eax], процСссор сначала смотрит, ΠΊΠ°ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (= ячСйкС памяти) содСрТит eax, Π·Π°Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ находится Π² Ρ‚ΠΎΠΉ ячСйкС памяти, ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (word, 16 Π±ΠΈΡ‚, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊ, cx, являСтся 16-разрядным рСгистром) Π² CX.

Π‘Ρ‚Π΅ΠΊΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ β€” PUSH, POP . ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ Π²Π°ΠΌ ΠΎ стСковых опСрациях, я ΡƒΠΆΠ΅ объяснял Π²Π°ΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ стСк. Π‘Ρ‚Π΅ΠΊ это ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π² памяти, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ рСгистр стСка ESP. Π‘Ρ‚Π΅ΠΊ это мСсто для хранСния адрСсов Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Π•ΡΡ‚ΡŒ Π΄Π²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, для размСщСния значСния Π² стСкС ΠΈ извлСчСния Π΅Π³ΠΎ ΠΈΠ· стСка: PUSH ΠΈ POP. Команда PUSH Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² стСкС, Ρ‚.Π΅. ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ячСйку памяти, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ рСгистр ESP, послС этого Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ рСгистра ESP увСличиваСтся Π½Π° 4. Команда Pop ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· стСка, Ρ‚.Π΅. ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· ячСйки памяти, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ рСгистр ESP, послС этого ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ рСгистра ESP Π½Π° 4. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Π½ΠΎΠ΅ Π² стСк послСдним, извлСкаСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ. ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ значСния Π² стСк, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ стСка ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ, Π° ΠΏΡ€ΠΈ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠΈ β€” увСличиваСтся. Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

(1) mov ecx, 100
(2) mov eax, 200
(3) push ecx ; сохранСниС ecx
(4) push eax
(5) xor ecx, eax
(6) add ecx, 400
(7) mov edx, ecx
(8) pop ebx
(9) pop ecx

Анализ:
1: ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ 100 Π² ecx
2: ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ 200 Π² eax
3: Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· ecx (=100) Π² стСкС (размСщаСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ)
4: Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· eax (=200) Π² стСкС (размСщаСтся послСдним)
5/6/7: Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π°Π΄ ecx, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ecx измСняСтся
8: ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ значСния ΠΈΠ· стСка Π² ebx: ebx станСт 200 (послСднСС Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅, ΠΏΠ΅Ρ€Π²ΠΎΠ΅ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅)
9: ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ значСния ΠΈΠ· стСка Π² ecx: ecx снова станСт 100 (ΠΏΠ΅Ρ€Π²ΠΎΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅, послСднСС ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅)

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ происходит Π² памяти, ΠΏΡ€ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ ΠΈ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² стСкС, см. Π½Π° рисунок Π½ΠΈΠΆΠ΅:

Π‘ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅1203120412051206120712081209120A120B
Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅000000000000000000
ESP

(стСк здСсь Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ нулями, Π½ΠΎ Π² Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ это Π½Π΅ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ здСсь). ESP стоит Π² Ρ‚ΠΎΠΌ мСстС, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚)

mov ax, 4560h
push ax

Π‘ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅1203120412051206120712081209120A120B
Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅000060450000000000
ESP

mov cx, FFFFh
push cx

Π‘ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅1203120412051206120712081209120A120B
Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅FFFF60450000000000
ESP

pop edx

Π‘ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅1203120412051206120712081209120A120B
Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅FFFF60450000000000
ESP

edx Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ 4560FFFFh.

Π’Ρ‹Π·ΠΎΠ² ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· Π½ΠΈΡ… β€” CALL, RET. Команда call ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π±Π»ΠΈΠΆΠ½Π΅ΠΉ ΠΈΠ»ΠΈ дальнСй ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ с Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΠ΅ΠΌ Π² стСкС адрСса Ρ‚ΠΎΡ‡ΠΊΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°. Команда ret Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΈΠ· ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, адрСс Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΈΠ· стСка. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

..code..
call 0455659
..more code..
Код с адрСса 455659:
add eax, 500
mul eax, edx
ret

Когда выполняСтся ΠΊΠΎΠΌΠ°Π½Π΄Π° call, процСссор ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ΄ с адрСса 455659, ΠΈ выполняСт Π΅Π³ΠΎ Π΄ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ret, Π° Π·Π°Ρ‚Π΅ΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π·Π° call. Код ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ вызываСтся ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ call называСтся ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΎΠΉ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ Π²Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ call.

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅: ΠΊΠΎΠΌΠ°Π½Π΄Π° call ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ рСгистр EIP (ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡŽΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ, которая Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π°) Π² стСк, Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° ret ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ Π΅Π³ΠΎ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‘Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ этому адрСсу. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, для Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹). Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· стСк:

push Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅_1
push Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅_2
call procedure

Π’Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Π½Ρ‹ ΠΈΠ· стСка ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹. Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, Ρ‚.Π΅. Π΄Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ сохранСны Π² стСкС. Π― Π½Π΅ Π±ΡƒΠ΄Ρƒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Ρ€Π°ΡΡΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠ± этом, ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π»Π΅Π³ΠΊΠΎ сдСлано Π² ассСмблСрах MASM ΠΈ TASM. ΠŸΡ€ΠΎΡΡ‚ΠΎ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΈ Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹.

Одно Π²Π°ΠΆΠ½ΠΎΠ΅ Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅:
рСгистр eax ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для хранСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹.
Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ ΠΊ функциям windows. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ рСгистр Π² Π²Π°ΡˆΠΈΡ… собствСнных ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°Ρ…, Π½ΠΎ это стандарт.

ΠŸΠ΅Ρ€Π²Π°Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π² ассСмблСрС MOV

Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для копирования значСния ΠΈΠ· ΠΏΡ€ΠΈΡ‘ΠΌΠ½ΠΈΠΊΠ° Π² источник. Бинтаксис ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

Mov ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊ, источник

Β 

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

Mov edx, ecx ; ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ

Β 

Π Π°Π·ΠΌΠ΅Ρ€ источника ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌΠΈ.

Mov al, ecx; Π½Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ

Β 

Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ пытаСтся ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ DWORD (32-Π±ΠΈΡ‚Π½ΠΎΠ΅) Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Π±Π°ΠΉΡ‚ (8 Π±ΠΈΡ‚ΠΎΠ²).

Β 

ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

Mov al, bl

Mov cl, dl

Mov cx, dx

Mov ecx, ebx

Β 

МоТно ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· памяти ΠΈ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² рСгистр. НапримСр, ΠΈΠΌΠ΅Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ схСму памяти:

смСщСниС 3A 3B 3C 3D 3E 3F
Π΄Π°Π½Π½Ρ‹Π΅ 0D 0A 7A 5E EF 7D FF AD C7

Β 

Π”Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ смСщСниС 3A: 25, 7A, 5E, 72, EF, ΠΈ Ρ‚. Π΄. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ со смСщСния 3A, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² рСгистр, ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ mov:

mov eax, dword ptr [0000003Ah] ; eax=725E7A25h

Β 

ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ самый младший Π±Π°ΠΉΡ‚ сохраняСтся Π² Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π·Π½Π°Ρ‡ΠΈΠΌΠΎΠΌ Π±Π°ΠΉΡ‚Π΅: порядок Π±Π°ΠΉΡ‚ΠΎΠ² Π·Π°Π΄ΠΎΠΌ Π½Π° ΠΏΠ΅Ρ€Π΅Π΄.

Β 

dword (32-Π±ΠΈΡ‚) Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 10203040 ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚ΠΈΡ€ΠΈΡ‡Π½ΠΎΠ΅ сохраняСтся Π² памяти ΠΊΠ°ΠΊ: 40, 30, 20, 10

word (16-Π±ΠΈΡ‚) Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 4050 ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚ΠΈΡ€ΠΈΡ‡Π½ΠΎΠ΅ сохраняСтся Π² памяти ΠΊΠ°ΠΊ: 50, 40

Β 

ΠŸΡ€ΠΈΠΌΠ΅Ρ€2:

mov cl, byte ptr [34h] ; cl ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0Dh

mov dx, word ptr [3Eh] ; dx ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 7DEFh

Β 

Π Π°Π·ΠΌΠ΅Ρ€Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… для прСфикса ptr:

Byte — 1 Π±Π°ΠΉΡ‚

Word — 2 Π±Π°ΠΉΡ‚Π°

Dword — 4 Π±Π°ΠΉΡ‚Π°

Β 

Π Π°Π·ΠΌΠ΅Ρ€ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ:

mov eax, [00403045h]

Β 

Β 

ΠŸΡ€ΠΈΠΌΠ΅Ρ€3:

mov eax, 403045h ; eax= 00403045h

mov cx, [eax] ; CX=Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Ρ€Π°Π·ΠΌΠ΅Ρ€Π° word) ΠΈΠ· памяти ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ Π² EAX (403045)

Β 


Π‘Ρ‚Π΅ΠΊΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ — PUSH, POP.

Π‘Ρ‚Π΅ΠΊ это ΠΎΠ±Π»Π°ΡΡ‚ΡŒ Π² памяти, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ рСгистр стСка ESP(SP). Π•ΡΡ‚ΡŒ Π΄Π²Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, для размСщСния значСния Π² стСкС ΠΈ извлСчСния Π΅Π³ΠΎ ΠΈΠ· стСка: PUSH ΠΈ POP. Команда PUSH Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² стСкС, Ρ‚.Π΅. ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ячСйку памяти, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ рСгистр ESP, послС этого Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ рСгистра ESP ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ Π½Π° 4. Команда POP ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· стСка, Ρ‚.Π΅. ΠΈΠ·Π²Π»Π΅ΠΊΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· ячСйки памяти, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ рСгистр ESP, послС этого увСличиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ рСгистра ESP Π½Π° 4. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Π½ΠΎΠ΅ Π² стСк послСдним, извлСкаСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

(1) mov ecx, 100

(2) mov eax, 200

(3) push ecx

(4) push eax

(5) xor ecx, eax

(6) add ecx, 400

(7) mov edx, ecx

(8) pop ebx

(9) pop ecx

Β 

Анализ:

1: ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ 100 Π² ecx

2: ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ 200 Π² eax

3: Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· ecx (=100) Π² стСкС (размСщаСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ)

4: Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· eax (=200) Π² стСкС (размСщаСтся послСдним)

5/6/7: Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π°Π΄ ecx, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ecx измСняСтся

8: ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ значСния ΠΈΠ· стСка Π² ebx: ebx=200.

9: ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ значСния ΠΈΠ· стСка Π² ecx: ecx=100.

Β 

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: Π Π°Π±ΠΎΡ‚Π° со стСком.

Π‘ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ 120A 120B
Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
Β Β Β Β Β  ESP Β Β Β Β 

ESP стоит Π² Ρ‚ΠΎΠΌ мСстС, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΠ½ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚)

Mov ax, 4560h

Push ax

Π‘ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ 120A 120B
Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
Β Β Β  ESP Β Β Β Β Β Β 

Mov cx, FFFFh

Push cx

Π‘ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ 120A 120B
Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ FF FF
Β  ESP Β Β Β Β Β Β Β Β 

Pop edx

Π‘ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ 120A 120B
Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ FF FF
Β Β Β Β Β  ESP Β Β Β Β 

edx = 4560FFFFh.

ΠŸΠ΅Ρ€Π΅ΡΡ‹Π»ΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ начиная с процСссора 8086.
mov <ΠΎΠΏΠ΅Ρ€Π°Π½Π΄_назначСния>, <ΠΎΠΏΠ΅Ρ€Π°Π½Π΄_источник>

xchg <ΠΎΠΏΠ΅Ρ€Π°Π½Π΄1>, <ΠΎΠΏΠ΅Ρ€Π°Π½Π΄2>

cmovcc <ΠΏΡ€ΠΈΡ‘ΠΌΠ½ΠΈΠΊ><источник>

bswap <рСгистр 32>

Β 

ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ mov:

1) нСльзя ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ пСрСсылку ΠΈΠ· ΠΎΠ΄Π½ΠΎΠΉ области памяти Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ. ΠŸΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΉ нСобходимости Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π±ΡƒΡ„Π΅Ρ€Π° любой доступный рСгистр ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния. ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ΠΏΠ΅Ρ€Π΅ΡΠ»Π°Ρ‚ΡŒ Π±Π°ΠΉΡ‚Ρ‹ ΠΈΠ· ячСйки памяти fls Π² ячСйку fld:

Data

Fls dd 947503b3h

Fld dd ?

Code

Start

—-

Mov eax, fls

Mov fld,eax

—-

End start

Β 

2) нСльзя Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ Π² сСгмСнтный рСгистр Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ нСпосрСдствСнно ΠΈΠ· памяти. Для выполнСния Ρ‚Π°ΠΊΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ (рСгистр ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния ΠΈΠ»ΠΈ стСк).

Β 

3) нСльзя ΠΏΠ΅Ρ€Π΅ΡΡ‹Π»Π°Ρ‚ΡŒ содСрТимоС ΠΎΠ΄Π½ΠΎΠ³ΠΎ сСгмСнтного рСгистра Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ сСгмСнтный рСгистр. Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ пСрСсылку ΠΌΠΎΠΆΠ½ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π² качСствС ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… рСгистры ΠΎΠ±Ρ‰Π΅Π³ΠΎ назначСния.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ рСгистр es Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ рСгистра ds:

Mov ax,ds

Move es,ax

МоТно Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ стСк ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ push ΠΈ pop:

Push ds ; ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ рСгистра ds Π² стСк

Pop es ; Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² es число ΠΈΠ· стСка

Β 

НСльзя ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сСгмСнтный рСгистр cs Π² качСствС ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π° назначСния.

Β 

5) ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ptr ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΈ ΠΊΠΎΠ³Π΄Π° трСбуСтся ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ². К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, трСбуСтся ΠΏΠ΅Ρ€Π΅ΡΠ»Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0ffh Π²ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π±Π°ΠΉΡ‚ поля flp:

Data

Flp dw ?

Code

start:

—-

mov byte ptr (flp+1),0ffh

—-

End start

Β 

Для Π΄Π²ΡƒΠ½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠΉ пСрСсылки Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ xchg. Π­Ρ‚Ρƒ ΠΆΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠ² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΊΠΎΠΌΠ°Π½Π΄ mov. ΠžΠ±Ρ‰ΠΈΠΉ Π²ΠΈΠ΄ записи:

Β 

XCHG <ΠΎΠΏΠ΅Ρ€Π°Π½Π΄1>, <ΠΎΠΏΠ΅Ρ€Π°Π½Π΄2>

Β 

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°2 копируСтся Π² ΠΎΠΏΠ΅Ρ€Π°Π½Π΄1, Π° староС содСрТимоС ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°1 β€” Π² ΠΎΠΏΠ΅Ρ€Π°Π½Π΄2. XCHG ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π½Π°Π΄ двумя рСгистрами ΠΈΠ»ΠΈ Π½Π°Π΄ рСгистром ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ.

НапримСр:

Xchg eax,ebx ; ΠΎΠ±ΠΌΠ΅Π½ΡΡ‚ΡŒ содСрТимоС рСгистров eax ΠΈ ebx.

Π’ΠΎ ΠΆΠ΅, Ρ‡Ρ‚ΠΎ Ρ‚Ρ€ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π½Π° языкС Π‘:

temp = eax;

eax = ebx;

ebx = temp;

Β 

Xchg al,al ; Π° эта ΠΊΠΎΠΌΠ°Π½Π΄Π° Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ

xchg ax, word ptr [si] ; ΠΎΠ±ΠΌΠ΅Π½ΡΡ‚ΡŒ содСрТимоС рСгистра Π°Ρ… ΠΈ слова Π² памяти ΠΏΠΎ адрСсу Π² [si].

Β 

Для условной пСрСсылки Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π°:

CMOVcc <ΠΏΡ€ΠΈΡ‘ΠΌΠ½ΠΈΠΊ><источник>

Β 

Набор ΠΊΠΎΠΌΠ°Π½Π΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ содСрТимоС источника Π² ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊ, Ссли удовлСтворяСтся Ρ‚ΠΎ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠ΅ условиС.

МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ CMOVcc сразу послС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ БМР (сравнСниС) с Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°ΠΌΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:



Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅:

ο»Ώ ο»Ώ

Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π² ассСмблСрС

Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Ρ†Π΅ΠΏΠΎΡ‡Π΅Ρ‡Π½Ρ‹ΠΌΠΈ ΠΈΠ»ΠΈ опСрациями Π½Π°Π΄ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ°ΠΌΠΈ Π±Π°ΠΉΡ‚ΠΎΠ².

Π‘Ρ‚Ρ€ΠΎΠΊΠ°-это Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° Π±Π°ΠΉΡ‚ΠΎΠ², для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ извСстСн Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ опрСдСлСния Π΅Π΅ Π΄Π»ΠΈΠ½Ρ‹.Π’ языках программирования ΠΏΡ€ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ опрСдСлСния Π΄Π»ΠΈΠ½Ρ‹ строки, Π° Ρ‚Π°ΠΊΠΆΠ΅ вводят ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, ΠΊΠ°ΠΊΠΈΠ΅ Π±Π°ΠΉΡ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ Π² строкС, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π² ΠΊΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ строки- сколько Π±Π°ΠΉΡ‚ΠΎΠ² ΠΊΠΎΠ΄ΠΈΡ€ΡƒΠ΅Ρ‚ символ, ΠΈ какая Ρ‚Π°Π±Π»ΠΈΡ†Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для сопоставлСния Π±Π°ΠΉΡ‚ΠΎΠ² ΠΈ символов.Π’ языкС Π‘ΠΈ ΠΏΠΎΠ΄ строкой понимаСтся ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±Π°ΠΉΡ‚ΠΎΠ², Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π°ΡΡΡ Π±Π°ΠΉΡ‚ΠΎΠΌ со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 0.

Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с ΠΎΠ΄Π½ΠΈΠΌ элСмСнтом строки: Π±Π°ΠΉΡ‚ΠΎΠΌ, словом, Π΄Π²ΠΎΠΉΠ½Ρ‹ΠΌ словом.Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Π»Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ Ρ‚Π°ΠΊΠΈΡ… элСмСнтов, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹-прСфиксы:

REP-ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ, ΠΏΠΎΠΊΠ° содСрТимоС ECX Π½Π΅ обратится Π² 0

REPE/REPZ-ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ ΠΏΠΎΠΊΠ° Ρ€Π°Π²Π½ΠΎ/Π½ΡƒΠ»ΡŒ. Π”Π°Π½Π½Ρ‹ΠΉ прСфикс заставляСт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΡΡ‚Ρ€ΠΎΠΊΠΎΠ²ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° содСрТимоС ECX Π½Π΅ обратится Π² 0

REPNE/REPZ-ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒ ΠΏΠΎΠΊΠ° Π½Π΅ Ρ€Π°Π²Π½ΠΎ/Π½Π΅ Π½ΡƒΠ»ΡŒ. Π”Π°Π½Π½Ρ‹ΠΉ прСфикс заставляСт Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΡΡ‚Ρ€ΠΎΠΊΠΎΠ²ΡƒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° содСрТимоС ECX Π½Π΅ обратится Π² 0

Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ строка -источник находится ΠΏΠΎ адрСсу DS:ESI(для нас это просто ESI),Π° строка-ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊΠΏΠΎ адрСса ES:EDI(для нас просто EDI). ВсС строковыС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π° ΡˆΠ΅ΡΡ‚ΡŒ Π³Ρ€ΡƒΠΏΠΏ:

1. ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ пСрСсылки

MOVSB — ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ строки Π±Π°ΠΉΡ‚ΠΎΠ².

MOVSW — ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ строки слов.

MOVSD — ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ строки Π΄Π²ΠΎΠΉΠ½Ρ‹Ρ… слов

Π’ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ Ρ‚Π°ΠΊΠΆΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ MOVS ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊ, источник-Π² этом случаС ассСмблСр ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ² сам опрСдСляСт, ΠΊΠ°ΠΊΡƒΡŽ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… Ρ„ΠΎΡ€ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄ слСдуСт Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ. Кобанда ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ элСмСнт строки ΠΈΠ· адрСса, опрСдСляСмого ESI, Π² адрСс, опрСдСляСмый EDI. ПослС выполнСния Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ содСрТимоС ESI ΠΈ EDI увСличиваСтся(Ρ„Π»Π°Π³ DF=0) ΠΈΠ»ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ(Ρ„Π»Π°Π³ DF=1) Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€Π°Ρ… элСмСнта строки

2. ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ сравнСния

CMPSB — сравнСниС строк Π±Π°ΠΉΡ‚ΠΎΠ².

CMPSW — сравнСниС строк слов.

CMPSD — сравнСниС строк Π΄Π²ΠΎΠΉΠ½Ρ‹Ρ… слов

3. ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ поиска(сканирования)

SCASB — сканированиС строки Π±Π°ΠΉΡ‚ΠΎΠ².

SCASW — сканированиС строки слов

SCASD — сканированиС строки Π΄Π²ΠΎΠΉΠ½Ρ‹Ρ… слов

4. ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ чтСния ΠΈΠ· строки

LODSB — Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Π±Π°ΠΉΡ‚Π° ΠΈΠ· строки.

LODSW — Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ слова ΠΈΠ· строки.

LODSD — Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ слова ΠΈΠ· строки.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ Ρ‚Π°ΠΊΠΆΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ LODS источник-Π² этом случаС ассСмблСр ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ² сам опрСдСляСт, ΠΊΠ°ΠΊΡƒΡŽ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… Ρ„ΠΎΡ€ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄ слСдуСт Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ. Команда осущСствляСт ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΠ· памяти, которая адрСсуСтся ESI, элСмСнта Π² AL,AX ΠΈΠ»ΠΈ EAX. ПослС выполнСния Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ содСрТимоС EDI увСличиваСтся Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ элСмСнта строки

5. Команда записи Π² строку

STOSB — запись Π±Π°ΠΉΡ‚Π° Π² строку.

STOSW — запись слова Π² строку.

STOSD — запись Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ слова Π² строку.

Π’ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ Ρ‚Π°ΠΊΠΆΠ΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ STOS ΠΏΡ€ΠΈΠ΅ΠΌΠ½ΠΈΠΊ, источник-Π² этом случаС ассСмблСр ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ² сам опрСдСляСт, ΠΊΠ°ΠΊΡƒΡŽ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… Ρ„ΠΎΡ€ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄ слСдуСт Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ. Команда осущСствляСт ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ, которая адрСсуСтся EDI, элСмСнта ΠΈΠ· AL,AX ΠΈΠ»ΠΈ EAX. ПослС выполнСния Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ содСрТимоС EDI увСличиваСтся Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ элСмСнта строки

6. ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ чтСния/записи строки ΠΈΠ· ΠΏΠΎΡ€Ρ‚Π°

ΠŸΡ€ΠΈ использовании прСфиксов (REP, REPZ/REPE, REPNZ/REPNE)дСйствиС ΠΊΠΎΠΌΠ°Π½Π΄ распространяСтся Π½Π° Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ Π±Π°ΠΉΡ‚ΠΎΠ².

ИспользованиС строковых ΠΊΠΎΠΌΠ°Π½Π΄

// string.cpp: опрСдСляСт Ρ‚ΠΎΡ‡ΠΊΡƒ Π²Ρ…ΠΎΠ΄Π° для консольного прилоТСния.
//
Β 
#include "stdafx.h"
#include <windows.h>//Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ DWORD
#include <stdio.h> //Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ printf
#include <conio.h>//Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ _getch()
/*ОбъявлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ*/
DWORD lens (char *);//функция опрСдСлСния Π΄Π»ΠΈΠ½Ρ‹ строки
void cats(char*, char*,char*);//функция слияния Π΄Π²ΡƒΡ… строк Π² Ρ‚Ρ€Π΅Ρ‚ΡŒΡŽ
/*ОбъявлСниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…*/
char a[]="fdhfjliop";
char b[]="12345";
char c[]="4";
Β 
int _tmain(int argc, _TCHAR* argv[])
{
	__asm{
		/*ΠΌΡ‹ собираСмся Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ cats,которая своими ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ 3 указатСля
		Π½Π° строку Ρ‚ΠΈΠΏΠ° char(Π² порядкС a,b,c).  Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° cats ΠΌΠΎΠ³Π»Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹,
		ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌΡ‹Π΅ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΈΡ… Π² стСк(Π² порядкС c,b,a), Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Ρ€ΠΎΠ²Π½ΡΡ‚ΡŒ стСк */
		LEA EAX,c;//ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ Π² рСгистр EAX адрСс ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ элСмСнта строки c
		PUSH EAX;//ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ содСрТимоС EAX Π² стСк
		LEA EAX,b;//ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ Π² рСгистр EAX адрСс ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ элСмСнта строки b
		PUSH EAX;//ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ содСрТимоС EAX Π² стСк
		LEA EAX,a;//ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ Π² рСгистр EAX адрСс ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ элСмСнта строки a
		PUSH EAX;//ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ содСрТимоС EAX Π² стСк
		CALL cats;//Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ
		ADD ESP,12;// Π²Ρ‹Ρ€Π°Π²Π½ΠΈΠ²Π°Π΅ΠΌ стСк
	};
	printf("%s\n",c);//Π²Ρ‹Π²ΠΎΠ΄ΠΈΠΌ ΡΡƒΠΌΠΌΠ°Ρ€Π½ΡƒΡŽ строку
	_getch();
	return 0;
}
Β 
//функция опрСдСлСния Π΄Π»ΠΈΠ½Ρ‹ строки
DWORD lens (char * s)
{
    DWORD l=0;
	__asm
    {
	    CLD;//Π·Π°Π΄Π°Π΅ΠΌ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ сканирования (сбрасываСм Ρ„Π»Π°Π³ DF-Ρ„Π»Π°Π³ направлСния).
		//Π΄Π°Π½Π½Ρ‹ΠΉ Ρ„Π»Π°Π³ учитываСтся Π² строковых опСрациях.Если
Π£Ρ‡Π΅Π±Π½Ρ‹Π΅ пособия ΠΏΠΎ

AVR — ΠŸΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ сборки

AVR Assembly ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ использованиС ΠΊΠΎΠ΄Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. ΠŸΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ — ΠΎΠ΄ΠΈΠ½ ΠΈΠ· самых эффСктивных способов ΠΎΠ±Π»Π΅Π³Ρ‡ΠΈΡ‚ΡŒ Π²Π°ΡˆΡƒ Тизнь, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π΅Π»Π°Π΅Ρ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅, ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ снова ΠΈ снова.

Однако, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΡŽ The Stack Pointer .

Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ стСка

Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ стСка — это ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ рСгистр Π² памяти Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° пространство, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ Π² SRAM, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ Π‘Ρ‚Π΅ΠΊ .Π‘Ρ‚Π΅ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ хранСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ рСгистров ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° адрСсов ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ стСка — это 16-разрядный рСгистр, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Π²ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… ΠΊΠ°ΠΊ SPH ΠΈ SPL. Π’ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°Ρ… с ΠΎΡ‡Π΅Π½ΡŒ малСньким объСмом SRAM SPH Π½Π΅ трСбуСтся, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ SPL.

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ стСк начинаСтся с ΠΊΠΎΠ½Ρ†Π° SRAM ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ расти ΠΎΡ‚ Π±ΠΎΠ»Π΅Π΅ высоких Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ адрСса, ΠΊΠΎΠ³Π΄Π° Π² Π½Π΅ΠΌ хранятся Π΄Π°Π½Π½Ρ‹Π΅. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ стСка всСгда ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π²Π΅Ρ€Ρ…Π½ΠΈΠ΅ стСка.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ указатСля стСка

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ стСк, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ стСка Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ адрСсом Π² SRAM. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ стСка находится Π² памяти Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π°, значСния ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹ Π² Π½Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ инструкции out. На Π±ΠΎΠ»Π΅Π΅ Π½ΠΎΠ²Ρ‹Ρ… AVR ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ стСка Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ послСдним Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ SRAM ΠΏΡ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ питания, Π½ΠΎ Π½Π° Π±ΠΎΠ»Π΅Π΅ старых ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ настроСн Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΏΡ€ΠΈ запускС любой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, ΠΏΠΎΠΊΠ°Π·Π°Π½ Π½ΠΈΠΆΠ΅

.
  ldi r16, ΠΠ˜Π—ΠšΠ˜Π™ (RAMEND); Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ младший Π±Π°ΠΉΡ‚ RAMEND Π² r16
Π²Ρ‹Ρ…ΠΎΠ΄ SPL, r16; ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ r16 Π² Π½ΠΈΠΆΠ½Π΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ стСка
ldi r16, Π’Π«Π‘ΠžΠšΠ˜Π™ (RAMEND); Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ Π±Π°ΠΉΡ‚ RAMEND Π² r16
ΠΈΠ· SPH, r16; ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ r16 Π² высоком ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ стСка  

ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π° RAMEND ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π²ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ ΠΊΠ°ΠΊ послСдний адрСс Π² SRAM.Для ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ΠΎΠ² RAMEND — это 16-Π±ΠΈΡ‚Π½Ρ‹ΠΉ адрСс, поэтому ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π±ΠΈΡ‚ Π½Π° 8-Π±ΠΈΡ‚Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ с функциями HIGH ΠΈ LOW для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π² Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ рСгистр. На Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°Ρ… RAMEND ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ мСньшС 16 Π±ΠΈΡ‚, ΠΈ Π² этом случаС SPH Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ, Π° SPL — СдинствСнный рСгистр, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

  ldi r16, RAMEND; Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ RAMEND Π² r16
Π²Ρ‹Ρ…ΠΎΠ΄ SPL, r16; ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ r16 Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ стСка  

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π₯отя Π±ΠΎΠ»Π΅Π΅ Π½ΠΎΠ²Ρ‹Π΅ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Ρ‹ автоматичСски ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ стСка RAMEND ΠΏΡ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ питания, рСкомСндуСтся всСгда ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π­Ρ‚ΠΎ Π·Π°Ρ‰ΠΈΡ‰Π°Π΅Ρ‚ вас ΠΎΡ‚ указатСля стСка, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ с Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ мСста Π² случаС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ сброса.

Π₯Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² стСкС

ПослС ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ указатСля стСка рСгистры ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ сохранСны ΠΈΠ»ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹ Π² стСк — это называСтся , наТимая ΠΈΠ»ΠΈ выталкивая соотвСтствСнно. Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ для этого ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π½ΠΈΠΆΠ΅.

МнСмоника ОписаниС
Π½Π°ΠΆΠΈΠΌΠ°Ρ‚ΡŒ push-рСгистр Π² стСкС
насСлСниС ΠΏΠΎΠΏ-рСгистр ΠΈΠ· стСка

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ push ΠΈ pop просты Π² использовании:

  push r0; ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ r0 Π² стСк
pop r0; Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ r0 ΠΈΠ· стСка  

Когда push вызываСтся с рСгистром, содСрТимоС этого рСгистра сохраняСтся Π² Π²Π΅Ρ€Ρ…Π½ΠΈΡ… стСка, Ρ‚.Π΅.Π΅. адрСс, Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΉ Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ стСка. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ стСка автоматичСски ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ΡΡ Π½Π° Π΄ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ push (ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ стСк растСт ΠΎΡ‚ Π±ΠΎΠ»Π΅Π΅ высокого адрСса ΠΊ ΠΌΠ»Π°Π΄ΡˆΠ΅ΠΌΡƒ).

Когда ΠΊΠΎΠΌΠ°Π½Π΄Π° pop вызываСтся с рСгистром, Π² этот рСгистр загруТаСтся содСрТимоС Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ стСка. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ стСка автоматичСски увСличиваСтся Π½Π° Π΄ΠΎ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ pop.

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° рСгистра Π² стСк Π½Π΅ стираСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ рСгистра, Π° просто ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ содСрТимоС Π² SRAM.Аналогично, , Π²Ρ‹Ρ‚Π°Π»ΠΊΠΈΠ²Π°ΡŽΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· стСка, Π½Π΅ стираСт содСрТимоС этого адрСса Π² стСкС.

ΠŸΡ€ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… рСгистров Π² стСк, ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ pop Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π² порядкС , ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ , Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ значСния Π² ΠΈΡ… исходныС рСгистры, Ρ‚.Π΅.

  push r0; ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ содСрТимоС r0 Π² стСк
Π½Π°ΠΆΠΌΠΈΡ‚Π΅ r1; ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ содСрТимоС r1 Π² стСк
Π½Π°ΠΆΠΌΠΈΡ‚Π΅ r2; ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ содСрТимоС r2 Π² стСк

pop r2; Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ содСрТимоС r2
pop r1; Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ содСрТимоС r1
pop r0; Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ содСрТимоС r0  

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π½Π° это особоС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π²Ρ‹Π·ΠΎΠ² Π²ΡΠΏΠ»Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… инструкций Π² Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ порядкС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡŽ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π² Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ рСгистры. НапримСр

  ldi r16,0x01; Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ r16 с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ 0x01
ldi r17,0x02; Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ r17 с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ 0x02

Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ r16; ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ r16 Π² стСк
Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ r17; ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ r17 Π² стСк

pop r16; Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ r16 (Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ = 0x02)
pop r17; Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ r17 (Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ = 0x01)  

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ содСрТимоС r16 ΠΈ r17 мСняСтся мСстами, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ инструкции pop Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² порядкС, ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ Ρ‚ΠΎΠΌΡƒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±Ρ‹Π» Π²Ρ‹Π·Π²Π°Π½ push (ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Ссли Π²Ρ‹ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ мСстами содСрТимоС Π΄Π²ΡƒΡ… рСгистров Π±Π΅Π· использования Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ, это ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ способ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это!).

ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅: РСгистры Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½Ρ‹ ΠΈΠ· стСка Π² порядкС, ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ Ρ‚ΠΎΠΌΡƒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ Π±Ρ‹Π»ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈΡ… исходныС значСния.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Ρƒ нас Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ указатСля стСка, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌ.

ΠŸΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

ΠŸΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ — это ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² любой Ρ‚ΠΎΡ‡ΠΊΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Когда вызываСтся ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ адрСс Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π² стСк.Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ½ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅Ρ‚ ΠΊ мСсту ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ ΠΊΠΎΠ΄ Ρ‚Π°ΠΌ. Когда достигаСтся ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°, адрСс Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ , выскочит ΠΈΠ· стСка , ΠΈ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Π΅Ρ‚ ΠΊ инструкции сразу ΠΆΠ΅ послС Π²Ρ‹Π·ΠΎΠ²Π° ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ для Π²Ρ‹Π·ΠΎΠ²Π° ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΈΠ· ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Π½ΠΈΠΆΠ΅.

МнСмоника ОписаниС
Π·Π²ΠΎΠ½ΠΎΠΊ Π΄Π»ΠΈΠ½Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹
icall косвСнный Π²Ρ‹Π·ΠΎΠ² ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹
Π·Π²ΠΎΠ½ΠΎΠΊ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹
Ρ€Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

Π’Ρ‹Π·ΠΎΠ² ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ

НиТС ΠΏΠΎΠΊΠ°Π·Π°Π½ простой ΠΊΠΎΠ΄, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ.

  ldi r16,0x01; Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ r16 с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ 0x01
ldi r17,0x02; Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ r17 с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ 0x02

call addReg; ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π·ΠΎΠ²Π°

Ρ†ΠΈΠΊΠ»: Ρ†ΠΈΠΊΠ» rjmp; бСсконСчная пСтля

addReg:
Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ r16, r17; Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ r16 ΠΈ r17

ret; Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹  

Π’Ρ‹Π·ΠΎΠ² инструкции ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ с ΠΌΠ΅Ρ‚ΠΊΠΎΠΉ нашСй ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ addReg. ИспользованиС инструкции Π²Ρ‹Π·ΠΎΠ²Π° заставит ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΊΠ΅, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ‚Π°ΠΌ ΠΊΠΎΠ΄ ΠΈ, ΠΊΠΎΠ³Π΄Π° Π±ΡƒΠ΄Π΅Ρ‚ достигнута инструкция ret, вСрнСтся ΠΊ инструкции сразу послС Π²Ρ‹Π·ΠΎΠ²Π° — Π² этом случаС бСсконСчный Ρ†ΠΈΠΊΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ установили с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ rjmp.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ явно ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π² ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΊΠ°ΠΊ Π² случаС с функциями Π² C. Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π΅Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΡƒΠΆΠ΅ находятся Π² рСгистрах r16 ΠΈ r17.

ΠŸΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Ρ‹ ΠΈΠ· всСго ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ пространства с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ call ΠΈΠ»ΠΈ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π° расстоянии Π΄ΠΎ 4К слов с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ rcall.

  rcall doSomething; Π²Ρ‹Π·ΠΎΠ² ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ doSomething
...; Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄

сдСлай Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ:
...; ΠΊΠΎΠ΄ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹
ret; Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹  

ПослСдний ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²Ρ‹Π·ΠΎΠ²Π° ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, icall, являСтся Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹ΠΌ, Ρ‡Π΅ΠΌ это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ здСсь, Π½ΠΎ для ΠΏΠΎΠ»Π½ΠΎΡ‚Ρ‹ ΠΎΠ½ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ адрСсу ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠΉ Π² ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Z.

  ldi ZL, LOW (doSomething); адрСс Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ doSomething
ldi ZH, HIGH (Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ); Π² Z ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ

Π― звоню				; косвСнный Π²Ρ‹Π·ΠΎΠ² doSomething

сдСлай Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ:
...; ΠΊΠΎΠ΄ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹
ret; Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹  

ΠšΠΎΡΠ²Π΅Π½Π½Ρ‹Π΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² зависимости ΠΎΡ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ выполнСния. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это рСализуСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ поиска, Π° Π½Π΅ с явной Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ldi, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π²Ρ‹ΡˆΠ΅.

РСгистры сохранСния

Когда вызываСтся ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ рСгистры, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π°ΠΌ понадобятся ΠΏΠΎΠ·ΠΆΠ΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅.Π§Ρ‚ΠΎΠ±Ρ‹ этого Π½Π΅ происходило, рСгистры ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² стСк Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π° Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² ΠΊΠΎΠ½Ρ†Π΅.

НапримСр, Ссли ваша ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° измСняСт r16 ΠΈ r17, ΠΈΡ… значСния ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ, Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ² Π² ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

  rcall doSomething; ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π·ΠΎΠ²Π°

...; ΠΎΡΡ‚Π°Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

сдСлай Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ:
Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ r16; ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ r16 Π² стСк
Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ r17; ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ r17 Π² стСк

...; ΠΊΠΎΠ΄ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

pop r17; Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ r17 ΠΈΠ· стСка
pop r16; Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ r16 ΠΈΠ· стСка

ret; Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ ΠΈΠ· ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹  

Cortex-M3

Π”ΠžΠ‘ΠΠ’Π˜Π’Π¬ ADD R0, R1, Operand2
ADD R0, R1, 12 Π±ΠΈΡ‚ конст.

R0 = R1 + R2
N, Z, C, V S
АЦП АЦП R0, R1, R2
АЦП R0, R1, 8 Π±ΠΈΡ‚, постоянная

R0 = R1 + R2 + C
N, Z, C, V S
Π”ΠžΠ‘ΠΠ’Π˜Π’Π¬ ADD R0, R1, 12 Π±ΠΈΡ‚ конст. 12 Π±ΠΈΡ‚ N, Z, C, V
ΠŸΠžΠ” SUB R0, R1, R2
SUB R0, R1, 12 Π±ΠΈΡ‚ конст.

R0 = R1 — R2
N, Z, C, V S
SBC SBC R0, R1, R2
SBC R0, R1, 8 Π±ΠΈΡ‚, конст.

R0 = R1 — R2 — Π‘
N, Z, C, V S
SUBW SUB R0, R1, 12 Π±ΠΈΡ‚, конст. 12 Π±ΠΈΡ‚ N, Z, C, V
RSB RSB R0, R1, R2
RSB R0, R1, 8 Π±ΠΈΡ‚, конст.
RSB R0, R1, R2, ASR β„– 23

.
R0 = R2 — R1 R0 = 8 Π±ΠΈΡ‚ const — R1
N, Z, C, V S
ADR ADR R0, этикСтка +/- 12 Π±ΠΈΡ‚
ADR.W R0, этикСтка +/- 32 Π±ΠΈΡ‚
.
LDR
STR
LDR R0, [R1, # 8bit const.]! —
LDR R0, [R1], # 8bit const.-
LDRB R0, [R1] —
STRB R0, [R1], β„– 1
/
.
B =, SB = ()
H =, SH = ()
LDR
STR
LDR R0, [R1, R2, {LSL # 0..3}]
STR R0, [R1, R2, {LSL # 0..3}]
.
B, SB, H, SH
LDR
LDRD
LDR R0, этикСтка
LDRD R0, R1, этикСтка
.
B, SB, H, SH
STR / STRD.
LDRT
STRT
.
LDR / STR.
LDRD
STRD
LDRD R0, R1, [R2, # 10bit const.]! —
LDRD R0, R1, [R2], # 10Π±ΠΈΡ‚ конст. —
LDRD R0, R1, [R2] —
STRD R0, R1, [R2]
/
.
4.
Π›Π”Πœ
БВМ
LDM R0, {R1-R3}
LDM R0 !, {R1-R3} — R0
IA, DB, FD, EA -.
/.
IA —
Π”Π‘ -.
PUSH
POP
НАЖАВЬ {R0, R2-R7, R12}
POP {R0, R2-R7, R12}
/
LDREX
STREX
LDREX R1, [R2, # 10Π±ΠΈΡ‚ конст.]
STREX R0, R1, [R2, # 10bit const.]
/.
B =, H =.
CLREX CLREX ().
BFC BFC R0, #lsb, # ΡˆΠΈΡ€ΠΈΠ½Π°
BFI BFI R0, R1, #lsb, # ΡˆΠΈΡ€ΠΈΠ½Π° R1 R0
UBFX UBFX R0, R1, #lsb, # ΡˆΠΈΡ€ΠΈΠ½Π° R1.R0
SBFX SBFX R0, R1, #lsb, # ΡˆΠΈΡ€ΠΈΠ½Π° R1. R0
UXTB
UXTH
UXTB R0, R1 {, ROR β„– 8,16,24}
SXTB
SXTH
SXTB R0, R1 {, ROR β„– 8,16,24}

8086 Руководство ΠΏΠΎ сборщику для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ… (Ρ‡Π°ΡΡ‚ΡŒ 9)

8086 Π£Ρ‡Π΅Π±Π½ΠΈΠΊ ассСмблСра для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ… (Ρ‡Π°ΡΡ‚ΡŒ 9)

Π‘Ρ‚Π΅ΠΊ

Π‘Ρ‚Π΅ΠΊ — это ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти для хранСния Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ….Π‘Ρ‚Π΅ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ инструкциСй CALL для сохранСния адрСса Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° для ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, RET Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· стСка ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊ этому ΡΠΌΠ΅Ρ‰Π΅Π½ΠΈΡŽ. Π‘ΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Ρ‚ΠΎ ΠΆΠ΅ самоС происходит ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ инструкции INT ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π½ΠΈΠ΅ сохраняСтся Π² рСгистрС Ρ„Π»Π°Π³ΠΎΠ² стСка, сСгмСнтС ΠΊΠΎΠ΄Π° ΠΈ смСщСнии. IRET инструкция ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΈΠ· прСрывания.

ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ стСк для хранСния Π»ΡŽΠ±Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… Π΄Π°Π½Π½Ρ‹Ρ…,
Π΅ΡΡ‚ΡŒ Π΄Π²Π΅ инструкции, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ со стСком:

PUSH — сохраняСт 16-Π±ΠΈΡ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² стСкС.

POP — ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ 16-Π±ΠΈΡ‚Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· стСка.

Бинтаксис для инструкции PUSH :
PUSH REG 
PUSH SREG
PUSH memory
PUSH Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹ΠΉ
Π Π•Π“. : AX, BX, CX, DX, DI, SI, BP, SP.

SREG : DS, ES, SS, CS.

ΠΏΠ°ΠΌΡΡ‚ΡŒ : [BX], [BX + SI + 7], 16-битная пСрСмСнная ΠΈ Ρ‚. Π”.

Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ : 5, -24, 3Fh, 10001101b ΠΈ Ρ‚. Π”. …


Бинтаксис для инструкции POP :
POP REG 
POP SREG
ΠŸΠ°ΠΌΡΡ‚ΡŒ POP
Π Π•Π“. : AX, BX, CX, DX, DI, SI, BP, SP.

SREG : DS, ES, SS (ΠΊΡ€ΠΎΠΌΠ΅ CS).

ΠΏΠ°ΠΌΡΡ‚ΡŒ : [BX], [BX + SI + 7], 16-битная пСрСмСнная ΠΈ Ρ‚. Π”.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ:

  • PUSH ΠΈ POP Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с 16-Π±ΠΈΡ‚Π½Ρ‹ΠΌΠΈ значСниями!
  • ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ΠΠΠ–ΠœΠ˜Π’Π• Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° процСссорах 80186 ΠΈ Π½ΠΎΠ²Π΅Π΅!

Π‘Ρ‚Π΅ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ LIFO (Last In First Out),
это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ссли ΠΌΡ‹ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ эти значСния ΠΎΠ΄Π½ΠΎ Π·Π° Π΄Ρ€ΡƒΠ³ΠΈΠΌ Π² стСк:
1, 2, 3, 4, 5
ΠΏΠ΅Ρ€Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΡ‹ ΠΏΠΎΠΏΠ°Π΄Π΅Ρ‚ Π½Π° ΠΏΠΎΠΏΡƒ Π±ΡƒΠ΄Π΅Ρ‚ 5 , Π·Π°Ρ‚Π΅ΠΌ 4 , 3 , 2 , ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌ 1 .

ΠžΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ€Π°Π²Π½ΠΎΠ΅ количСство PUSH s ΠΈ POP s, ΠΈΠ½Π°Ρ‡Π΅ стСк ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½ ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π΅Π³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС. Как Π²Ρ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅Ρ‚Π΅, ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ RET для Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅. систСма, поэтому ΠΏΡ€ΠΈ запускС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² стСкС Π΅ΡΡ‚ΡŒ адрСс Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ это 0000Ρ‡).

инструкции PUSH ΠΈ POP особСнно ΠΏΠΎΠ»Π΅Π·Π½Ρ‹, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ слишком ΠΌΠ½ΠΎΠ³ΠΎ рСгистров для Ρ€Π°Π±ΠΎΡ‚Ρ‹, поэтому Π²ΠΎΡ‚ Ρ‚Ρ€ΡŽΠΊ:

  • Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ исходноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ рСгистра Π² стСкС (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ PUSH ).
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ рССстр для Π»ΡŽΠ±Ρ‹Ρ… Ρ†Π΅Π»Π΅ΠΉ.
  • Π’ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ исходноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ рСгистра ΠΈΠ· стСка (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ POP ).

Π’ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:
ORG 100Ρ‡

MOV AX, 1234h
PUSH AX; ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ AX Π² стСкС.

MOV AX, 5678h; ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ AX.

POP AX; Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ исходноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ AX.

RET

ΠšΠžΠΠ•Π¦ 

Π”Ρ€ΡƒΠ³ΠΎΠ΅ использованиС стСка — ΠΎΠ±ΠΌΠ΅Π½ значСниями,
здСсь ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

ORG 100Ρ‡

MOV AX, 1212h; Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ 1212h Π² AX.MOV BX, 3434h; Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ 3434h Π² BX


PUSH AX; ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ AX Π² стСкС.
PUSH BX; ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ BX Π² стСкС.

POP AX; установитС AX Π² исходноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ BX.
POP BX; установитС BX Π² исходноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ AX.

RET

ΠšΠžΠΠ•Π¦ 

ОбмСн происходит ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ стСк ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ LIFO (Last In First Out), поэтому, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π½Π°ΠΆΠΈΠΌΠ°Π΅ΠΌ 1212h , Π° Π·Π°Ρ‚Π΅ΠΌ 3434h , ΠΏΡ€ΠΈ pop ΠΌΡ‹ сначала ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ 3434h ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ послС Π½Π΅Π³ΠΎ 1212Ρ… .

ΠžΠ±Π»Π°ΡΡ‚ΡŒ памяти стСка задаСтся рСгистром SS (сСгмСнт стСка) ΠΈ SP (стСк Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ) зарСгистрируйтС. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ опСрационная систСма устанавливаСт значСния этих рСгистров Π½Π° запуск ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ Β« PUSH source Β» выполняСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия:

  • Π’Ρ‹Ρ‡Ρ‚ΠΈΡ‚Π΅ 2 ΠΈΠ· рСгистра SP .
  • Π—Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ источник ΠΏΠΎ адрСсу SS: SP .

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ Β« POP destination Β» выполняСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия:
  • ЗаписываСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ адрСсу SS: SP Π² destination .
  • Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ 2 Π² рСгистр SP .

Π’Π΅ΠΊΡƒΡ‰ΠΈΠΉ адрСс, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ SS: SP , называСтся Π²Π΅Ρ€ΡˆΠΈΠ½ΠΎΠΉ стСка .
ΠžΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *