X86 assembler: erinevus redaktsioonide vahel
Eemaldatud sisu Lisatud sisu
Resümee puudub |
Resümee puudub |
||
76. rida:
* EBX – baasregister – üldine baasregister adresseerimisel
* ECX – loendregister – tsükliloendur ja võrdlusregister
* EDX – andmeregister – laiend-akumulaator, aritmeetika ja andmete üldregister
Aadressiregistrid:
* ESP – pinuviit – viitab programmi pinu otsale (''stack pointer'')
113. rida:
* Laienduste registrid (MMX, SSE jms).
<source lang="asm">
mov eax, [integer_value] ; load dword[integer_value]
121. rida:
mov [integer_value], eax ; write dword[integer_value]
</source>
Loeb globaalse muutuja '''integer_value''' registrisse ''EAX
Programmeerimiskeeles [[C
== Käsutüübid ==
=== MOV ja
'''MOV
<source lang="asm">
mov eax, edx ; EAX dword <- EDX dword
135. rida:
mov ah, dl ; EAX hi <- EDX lo
</source>
'''MOVZX
<source lang="asm">
mov bl, 40 ; BL := 0x28
movzx eax, bl ; EAX := 0x00000028
</source>
'''MOVSX''' – ''Move with sign extend
<source lang="asm">
mov bl, -32 ; BL := 0xE0
146. rida:
</source>
x86 mäluadresseerimise saab kokku võtta valemiga '''[baas + indeks*skalaar + nihe]''', kus: * Baas
* Indeks
* Skalaar
* Nihe
Lühike näide
<source lang="asm">
; static int array[4] = { 0, 1, 2, 3 };
157. rida ⟶ 158. rida:
; int i = 2;
; int a = ptr[i + 1];
mov ebx, array ; baasregister viitab
mov eax, 2 ; indeksregister i = #2 element
mov eax, [ebx + eax*4 + 4] ; a = ptr[i + 1]
169. rida ⟶ 170. rida:
Seega on võimalikke kombinatsioone piisavalt iga vastava juhu jaoks.
=== Põhikäsud ===
'''push''' – ''Push to stack
<source lang="asm">
push eax ; lükkab EAX-i väärtuse pinusse
push dword[array] ; lükkab 4 baiti aadressilt @array pinusse
</source>
'''pop''' – ''Pop from stack
<source lang="asm">
pop dword[array] ; korjab pinust väärtuse ja kirjutab aadressile @array
pop eax ; korjab pinust väärtuse ja kirjutab registrisse EAX
</source>
'''lea''' – ''Load effective address
<source lang="asm">
lea ebx, [array] ; @array aadress liigutatud EBX-i, sama mis ''mov ebx, array''
186. rida ⟶ 187. rida:
=== Aritmeetika ja Loogika ===
'''add,sub''' – ''Integer Addition/Subtraction
<source lang="asm">
add eax, 4 ; eax += 4
193. rida ⟶ 194. rida:
sub eax, 10 ; eax -= 10
</source>
'''inc,dec''' – ''Integer Increment/Decrement
<source lang="asm">
inc eax ; ++eax
199. rida ⟶ 200. rida:
inc dword[ebx] ; ++[ebx]
</source>
'''imul''' – ''Integer Signed Multiplication
<source lang="asm">
imul eax, edx ; eax *= edx
206. rida ⟶ 207. rida:
imul eax, [ebx], 10 ; eax = [ebx]*10
</source>
'''idiv''' – ''Integer Signed Division
<source lang="asm">
xor edx, edx ; edx ^= edx; -> edx = 0
213. rida ⟶ 214. rida:
idiv eax ; eax /= eax
</source>
'''and, or, xor''' – ''Bitwise logical and, or
<source lang="asm">
xor edx, edx ; edx ^= edx
220. rida ⟶ 221. rida:
and eax, 0x0F ; eax &= 0x0F
</source>
'''not''' – ''Bitwise logical not''. Pöörab bitid ümber. Väärtus võib olla register või adresseeritud mälu.
<source lang="asm">
not eax ; eax = !eax
not dword[ebx] ; *ebx = !*ebx
</source>
'''neg''' – ''Arithmetic negate''.
<source lang="asm">
neg eax ; eax = -eax
</source>
'''shl,shr''' – ''Logical Shift Left/Right''. Nihutab bitte loogiliselt vasakule/paremale, üle ääre nihutatud bitid kaovad ja lisatud bitid on nullid. Näiteks 0b10011100 << 2 = 0b00111000
<source lang="asm">
shl eax, 1 ; eax = eax << 1 ; sama kui eax*2
235. rida ⟶ 236. rida:
shr eax, 2 ; eax = eax >> 2 ; sama kui eax/4
</source>
'''sar,sal''' – ''Arithmetic Shift Left/Right''. Nihutab bitte aritmeetiliselt vasakule/paremale. Arvestab, et tegu võib olla negatiivse arvuga ning säilitab vajadusel negatiivsusbiti.
<source lang="asm">
movsx eax, 0b10000000
243. rida ⟶ 244. rida:
=== Programmivoo käsud ===
Programmivoo käske kasutatakse programmi loogiliseks juhtimiseks. Madalamal tasemel implementeeritakse nende
'''jmp''' – ''Unconditional jump''. Hüppab määratud sümbolile, muutes programmi käivitusasukohta. Otseselt muutub EIP register.
<source lang="asm">
jmp begin ;
</source>
'''jcondition''' – ''Conditional jump''. Hüppab sümbolile ainul siis, kui kindel tingimus on täidetud. Need käsud sõltuvad protsessori FLAGS registrist. Kõige tähtsamad bitid on Zero Flag (ZF) ja Sign Flag (SF). Kõik aritmeetilised käsud mõjutavad protsessori FLAGS registrit. Näiteks käsk ''xor eax, eax'' tõstab Zero Flagi (ZF). Täpsemalt saab lugeda FLAGS registrist Wikipedias.
<source lang="asm">
je label ; jump if equal (ZF=1)
266. rida ⟶ 267. rida:
jecxz label ; jump if ECX register == 0
</source>
'''cmp''' – ''Signed compare''. Teostab märgitundliku lahutustehte kahe operandi vahel ja uuendab protsessori FLAGS registrit. Märgatavalt ZF ja SF. Võrdluskäsku kasutame ainult siis, kui on vaja võrrelda kahe operandi vahet (suurem/väiksem?).
<source lang="asm">
cmp [len], 0 ; len ?? 0
273. rida ⟶ 274. rida:
jg .loop ; eax > edx ? .loop
</source>
'''test''' – ''Equality test''. Teostab loogilise AND tehte kahe operandi vahel ja uuendab FLAGS registrit. Uuenevad ZF ja SF. Test käsku kasutame ainult siis kui on vaja testida kahe operandi võrdsust või juhul kui mõni register on väärtusega 0.
<source lang="asm">
test eax, ecx ; eax ?? ecx
280. rida ⟶ 281. rida:
jz .loop1 ; eax == 0 ? .loop1
</source>
'''loop''' – ''Looping instruction''. Teostab tsüklihüppe juhul kui ECX != 0 ja vähendab ECX-i 1 võrra.
<source lang="asm">
mov eax, 0 ; sum = 0
291. rida ⟶ 292. rida:
==Näited==
Paar näidet
'''Netwide Assembler''' ''(NASM) ''töötab mitme platvormi peal ning on sisult väga lihtne. NASM on populaarne just Linux/Unix
=== "Hello world!" 32-
<source lang="asm">
; Hello World programm
303. rida ⟶ 304. rida:
; \masm32\bin\link.exe /ENTRY:main /SUBSYSTEM:CONSOLE helloworld.obj
;
.386 ; kasuta
.model flat, stdcall ; 32-bit, stdcall win32 API jaoks
360. rida ⟶ 361. rida:
</source>
=== "Hello world!" 32-
<source lang="asm">
; ----------------------------------------------------
399. rida ⟶ 400. rida:
* [[Programmeerimiskeel_Assembler|Programmeerimiskeel Assembler]]
* [[Assemblerkeel]]
* [[
* [[C (programmeerimiskeel)|C]]
==Välislingid==
*[https://en.wikibooks.org/wiki/X86_Assembly| Wikibooks: X86 Assembly]
*[http://www.cs.virginia.edu/~evans/cs216/guides/x86.html| University of Virginia: X86 Assembly]
|