------------------------------------ Opis podstawowych rozkazow asemblera ------------------------------------ Rejestry procesora 8086 AX,BX,CX,DX - 16 bitowe(1 slowo czyli 2 bajty) ogolnego przeznaczenia Te skladaja sie z mniejszych 8 bitowych rejestrow - starszego(h) i mlodszego(l): AH,BH,CH,DH,AL,BL,CL,DL CS,DS,SS,ES - 16 bitowe rejestry segmentowe,przy czym: CS - segment kodu DS - segment danych SS - segment stosu ES - segment dodatkowy DI,SI - 16 bitowe rejestry indeksujace pamiec(D-cel,S-zrodlo) SP - wskaznik stosu BP - rejestr uzywany do adresowania pamieci Rejestr znacznikow S - znacznik znaku Z - znacznik zera C - znacznik przeniesienia O - znacznik nadmiaru I - znacznik dostepnosci przerwan D - znacznik kierunku P - znacznik parzystosci Oto podstawowe mnemonniki: MOV a,b - przenies zawartosc b do a Przy czym "a" moze byc rejestrem, wtedy "b" moze byc takze rejestrem lub adresem komorki pamieci,np: mov ah,byte ptr ds:[100] - przenies setny bajt z segmentu danych do rejesru ah W innym przypadku to "a" moze byc adresem,a "b" rejestrem Nalezy pamietac,ze nie mozna przenosic do siebie zawartosci reje- strow segmentowych,np intsrukcja: mov cs,ds - w procesie kompilacji bedzie bledem Totez by np. przenies zawartosc rejestru ds do cs trzeba wpierw przenies zawartosc ds do innego rejestru ogolnego przeznaczenia i dopiero jego zawartosc do cs,np. mov ax,cs ;ax:=cs mov ds,ax ;ds:=ax ; - oznacza komentarz czyli tekst programisty nie brany pod uwage przez kompilator PUSH a - odlozenie na wierzcholek stosu "a", gdzie "a" jest rejestrem 16 bitowym,lub konkretna wartoscia.Zwiekszenie SP o jeden,np. push ax - zapisz na wierzcholek stosu zawartosc ax POP a - zdjecie ze stosu "a", rozkaz zdejmuje 16 bitow ze stosu,zmniejsze- nie SP o jeden,np. pop cx - zdjecie slowa ze stosu i jego zapis do cx ADD a,b - dodanie do "a" wartosci "b" np. add ax,cx - ax:=ax+cx Uwaga operacja moze byc przeprowadzona na rejestrach o tej samej dlugosci jak i inne np. przenoszenia!! SUB a,b - odjecie od "a" wartosci "b" np. sub ax,cx - ax:=ax-cx INC a - zwiekszenie "a" o jeden DEC a - zmniejszenie "a" o jeden MUL a - mnozenie. Jesli "a" jest 8 bitowe to: ax:="a"*al czyli wtedy bedzie to iloczym "a" i rejestru al zapisany do ax Jesli "a" jest rejestrem 16 bitowym to: dx:ax:="a"*ax czyli w parze rejestrow dx,ax zostanie umieszczony wynik iloczynu ax przez "a",gdzie dx to starsza czesc wyniku ,ax to mniej DIV a - dzielenie.Jesli "a" jest 8 bitowe to: ax:=ax / a wtedy al - iloraz,ah - reszta Jesli "a" jest 16 bitowe to dx:ax:=dx:ax / a wtedu dx - iloraz(czesc calk. wyniku),ax - reszta ROL a,b - przesuniecie zawartosci "a" o 1 bit w lewo gdy "b" to 1,np. rol al,1 Lub jesli "b" to CL wowczas o jego zawartosc ROR a,b - przesuniecie zawartosci "a" o 1 bit w prawo gdy "b" to 1,np. rol al,1 Lub jesli "b" to CL wowczas o jego zawartosc NOT a - negacja logiczna zawartosci "a",zmiana kazdego bitu "a" na przeciwny NEG a - negacja logiczna ostatniego bitu "a" - bit znaku AND a,b - iloczyn logiczny "a" i "b",wynik w "a",np. and ax,bx gdy ax = 1100010b, a bx = 1011000b to ax = 10000000 Iloczyn logiczny polega na tym, ze gdy wykonujemy go na dwoch bitach to wynikiem jest jeden gdy oby dwa bity sa jedynkami TEST a,b - to samo co and ale wynik nie jest nigdzie umieszczany a jedynie modyfikowane sa znaczniki OR a,b - suma logiczna "a" i "b",wynik w "a".Gdy wykonujemy or na dwoch bitach to w wyniku jeden gdy jeden z bitow jest jedynka XOR a,b - roznica arytmetyczna "a" i "b",wynik w "a".Gdy wykonujemy xor na dwoch bitach to w wyniku zero gdy oby dwa bity to jedynki JMP a - skok pod adres "a",gdzie "a" moze byc nazwa etykiety(nazwa:) JE/JZ a - skok pod "a" gdy Z=1 JNE/JNZ a - skok pod "a" gdy Z=0 JS a - skok pod "a" gdy S=1 JNS a - skok pod "a" gdy S=0 JC a - skok pod "a" gdy C=1 JNC a - skok pod "a" gdy C=0 JO a - skok pod "a" gdy O=1 JNO a - skok pod "a" gdy O=0 LOOP a - skok pod adres "a" jesli cx jest inne od zera,jesli zostal wykonany skok to cx jest zmniejszane o 1.Rozkaz sluzy do tworzenia petli CALL a - skok pod adres "a" z mozliwoscia powrotu rozkazem ret.Rozkaz sluzy to wywolywania procedur.Rozkaz odklada na stosie odpowiednie dane dla powrotu totez trzeba zadbac by nie zostaly zniszczone bo zastosowanie rozkazu ret mozne doprowadzic do zawieszenie kompute- ra "a" moze byc tez konkretnym adresem np. segment danych i offset - czyli numer bajtu w tym segmencie do ktorego skaczemy,np. call cs:[bx] - skocz pod bajt o numerze bx w segmencie cs RET - powrot z procedury(zdjecie ze stosu odpowiednich wartosci) INT a - wywolanie przerwania o numerze "a",np. int 10h NOP - brak czynnosci IN AL,DX - przeslanie bajtu z portu o numerze w DX do AL IN AX,DX - przeslanie slowa z portu o numerze w DX do AX IN AL,a - przeslanie bajtu z portu o numerze w "a" do AL IN AX,a - przeslanie slowa z portu o numerze w "a" do AX OUT DX,AL - przeslanie slowa z AL do portu o numerze w DX OUT DX,AX - przeslanie slowa z AX do portu o numerze w DX OUT a,AL - przeslanie slowa z AL do portu o numerze w "a"(0-255) OUT a,AX - przeslanie slowa z AX do portu o numerze w "a"(0-255) CLC - C=0 STC - C=1 CLD - D=1(znacznik kierunku) STD - D=1 CLI - I=0 STI - I=1 MOVSB - przekopiowanie bajtu spod DS:[SI] do bajtu ES:[DI] i zwiekszenie lub zmniejszenie SI i DI w zaleznosci od znacznika D CMP a,b - adjecie "b" od "a" bez umieszczania nigdzie wyniku,ale ustawienie znacznikow w zaleznosci od wyniku Autor tekstu: Piotr Soko�owski,1 lutego 1998r
akunseth