Proč se zajímat o tak starej procesor?
Protože kvůli zpětný kompatibilitě se všechny procesory spouštěj v reálnym
režimu, kerej je kompatibilní právě s tímhle procesorem.
Procesor dokáže provádět programy ve strojovym kódu. Jenomže ve strojovym kódu
se programuje špatně. Proto byly vyvinutý programovací jazyky, kerý se daj
převejst do strojovýho kódu. První programovací jazyk byl Assembler (assembly
language), kerej se dá převejst do strojovýho kódu a zpátky. Instrukce na
týhle stránce jsou v Assembleru.
ax - accumulator
cx - counter
dx - data
bx - base
sp - stack pointer
bp - base pointer
si - source index
di - destination index
es - extra segment
cs - code segment
ss - stack segment
ds - data segment
ip - instruction pointer
flags
Bit | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Význam | cf - carry | pf - parity | af - auxiliary | zf - zero | sf - sign | tf - trace | if - interrupt | df - decrement | of - overflow |
al - bity 0-7 registru ax
cl - bity 0-7 registru cx
dl - bity 0-7 registru dx
bl - bity 0-7 registru bx
ah - bity 8-15 registru ax
ch - bity 8-15 registru cx
dh - bity 8-15 registru dx
bh - bity 8-15 registru bx
Adresa se skládá ze segmentu a offsetu. Zapisuje se segment:offset.
Lineární adresa = fyzická adresa = segment * 16 + offset.
Adresa právě prováděný instrukce je cs:ip.
Adresa posledního záznamu v zásobníku je ss:sp.
mov ax, 6 ; Do registru ax se uloží hodnota 6
mov ax, cx ; Do registru ax se uloží hodnota registru cx
mov byte ptr [0x100], 6 ; Na adresu ds:256 se uloží hodnota 6
mov word ptr [0x100], 6 ; Na adresu ds:256 se uloží hodnota 6 jako 2 bajty
mov ax, [0x100] ; Do registru ax se uloží hodnota na adrese ds:256 (2 bajty)
mov [0x100], ax ; Na adresu ds:256 se uloží hodnota registru ax (2 bajty)
mov es:[bx+0x100], ax ; Na adresu es:bx+256 se uloží hodnota registru ax (2 bajty)
mov [si+bx+0x100], ax ; Pokud není uvedeno jinak, bere se segment ds
mov [di+bx+0x100], ax
mov [si+bp+0x100], ax
mov [di+bp+0x100], ax
mov [si+0x100], ax
mov [di+0x100], ax
mov [bp+0x100], ax
mov [bx+0x100], ax
mov es:[bx+0x100], ax ; Jako segment se bere es
xchg A, B ; prohodí hodnoty A a B
cmp A, B ; Porovná hodnoty A a B (A-B)
jz/je L | jump if zero/equal | if A == B then goto L |
jnz/jne L | jump if not zero/not equal | if A != B then goto L |
jc/jb L | jump if carry/below | if unsigned A < B then goto L |
jnc/jnb/jae L | jump if not carry/not below/above or equal | if unsigned A >= B then goto L |
ja L | jump if above | if unsigned A > B then goto L |
jna/jbe L | jump if above/below or equal | if unsigned A <= B then goto L |
jl L | jump if less | if integer A < B then goto L |
jnl/jge L | jump if not less/greater or equal | if integer A >= B then goto L |
jg L | jump if greater | if integer A > B then goto L |
jng/jle L | jump if not greater/less or equal | if integer A <= B then goto L |
js L | jump if sign | |
jns L | jump if not sign | |
jp/jpe L | jump if parity even | |
jnp/jpo L | jump if not parity/parity odd | |
jo L | jump if overflow | |
jno L | jump if not overflow |
push A ; sp=sp-2; ss:[sp]=A
pop A ; A=ss:[sp]; sp=sp+2
pushf ; push flags
popf ; pop flags
clc ; clear cf (nuluj cf)
stc ; set cf (nastav cf)
cli ; clear if
sti ; set if
cld ; clear decrement (pro instrukce movsb a podobně)
std ; set decrement
jmp L ; Skočí na L
jmp A:B ; Skočí na adresu A:B
jmp [bx+0x100] ; Skočí na hodnotu uloženou na adrese ds:bx+256
call L ; Volá funkci L
call [bx+0x100] ; Volá funkci, jejíž adresa je uložená na adrese ds:bx+256 (2 bajty)
ret ; Návrat z funkce
call A:B ; Volání vzdálený funkce (v jinym segmentu)
call dword ptr [bx+0x100] ; Volá funkci, jejíž adresa je uložená na adrese ds:bx+256 (4 bajty)
retf ; Návrat ze vzdálený funkce
int N ; Volá přerušení číslo N
iret ; Návrat z přerušení
in al, 60h ; Do registru al se uloží hodnota portu 60h. Pouze pro porty 0-255
in al, dx
in ax, dx ; Do ax se uložej 2 bajty z portu dx
out 20h, al
out dx, al
out dx, ax
inc A | A=A+1 |
dec A | A=A-1 |
add A, B | A=A+B |
adc A, B | A=A+B+cf (add with carry) |
sub A, B | A=A-B |
sbb A, B | A=A-B-cf (subtraction with borrow) |
and A, B | A=A and B |
or A, B | A=A or B |
xor A, B | A=A xor B |
test A, B | A and B - pouze nastaví flags |
not A | A=~A |
neg A | A=-A |
mul B | unsigned dx:ax = ax * B |
imul B | integer dx:ax = ax * B |
div B | unsigned ax = dx:ax / B; dx = dx:ax % B |
idiv B | integer ax = dx:ax / B; dx = dx:ax % B |
rol A, cl | rotate left | ... |
ror A, cl | rotate right | ... |
rcl A, cl | rotate left through carry | ... |
rcr A, cl | rotate right through carry | ... |
shl A, cl | shift left | ... |
shr A, cl | shift right | ... |
sal A, cl | shift arithmetic left | ... |
sar A, cl | shift arithmetic right | ... |
movsb ; [es:di] = [ds:si]; di++; si++; Pokud je zapnutej decrement: di--, si--
movsw ; word[es:di] = word[ds:si]; di+=2, si+=2
cmpsb ; cmp [ds:si], [es:di]; di++; si++
cmpsw
scasb ; cmp al, [es:di]
scasw
lodsb ; al = [ds:si]; si++
lodsw
stosb ; [es:di] = al; di++
stosw
Lze je kombinovat s prefixem rep/repz/repnz:
rep movsb ; provede operaci movsb tolikrát, kolik je hodnota cx
repz cmpsb ; provádí, pokud se hodnoty rovnají, maximálně cx-krát
repnz cmpsb
Koprocesor obsahuje 8 80-bitovejch registrů značenejch st0..st7
fld A/st(i)
fst A
fstp A
fldenv A
fldcw A
fnstenv A
fnstcw A
fxch st(i)
fadd A/st(i)
fmul A/st(i)
fcom A/st(i)
fcomp A/st(i)
fsub A/st(i)
fsubr A/st(i)
fdiv A/st(i)
fdivr A/st(i)
fiadd A
fimul A
ficom A
ficomp A
fisub A
fisubr A
fidiv A
fidivr A
fnop
fchs
fabs
ftst
fxam
fld1
fldl2t
fldl2e
fldpi
fldlg2
fldln2
fldz
f2xml
fyl2x
fptan
fpatan
fxtract
fprem1
fdecstp
fincstp
fprem
fyl2xp1
fsqrt
fsincos
frndint
fscale
fsin
fcos
Kompletní seznam instrukcí viz dokument "Instruction Set Reference".