ASSEMBLER strona 1 Definicje ASSEMBLER Mnemonik Dyrektywa Operandy (argumenty) - liczby i inne nazwy z prawej strony mnemoników, oddzielamy je przecinkiem, Instrukcja! " # Instrukcja maszynowa - binarny odpowiednik instrukcji Komentarz#$%;% Liczba - szesnastkowa: %H&$# %0 1202H, 0A010H #' zwyczajnie - ósemkowa: %Q lub O. - binarna: %B EOL = Carrier Return (13) + Line F()" * $ # : NAZWA w Asemblerze WORD 2 + DWORD 4 + QWORD 8 10 bajtów TBYTE 10 paragraf PARA 16 strona PAGE 256 segment SEGMENT 65536 (!"# ") Architektura mikroprocesora * ##,-cykl rozkazowy,. pojedynczej instrukcji. Na jeden cykl rozkazowy przypada kilka cykli maszynowych+ # kilku cykli zegarowych. Jeden cykl zegarowy wykonywany jest w jednym takcie zegara. Poszczególne cykle maszynowe +,/' BU"0 # #+ $# IU"0 +potok). EU "0 123,,# " AU"0 #!!, 1+$ #+,+ 4/ #5/# #, Adresy 67),8 # 7+,-segmentu (okienko 65536- + #+# " #offset"$+# #,8+ # #,.#offsetu( ## (20 - bitowego) o jeden bajt, natomiast (! "#%(& ## segmentu o 16 bajtów (adres segmentowy - adres paragrafu). (! ) - adres nie jest jednoznaczny,9$ # #(:+!!(:+7 #++#, Zapis adresu - w postaci: <segment> : <offset> 0100H:0001H.
ASSEMBLER strona 2 Dekodowanie adresu (:7)# +;",<(:!!,* adres 20-bitowy. Bufor obrazu 8=>55$,8 # ')?@))A")?)))A",B$ 7'(8=>55 $7 ;",8 )CA,-#+,9(:)+, (!"3 $ # bajty (np. write() ) Data BIOS# )DDDD')))E,!!)(E", < $+8=>55 '25/04/97 Restart (zimny) - w BIOS zapisana pod adresem 0FFFF:0000 instrukcja skoku do procedury startowej. Rejestry Rejestry segmentowe+(:+, CS (code segment" #,8+# #$ #>= DS (data segment"#,3 + SS (stack segment" ES (extra segment) - zawiera adres dodatkowego segmentu danych Dodatkowe rejestry segmentowe (386 / 486) FS i GS - (nazwa od kolejnych liter alfabetu" + (!" "+, Rejestry ogólnego przeznaczenia +! przechowywanie offsetów: BX, BP, SP, SI, DI,8# #+,'SS : SP. (!"B!!++8F>F<F, ++'@ # +'AX, BX, CX, DX. Odpowiednio # '8X = AH + AL,= +MSB (most significant byte"lsb (least significant byte) Rejestry 32-bitowe (386 / 486) * +?-=-=5<5" G7+ nazwa 32-bitowego odpowiednika tworzona jest zgodnie ze schematem: AX EAX. (!"B EAX to AX) * H- rejestr IP!!+# #,->-/#5-$+ maszynowa. (! ) ## CS:IP (! ) 5- $ Rejestr znaczników (!"(:#$+( + +,* #$$ + +",* @)@:#I+,6!"#' OF (overflow flag) $# przeznaczenia DF (direction flag) - znacznik kierunku nie wskazuje niczego, (!",J<D#K+L +)# +,/( STD, 0 - CLD. (!"$K)L
ASSEMBLER strona 3 IF (interrupt enable flag" >-/ STI (na 1) oraz CLI)",9$$)#, TF (trap flag) SF (sign flag) - znacznik znaku ustawiany, gdy wynik operacji jest ujemny (1 na najstarszym bicie), zerowany - wynik dodatni. ZF (zero flag) - znacznik zera ustawiony, gdy wynikiem operacji jest 0 (! ), zerowany, gdy cokolwiek innego. AF (auxiliary carry flag) - znacznik przeniesienia pomocniczego # kodowanych binarnie - BCD - bajt traktowany jako para 4-bitowych nybli!)i, PF (parity flag" $ + jest parzysta, zerowany - gdy nieparzysta. CF (carry flag) - znacznik przeniesienia,d#!stc (CF = 1), CLC (CF = 0), CMC (CF = -CF) AC (alignment check";@:"#+ # ;,* ;@:$#G7# # + + +, Kopiowanie rejestru flag 32M nale y u yæ stosu - naspierw PUSHF a potem POP Rodzaje danych i adresacje Instrukcje wymagaj# H+ H+ ) i adresu! operand przeznaczenia). Operand przeznaczenia stoi za zwyczaj,mov DX, AX <F 8FH+, Rodzaje danych 5G + ' Dane natychmiastowe#adresowaniu natychmiastowemu - dana zawarta jest w segmencie kodu zaraz po ", (! "3 H+$ @ +@H+", Dane natychmiastowe to #,MOV AX, 1 < +!! # $(:@ ", Dane rejestrowe >-/,<# #adresowaniu rejestrowemu (ukrytemu). Sprowadza # ' MOV AX, BX - w BX jest dana rejestrowa, która zostanie zapisana jako dana rejestrowa w AX. (!"H+@+(:, < ##$(3? #,!"* #$ + #,<,B +$ #,B# # [ ], którymi wskazujemy, w jakich + #, = $' (!"* przedrostka zmiany segmentu. [ <rejestr_offsetu> ] [BX] - # dla BX i offsetu zawartego w BX [ <rejestr_bazowy> + <rejestr_indeksu> ] [BX + DI] - # # segmentu DS!!+$?F<5 (!" +! ## " [ <rejestr_bazowy> + <dana_natychmiastowa> ] [SI + 1] - $ # - <N O #$"#!!", (!"# + " # ##+#"
ASSEMBLER strona 4 [ <rejestr_bazowy> + <rejestr_indeksu> + <dana_natychmiastowa> ] [BX + DI + 7] - adresowanie indeksowe # # #<=!!+!!++$, (!"# + + <rejestr_bazowy> wskazuje adres tablicy, <rejestr_indeksu> - element tablicy (rekord), <dana_natychmiastowa> - konkretne pole w danym # $+ " Adresowanie wielowymiarowe - dla tablic o wielu wymiarach <NO Pdana_natychmiastowa> - pole w rekordzie, <rejestr_indeksu> - konkretny element +$"K)L"' nr_wiersza * nr_kolumny <$# +,*!! $,* $+!!,B#$$ #' DS dla offsetów BX, SI, DI SS dla offsetu SP (!" SP dla BP 9$ $ przedrostka zmiany segmentu w postaci <rejestr_segmentu> :!!,ES:[BX], CS:[SI], ES:[BX + DI] itd. Tworzenie programu exe 6 G',3 #+, =!# =4J3 4BQ' PO=4J34BQR SR SR%nazwa_klasy ] np. MojeDane SEGMENT. gdzie: PO R S$ # $' BYTE - od pierwszego wolnego bajtu WORD PARA - od pierwszego wolnego adresu podzielnego przez 16 PAGE - od pierwszego wolnego adresu podzielnego przez 256 (!"$ $ #-818 R S! + $' PUBLIC# ++# #+ + COMMON# + $T $# + MEMORY ( AT <NO - segment zostanie umieszczony pod adresem segmentowym znanym w czasie $ PNO STACK =Q8>6 +$ równej ich sumie (!"9$ $ #PRIVATE#, [ N&S +$# #+ 6!$ENDS +PO, 6! +" END poza +,8# # 4B<, 8 +,7)U(E) w kodzie programu,2 # $ #! 4V/",3+ NOT <op> po obliczeniu zostanie $,B2QPop>.!"#$%&#$%'#$ B "'.486 (MASM/TASM) lub P486N (TASM). 9+ @)@:W@)@@+ $-/=AD!-2-D$#@)@:$,
ASSEMBLER strona 5 7@:+ (7(; zastosowanie) # @)@:,9$7@:$, 386 - rejestr AC zawsze równy 0 $# mamy 386, w przeciwnym razie 486 Segment stosu Adres segmentu stosu przechowuje SS,9 <2=,1 (6? +! <2=?52=, =#==') #, B SP wskazuje na koniec stosu (SS + rozmiar stosu). 3 #===='=-# =='=- Szczyt stosu",3 #==')=='=-# #, SS + rozmiar SS:0 ( - zmniejsza#=- =='=-,2# PUSH$7@:" natychmiastowej) lub PUSHF!", PUSHF PUSH AX PUSH [BX] PUSH 21H (!"2 (+@,? # '=='=-=='=-( (!" $ @)@:" Zdejmowanie ze stosu. # # $=-,1# POP (ogólne) lub POPF (dla flag). (!"2$(@", POPF POP AX POP [BX] Inicjalizacja stosu <!# DUP (patrz: Segment danych) np. DB 64 DUP( STACK!!! ); (!" #$!,%&"# H <4?/J,Q# Segment danych Typ danych - w asemblerze oznacza rozmiar danych. SS:SP Definiowanie zmiennych <!$#"! : DB (define byte) - definiuj bajt DW (define word)! DD (define double)! + DQ! + DT!()+E+" np. <*XKL#7+, (! ) W przypadku gdy zmienna L(: #'MOV AL, zm, $ typów @+K #L(:+,B+specyfikatora zmiany typu.. #$,zmienna DW 0FFFFH.
ASSEMBLER strona 6 )*+,.+string" #,3 # +,- ##DB (! ) +#+,>+ # lub $ +8=>55,Q #<?(#,Q <?, Y+! +,3 + + %, np. lancuch DB Ala, ma kota, $ Eol DB 0DH, OAH, $ <$ $ $ "#! ' -. EQU $ - <*+,. 'PO#$ PN O$ - zwraca +,* PN O stringu, $ - na pierwszy bajt zaraz po #PO#$+stringu np. Napis DB Ala ma kota, ale kot jest zielony Dl EQU $ - Napis )/(, 9$ ## ze stringówdup,.!# ' <nazwa_zmiennej> DB <ile> DUP( <N O" <? PO + <N O string, liczba lub? # #, np. Nazwa DB 10 DUP( Luke ) ; Nazwa zajmie 40B Temp DB 10 DUP(?) ; Temp zajmie 10B, nie inicjalizowana (! ) - #'Usizeof ( <N O" Zmienne anonimowe Q#, DB 100 DUP(?),<# # #, (! ) - offset zmiennej w DST$++#!$ Dyrektywa LABEL <$$ #,3 # #' <nazwa_zmiennej> LABEL <N #O gdzie: <N #O,WORD, DWORD B## + #+! jednej z dyrektyw definicji zmiennych (DB, DW). Z <NO# nie trzeba #specyfikatora zmiany typu ", Tablice <!# DB + # stringu lub </-"+ $ </- T$ +, Tab DB 1234567890 ()+()+(, Tab DB 100 DUP( 12 ) + ())+7, 3,DW+ # ",-' Tab DW 0B800H DW 0A000H DW 0000H... (!"-# +#, wówczas,9$ n-+$n. (!"2 #$elem. tablicy (n"!$k7l #i-tego #i*n+ =AY
ASSEMBLER strona 7 (!"-#, wówczas rejestr $"#, (!"+# ' <nazwa_tablicy>[ <indeks> ] np. tab[2] PO+,1$"+ definiowania tablicy (np. DB, DW ), ewentualnie od zadeklarowanego dla <NO # dyrektywy LABEL. Szybkie odwzorowania - tworzenie +i-tym #$i. ( f ( i )",Q# ",<#f( i ), '$i T)+C$i = (+7, 0 <! # EQU + +# +,!,", Stala EQU 2-7*4 Imie EQU Cindy Data EQU 0FFFF:0005 (! ) EQU dziala jak #define, na etapie $, Zmiana typu * #$ +# # (",B4J5B><4>B2Q $ #np. B4J ",2# specyfikatorów zmiany typu - BYTE PTR, WORD PTR itp. np. NEG BYTE PTR [BX] (!"$, (!"* @+ (: (: specyfikator zmiany BYTE PTR i zostanie tam zapisana starsza +, MOV AL, BYTE PTR Zmienna Segment kodu Definiowanie Etykiet Etykieta$ #T w kodzie, adres segmentu itp. ). *!+, /T ##>=,4#!## ' <etykieta> : gdzie <etykieta> - dowolny string np. Tutaj : (!"2#,MOV SI, Tutaj. 12!(+3+ -+ #,=,B# END # tej etykiety. ((+,3 <+ +8==/3 4,/# # 'ASSUME CS:Kod, DS:Dane, SS:Stos, gdzie Kod, Dane i Stos to etykiety - nazwy +,2#Dane SEGMENT a Dane ENDS #!#Dane SEGMENT a Dane ENDS# # #!,B #$. (!"B <=,B $ #,1## +' mov AX, Dane mov DS, AX
ASSEMBLER strona 8 Procedury Definiowanie - PROC +Tnazwa procedury,b#!# # ENDP +, Moja PROC mov AX, Dane mov DS, AX dec CX. ret Moja ENDP * CALL <nazwa_procedury> np. call Moja. >8YY!! = 2B = 16b) i skacze do wskazanego miejsca. (! ) - -#RET + >8YY14Q, (!" #$, 4* - "$,5 #KL #!,8 #,B +#$#!# $, Moja PROC ; zabezpieczenie wart. rejestrow push AX pushf XOR AX, AX ;modyfikowany rejestr AX CMP AX, zmienna ;modyfikowane flagi ; przywrocenie wartosci z momentu wywolania popf pop AX ret Moje ENDP Przekazywanie parametrów do procedur przez odpowiednie rejestry #++,"! procedura zwróci wynik przez stos $$$, * $,!" # zawiera adres powrotu z procedury $ "# =='R=-7S (3+++++ * # + # #K L,= =-,B $ #,D#?-,* + +$ $=-# #+ #?-;?-:, -# + # ' Moja PROC ;zabezpieczenie rejestrów push BP push AX push BX! "#$%&''()*+#$%, *+#$%-)$+ ; pod SP+8 - adres powrotu z procedury dla RET mov BP, SP mov BX, [BP+10] mov AX, [BP+12] pop BX pop AX pop BP ;do BX trafia drugi. ;do AX pierwszy
ASSEMBLER strona 9 ret Moja ENDP - ' push arg1 push arg2 call Moja pop arg2 pop arg2 '/0 / 1' (!"* $++$ -2-$#,* # ADD SP, N gdzie N$+, Zmienne lokalne 9$ $,*# $N - bajtów miejsca (SUB SP, N ). W tym momencie mamy do dyspozycji N+,< #?-+ +=-, (!"9$ #,+ #?- #N+ +# $?-#N np. mov BP, SP )$%," sub SP, 4 mov BP, SP ;SP wskazuje na ostatn222 ; pod BP + 8 - pierwszy. (!"* 8<<=-N. (!"-, sub SP, 4; mov BP, SP ;OPIS ZMIENNYCH LOKALNYCH: )$"1 )$%&"1 ''& +( *!+ +H $ tej procedury. <#( +! $ ",<#,!$$ +# -12>#! $ # +, DodajDomysl PROC mov AX, 2 mov BX, 2 Dodaj: add AX, BX ret DodajDomysl ENDP * $#'CALL < N$O. (! ) < ' nazwa procedury co dana procedura robi $ +$ wej. +! $ $
ASSEMBLER strona 10 Makroinstrukcje 3 KLpreprocesingu asemblacji. 2#, Definiowanie 3!#!"!# ## ' <nazwa_makra> MACRO <parametr1>, <parametr2>, P Oparametry +preprocesingu) argumenty. Parametr makra" $3 8>12! Argument makra$, 2 + +"# P O <!#ENDM. (! ) - etykiety lokalne! ",* 7 3 8>12" ' LOCAL <etykieta1>, <etykieta2>, 4#!, -$ +" Gotoxy MACRO WspX, WspY LOCAL Petla, Koniec mov DH, WspX mov DL, WspY Petla: dec CX Koniec:mov AX,[BX] ENDM (!"14Q " (! ) - przed ENDM nie stoi nazwa makra (!"$#+ parametrów (##+ parametrze $ # ) + +$ $ # #). "# ' <nazwa_makra> <argument1>, <argument2>, np. Gotoxy 10, 20 (!" #+ +",.arg., (!">8YY Przekazywanie dalekiego adresu +!!$, #!"#LES wg. schematu: Clrscr MACRO AdresBuf, Czymczysc LES DI, DWORD PTR AdresBuf * ' Clrscr 0B800H:0000H, Wzorzec programu exe ;---------------------------SEGMENT STOSU - START Stos SEGMENT STACK DB 64 DUP ( STACK!!! ) Stos ENDS ;---------------------------SEGMENT STOSU - KONIEC ;---------------------------SEGMENT DANYCH - START Dane SEGMENT Zmienna DB Dane ENDS ;---------------------------SEGMENT DANYCH - KONIEC ;---------------------------SEGMENT KODU - START Kod SEGMENT assume CS:Kod, DS:Dane Main PROC Start: ( mov AX, Dane ; )0 3#45
ASSEMBLER strona 11 mov DS, AX mov AH, 4CH mov AL, 0 int 21H Main ENDP '/ 67#82' '39979:3;3: Kod ENDS ;---------------------------SEGMENT KODU - KONIEC END Start Program typu com zbiory.+,e(7+,exe) programy.# :;6? dla programów.com stos jest generowany automatycznie, miejsce na niego przydzielane jest w ramach segmentu $$ # program.! NEAR) " 7E:?PSP + #<2=" ' ORG 100H Wzorzec programu Kod SEGMENT assume CS:Kod, DS:Kod, SS:Kod ORG 100H Start: jmp Main 0'( 4 Zmienna DB Main PROC NEAR ret Main ENDP Kod ENDS END Start Tworzenie programu wynikowego H+ Warning: No STACK segment! ) EXE2BIN,exe na.com 5++ -,- #,- # ' nie posiada punktu startowego (nic po END) T+ " +" #" $$procedury $" # segmentu kodu: PUBLIC <etykieta1>, <etykieta2>, PO# $ * #$!$ -12>4B<- $ # dane ' PUBLIC <zmienna1>, <zmienna2>, #$! + zmienne (np. <?<* </-" )
ASSEMBLER strona 12 (!"$ #$ =4J3 4BQ #PUBLIC. (!" te same nazwy+ #$, (!" +ASSUME. -' """""""""""""""""" """""""""""""""""" Dane Dane Kod SEGMENT PUBLIC PUBLIC Eol, Ekran Eol DB 0DH, 0AH, $ 2em Ekran DW 184FH ; y = 18H = 24D, x = 4FH = 79D ENDS SEGMENT PUBLIC PUBLIC DodajDomysl, Dodaj ASSUME CS:Kod, DS:Dane DodajDomysl PROC mov AX, 2 mov BX, 2 Dodaj: add AX, BX ret DodajDomysl ENDP Kod ENDS END (+,+ $ $ # #' EXTERN <nazwa_procedury> : PROC np. EXTERN ClrScr: PROC <#K!L#$,8 ###, (!"<# (!"9$ +$, $ danych! ' EXTERN <nazwa_zmiennej> : <specyfikator_typu>, gdzie specyfikator typu$$ + ",3 # $' BYTE, WORD, DWORD#! <?<*<<, (!"J# KstringL DUP( ) jest ona definiowana przy pomocy dyrektywy DB BYTE - ' EXTERN Eol:BYTE, Ekran:WORD (!"- ##specyfikatora typu -12> (! ) Deklaracja ta jest w segmencie danych 6!+ Z.obj +# # + +, Biblioteki makr?#! + segmentu kodu). Plik taki ma rozszerzenie.mac,* (KL +" # INCLUDE +#, Przerwania / /## #. W odpowiedniej chwili oprócz!0kod typu,3 +7E:+ +,B 0 ;,<# + +,2 +
ASSEMBLER strona 13, )",- programów Przerwania programowe * K)L#7E: ;77 #"++ " (6?183,6 adres - wektor przerwania. Tabela ta zwana jest +,-#?52=<2= $,* <2=Tnumer przerwania) # " #+, * # INT <numer_przerwania> np. INT 21H. Przed skokiem do odpowiedniej procedury (przerwania) INT wykonuje: $+("!#5D $ "QD >=!!5- $ 8 + IRET+ przeciwne do INT. (! ) istnieje warunkowa wersja INT INTO (overflow) Przerwania zarezerwowane -)(DA 5&,3,#!' )00$# ) (0 0# debugowanie krok po kroku 2 0 G0 0 # ;00#, -7)AGDA <2=, 7) 0 7( 0 <2= 22h adres powrotu po wykonaniu programu 7G 0$Ctrl-Break 7; 0 # 25h odczyt sektorów z dysku 26h zapis sektorów na dysk 7C 0 # 12,++3* -,<!#' <nazwa>proc FAR IRET <nazwa> ENDP * #5D$!, 5BQ,!,++3* 1. # $ 2. # " 3. + - $##! 21H DOS: ustawienie wektora przerwania funkcja AH = 25H, AL - numer przerwania, DS:DX odczyt wektora przerwania funkcja AH = 35H, AL - numer przerwania, ES:BX! - ' ; w segmencie danych istnieje linia: wektor DW 0 2(MojePrzerw ; w segmencie danych istnieje linia: adres DD MojePrzerw / '
ASSEMBLER strona 14 mov AH, 35H mov AL. 0 int 21H (' mov wektor[0], BX mov AX, ES mov wektor[1], AX ;zapisanie nowego adresu *+#4*0 '.6 mov AH, 25H mov AL. 0 int 21H ;przywrócenie pierwotnych wart. lds DX, DWORT PTR wektor mov AH, 25H mov AL. 0 int 21H 1++310 <2=# E) # 21H,* + $AH oraz +$, (!"0D!>D,J>DT)0 # $>DT( +!8F, (!"0 +#%)&, AH Operacja 1 Wyniki 2 2 *$Ctrl-Break) DL = znak kursor za znakiem 5 Wydruk znaku DL = znak 6 *$Ctrl-Break) DL = znak kursor za znakiem 9 * $ %[& <='<FT (!"%[&, 40 patrz!" BX = 1, 2 1 ># AL = znak $Ctrl-Break) 6 Odczyt znaku z klawiatury (bez kontroli Ctrl-Break) DL = 0FFH 8YT$ = 0, gdy brak znaku 7 >$ AL = znak (bez kontroli Ctrl-Break) 8 >$ AL = znak A Ctrl-Break) *! "# $ $ %&'%! DS:DX = adres bufora, (! ) pierwszy bajt bufora $ bajtu, 7, Drugi bajt bufora $$ przeczytanych znaków B Odczyt stanu klawiatury AL = FFH - brak znaku, T)0# C *!! 8YT! * $ (1, 6, 7, 8, A)! Czas i data 2A Pobranie daty CX = rok <AT <YT 2B Ustawienie daty CX = rok (1980 2099) <AT <YT AL = 0 data poprawna TDD0# 2C Pobranie czasu CH = godzina CL = minuty DH = sekundy DL = setne sekundy
ASSEMBLER strona 15 2D Ustawienie czasu CH = godzina CL = minuty DH = sekundy DL = setne sekundy Komunikacja asynchroniczna 3 $ AL = znak 4 $ DL = znak 2 + D Zapis zmienionych buforów dyskowych z powrotem # E *$ # DL = numer dysku AL = 0 czas poprawny TDD0# 8YT$+ 7 #" (0 = A, 1 = B, 2 = C ) 19 -$ AL = nr dysku (j. w.) 2E.H! DL=0 8YT)0 T(0 30 Pobranie numeru wersji MS-DOS AL = numer wersji AH = numer zmiany BX, CX = 0 2 25 / DS:DX = adres wektora AL = numer przerwania 35 - AL = numer przerwania ES:BX = adres wektora 1! ++ 39 Utworzenie katalogu <='<FT 3A /# DS:DX = j. w. 3B Zmiana katalogu roboczego DS:DX = adres katalogu do + $ 47-0 <=T # )T$ 1 = A, 2 = B ) DS:DX = adres 64- bajtowego bufora <='=5T docelowego 36 Pobranie wolnego obszaru na dysku <YT #,," 8FT$+ klaster, = 0FFFFH w #?FT$ klastrów >FT$+ sektor <FT$ klastrów 3C Utworzenie pliku <='<FT CX = atrybuty pliku (patrz " 3D Otwarcie pliku <='<FT AL =0 otwarcie do odczytu =1 zapisu =2 odczyt & zapis 3E.# BX = uchwyt pliku " 3F 2 " BX = uchwyt pliku " >FT$ + DS:DX = adres bufora AH = uchwyt do pliku " AH = uchwyt do pliku " 8FT$ bajtów = 0 odczyt poza plik 40. " BX = uchwyt pliku 8FT$
ASSEMBLER strona 16 " >FT$+ <='<FTH+, bajtów 41 /# <='<FT 43 Nadawanie atrybutów plikowi AL = 1 <='<FT CX = atrybuty (patrz pod " 54 Pobranie znacznika sprawdzania AL = 0 brak zapisu sprawdzania = 1 zapis ze sprawdzaniem 56 Zmiana nazwy pliku <='<FT 4='<5T. 31. # AL = kod powrotu <FT # paragrafach 4B. AL = 0 <='<FT nazwy programu ES:BX = adres bloku parametrów 4C. AL = kod powrotu dla ErrorLevel 4D -# AL = kod powrotu dla 62 Pobranie adresu bloku PSP BX = adres segmentu PSP programu. # 48. #183"?FT$ paragrafów 49. # ES = adres segmentu ze # 4A.$ # ES = adres segmentu obszaru # -# AX = adres segmentu z # 59 -# BX = 0 AX = rozszerz. kod?at# BL = zalecana reakcja >AT Atrybuty pliku$+,. +' 0 read only, 1 70G0;0 E0 backup) Uchwyt pliku0! 5W2,5# +' )0$<2= " (0$$) 70$#+niezmienialne) G0 " 4 drukarka = ; <2=@ +,3 #, (210%40 (!"># " +?52= <2="# $AH
ASSEMBLER strona 17 VIDEO (BIOS) - przerwanie 10H. gotoxy AH = 02H, do BH - strona karty graficznej (zwykle = 0), DL +#K\LDH +#K& +#! ) liczone od 0 scrolling okna/ekranu (czyszczenie okna/ekranu) AH = 06H, CX +#+DX - +# +#) +KL K\L AL$scrollingu, (! ) AL = 0 - czyszczenie ekranu. odczyt typu karty AH = 1AH, AL = 0 (!8Y!" Konfiguracja (BIOS) - przerwanie 11H, zapisuje do AX+ + +' 0 - istnieje FDD 1 - istnieje koprocesor 2 - zainstalowana mysz G$183 4,5 - tryb video :C$D<< I()(($ + 12 - istnieje GamePort 13 - zainstalowany modem (wew.) 14,15 - il. druk. Programy rezydentne Program rezydentny +#!, - # #, * +$ #,* +$ $ # Q=1,- +! +,5 + "+,*, # #, -#!' KEEP - funkcja 31H przerwania 21H,- ' AH - 31H AL -$,ERRORLEVEL) <F # (:! D $, &<2=" #,Gdy program otrzymuje kontrolê, funkcja EXEC (4bH) alokuje blok pamiêci zaczynajacy siê od PSP i zawieraj¹cy ca³¹ dostêpn¹ pamiêæ. Pamiêæ ta przydzielana jest procesowi. Wykorzystuj¹c funkcjê 31H <2= # <F$<FU(:?+",D + #+ #!;@A, TSR - przerwanie 27H,B' <F+ ##$!!#<= #(, D <2= # # -=-$<F,-##, (!"-7CA <2= $+ 77A7;A! + Critical Error lub Ctrl - Break, (!"-7CA# +PT:;6?!? (:<F" Dyrektywy zaawansowane EVEN0 H + #, <nazwa> GROUP <nazwa_segmentu1> [,<nazwa_segmentu2>, ]0 PO :;, 5D]]PO,R4Y=4S,4B<5D0 #$ $PO,8 4Y=4 $ IF: 5D40) 5D0) 5D<4D0! 5DB<4D! Operatory 2 +,
ASSEMBLER strona 18 arytmetyczne +, -, *, /, MOD0P$(OP OP$7O SHL, SHR P$(OP OPO logiczne AND, OR, XOR0P$(OP OP$7O NOT0B2QP$O relacji #P(OP OP7O #' EQ a1 = a2, NE a1!= a2, LT a1 < a2, GT a1 > a2, LE a1 <= a2, GE a1 >= a2 (+! $$H0$H[ SEG 0$ OFFSET0$!! LENGTH 0 0$!"! </- TYPE0 Q^-4'(0?^Q470* 21<;0<* 21<,<'( NEAR, -2 FAR. SIZE zwraca iloczyn LENGTH i TYPE atrybutu PTR0# 'P O-Q1POP O?^Q4* 21<,B481D81", DS:, ES:, SS:, CS: - atrybuty zmiany segmentu SHORT0'93-=A21QPO!PO(7C+ instrukcji aktualnej. THIS0H HIGH zwraca starszy bajt 16-bitowej liczby LOW 0W Koprocesor _"08 #,7@C, Budowa 6 @@) + ((,=!!,=$ + $$,1+ #stosu koprocesora. Stos ten ", Typy danych Y '(0(E0+:;0,6,<# # #$!"' Word Integer - 16b, -32768, 32767, 5 cyfr Short Integer - 32b, -2 * 10^9, 2 * 10^9, 9 cyfr Long Integer - 64b, -2 * 10^18, 9 * 10^18, 18 cyfr Short Real - 32b, 10^-37, 10^38, 7 cyfr Long Real - 64b, 10^-307, 10^308, 16 cyfr Temporary Real - 80b, 10^-4932, 10^4932, 19 cyfr Packed <@)(@!# (@! Instrukcje koprocesora Instrukcja, D?Y<PH+O FBSTP <przeznaczenie> D5Y<PH+O FIST <przeznaczenie> FISTP <przeznaczenie> Opis + # #P O # #P O_0" #P O
ASSEMBLER strona 19 DY<PH+O FST <przeznaczenie> FSTP <przeznaczenie> FXCH <przeznaczenie> Arytmetyczne D8<<RP OPH+OS D8<<-P OPH+O D58<<H+ D=/?RP OPH+OS D=/?-P OPH+O D5=/?PH+O D=/?1RP OPH+OS D=/?1-P OPH+O D5=/?1PH+O D3/YRP OPH+OS D3/Y-P OPH+O D53/YPH+O D<5MRP OPH+OS D<5M-P OPH+O D5<5MPH+O D<5M1RP OPH+OS D<5M1-P OPH+O D5<5M1PH+O FSQRT FSCALE FPREM FRNDINT XTRACT FABS FCHS Porównania D>23 RPH+OS D>23-RPH+OS FCOMPP D5>23 PH+O D5>23-PH+O FTST FXAM / F2XM1 FYL2X FYL2XP1 FPTAN # # (!"# 7 #H+ H+" odwróconym# H+H+ przeznaczenie) dodaje rzeczywiste dodaje rzeczywiste i zdejmuje ze stosu odejmuje rzeczywiste odejmuje rzeczywiste i zdejmuje ze stosu odejmuje rzeczywiste (odwrócona) odejmuje rzeczywiste i zdejmuje ze stosu (odwrócona) (odwrócona) dzieli rzeczywiste dzieli rzeczywiste i zdejmuje ze stosu dzieli rzeczywiste (odwrócona) dzieli rzeczywiste i zdejmuje ze stosu (odwrócona) (odwrócona) pierwiastek kwadratowy ##7 #$ wydzielenie cechy i mantysy * $# Zmiana znaku + # porównuje rzeczywiste porównuje rzeczywiste i zdejmuje ze stosu porównuje rzeczywiste i 2 razy zdejmuje ze stosu + + sprawdza, czy szczyt stosu jest 0 bada szczyt stosu!, oblicza 2^X - 1 oblicza Y * log_2 (X) oblicza Y * log_2 (X+ 1) #$
ASSEMBLER strona 20 FPATAN 0, FLDZ FLD1 FLDPI FLDL2T FLDL2E FLDLG2 FLDLN2 0+! DY<>* PH+O FSTCW/ FNSTCW <przeznaczenie> FSTSW / FNSTSW <przeznaczenie> FSTSW/ FNSTSW AX FSAVE/ FNSAVE <przeznaczenie> D1=Q21PH+O DY<4BMPH+O FSETPM FSTENV / FNSTENV <przeznaczenie> FWAIT FINIT / FNINIT FENI / FNENI FDISI / FNDISI DCLEX / FNCLEX FINCSTP FDECSTP FFREE FNOP #$arcus tangens $Temporary Real) ),) (,) -5 N7()" N7" N()7" log_e (2) #!$, +, # # #8F zachowaj stan odtwórz stan $ ustaw wirtualny tryb pracy #$ wait (zatrzymuje proc., zabezp. przed korzyst. z tych samych obszarów RAM) inicjuje (resetuje) koprocesor zezwala na przerwania blokuje reakcje przerwania #H H zwalnia (zeruje) rejestry nic nie rób Niebieskie karty 5 ##,. #! znaczników!,8+#! ## symbole operandów: r8@ + r16-16-bitowy rejestr ogólnego przeznaczenia sr - jeden z rejestrów segmentowych m8+ # " m16 # i8 - bajt natychmiastowy i16 d8-8-bitowe przemieszczenie$# +,-,9# aktualnej instrukcji. d16(: + Instrukcje Rozkazy transmisji danych (! "5!+, MOV <op1>, <op2> $ 7" (,2 ' (!" $, # (!",
ASSEMBLER strona 21 (!" + (!" + $(MOV 16bitów 8bitów) (!"! + * 7 ( $, LEA <op1>, <op2> przenosi efektywny adres operandu 2 do operandu 1 np. LEA DX, Zmienna LDS <op1>, <op2> przenosi daleki adres <op2> do pary rejestrów DS:<op1> LES <op1>, <op2> przenosi daleki adres <op2> do pary rejestrów ES:<op1> LAHF przenosi do AH+ SAHF +$8A IN <op1>, <op2> P (O$ RP 7OS (!" '8Y$@8F<F OUT <op1>, <op2> RP (OS$P 7O (!" '$@8Y<F8F XCHG <op1>, <op2> #$, XLAT zapisuje w AL # <='R?F8YSê, gdy pod DS:BX jest tablica bajtów, a do AL ` PUSHA (286) - $'8F>F<F?F=-?-=5<5, (!"* $SP$ -/=A8$ # -2- #=- #=-# +" +8F>F<F?F # POPA 7@:"$$-/=A8 =- PUSHAD i POPAD (386) - jak PUSHA i POPA, tylko dla rejestrów 32-bitowych IN <op1>, <op2> - przenosi dane z portu do akumulatora. <op1> = AL przenoszony jest bajt, = AX przenoszone jest P 7O 0 $<F, OUT <op1>, <op2> P (O 0 $ <FP 7O w AL lub AX. Operacje arytmetyczne (!"2!'2D=D.D8D-D>D INC <op> #($! ) nie zmienia CF. DEC <op> ($! ) nie zmienia CF NEG <op> $ 5-5 ADD <op1> <op2> dodaje <op2> do <op1>, dla bez i ze znakiem SUB <op1> <op2> odejmuje <op2> od <op1>, dla bez i ze znakiem MUL <op> 8F$#:EEGE <F8F bity w AX). < O@+#AL@",P OP(:O P(:O+AX", (! ) MUL modyfikuje AX i DX (! ) < OB54 IMUL <op> 3/Y!8F$#G7C:C DIV <op> ##8F Pop>, wynik trafia do AL, a do AH trafia modulo. 3 (:#<F8F!8F<F IDIV <op> jak DIV, tylko dla liczb ze znakiem ADC <op1> <op2> P 7OP (O>D SBB <op1> <op2> P 7OP (O >D CBW $AL ustawiony 8A CWD $AX ustawiony <F AAA #?><AX). W BCD w ramach # ;;"!)I,888 # '$; +8Y$#OI dodaje 6 do AL., zeruje 4 starsze >D8D $8A#,9$8Y,PTI>D8D zerowane. AAD?><8F AAM?><8F AAS?><8F (!".8=>55!!$ 8=>55 #?><+$, DAA?>< 7!### ;!# DAS korygowanie wyniku odejmowania dla liczb traktowanych jako upakowane BCD
ASSEMBLER strona 22 Operacje logiczne (!"B $seg. do innego (!"< AND <op1>, <op2> dokonuje logicznego and + P (OP 7O wynik umieszcza w <op1>. < O@(:, OR <op1>, <op2> jak w AND, tylko dla logicznego or. XOR <op1>, <op2> jak w AND, tylko dla logicznego xor. NOT <op> neguje wszystkie bity <op>, wynik w <op> (! ) nie modyfikuje adnych znaczników (nawet ZF) Wydzielanie bitu +("8B<# " Ustawianie bitu##+,k(l# 21#W + Zerowanie bitu#+k(lb2q"+ 21#"B2Q" Szybkie zerowanie danejf21,xor AX, AX zeruje AX. Instrukcje przesuwania SHL <op>, <licznik> przesuwa bity <op> w lewo, uzupe³nia 0-wym bitem, <op> - pamiêæ lub rejestr, <licznik> - liczba 1 lub rejestr CL (nie CX), w CL jest iloœæ, o jaki¹ nale y przesun¹æ bity, ewentualnie przesuniêcie o 1. (! ) wysuwane bity trafiaj¹ do CF (a z niego donik¹d) (! ) przesuniêcie 16-krotne = zerowanie s³owa 7@:"PO$,SHL AX, 7 7@:"$ #POG(bo np. 32 daje to samo co 0) SAL <op>, <licznik> =AY SHR <op>, <licznik> =AY 7@:", SAR <op>, <licznik> jak SHR, ale uzupe³nia najstarszym bitem (bitem znaku) ROL <op>, <licznik> rotuje bity <op> w lewo, wysuniêty bit trafia na koniec oraz do CF 7@:" ROR <op>, <licznik> jak ROL, tylko w prawo, wysuniêty bit trafia na pocz¹tek oraz do CF 7@:" RCL <op>, <licznik> rotuje bity <op> w lewo, wysuniêty bit trafia do CF a bit z CF na koniec7@:" RCR <op>, <licznik> jak ROL, tylko w prawo, wysuniêty bit trafia do CF, a bit z CF na pocz¹tek 7@:" Szybciej jest zapisaæ kilka razy SH? <op>, 1 >Y #;" = ##+,3/YCC" (!" a #KL!$ n " $7 #ii * n (co szybko =AY" +( ((+/ JMP <etykieta> skok do <etykieta> (<etykieta> - wczeœniej zdefiniowana etykieta$ segment:offset), skok jest bezwarunkowy. (!" G7" J? <etykieta> PO$%]&+" (!"5bliskie R(7@(7CS (!" # instrukcji (!"< (!",#T+) (!"5signed i unsigned. Liczby ze znakiem - najstarszy bit = 1, gdy liczba ujemna Relacje#' W#less / greater) liczby ze znakiem (signed) W above / below) liczby bez znaku Relacje po wykonaniu CMP: Relacja dla: bez znaku ( (co testuje) dla: ze znakiem ( (co testuje)
ASSEMBLER strona 23 = JE ZF = 1 JE ZF = 1 < > JNE ZF = 0 JNE ZF = 0 > JA CF = 0 i ZF = 0 JG ZF = 0 lub SF = OF JNBE JNLE < JB CF = 1 JL SF < > OF JNAE JNGE >= JAE CF = 0 JGE SF = OF JNB JNL <= JBE JNA CF = 1 lub ZF = 1 JLE JNG ZF = 1 i SF < > OF 5!' mnemonik co testuje JNS skok, gdy brak znaku SF = 0 JS skok, gdy jest znak SF = 1 JNO OF = 0 JO OF = 1 JP/JPE $ PF = 1 JNP/JPO $ PF = 0 JCXZ <etykieta> PO>FT) " (! ) tylko skoki bliskie [-128-127] (! ) nie istnieje instrukcja przeciwna JCXNZ + +>FPO), (!" #9>F.Y22-,B54>FPO)# $ #+ ##>F), CMP <op1>, <op2> + $# PPTTOTO",<'wynik = <op1> - <op2>, zapomina wynik a tylko ustawia znaczniki. (!",9]$# >3-9]9]" $!, TEST <op>, <maska>+p O 8B<KL ustawia znaczniki. (! ) TEST modyfikuje ZF! B2QPop> BT <op>, <nr> (386) $PO)" P O CF. (! ) TEST jest szybsze, ale tylko dla sprawdzania, czy bit jest 1. LOOP <etykieta> ## ' zmniejsza CX o 1 $>FPO) skacze do <etykieta> $>FT) przerywa## Y22- LOOPNZ / LOOPNE <etykieta> # Y22-# ' zmniejsza CX o 1 $>FPO).DT) skacze do <etykieta> $>FT).DT( przerywa## Y22- LOOPZ / LOOPE <etykieta> # Y22-# ' zmniejsza CX o 1 $>FPO).DT( skacze do <etykieta> $>FT).DT) przerywa## Y22- (!"5Y22-]# +$ # $ $ $"#+W+",* + Y22-]>3- +, +( *+, 5 # ' (!" H+ wskazywany jest przez DS:SI (suorce index) (!" docelowy wskazywany jest przez ES:DI (destination index) (! ) $ +$CX (!" AX#!" (!"!=5<5"!DF, gdy DF=0 # DF=1,
ASSEMBLER strona 24 REP STOS{W/B} 4='<5$7U>F+" >F zawartym w AX (bajtem z AL). (!"- #>F(,* +H4='<5 ", (! ) Gdy DFT( ++"#4='<5 <5 7(" # KL",B<5, STOS{W/B} 8F8Y" 4='<5<5#<DT("7 modyfikuje CX REP MOVS{W/B} - odpowiednik instrukcji REP STOSW (bez REP =Q2=*"+ <='=5 8FW8Y" 4='<5 LODS{W/B} <='R=5SW 8FW8Y,B#=5W, SCAS{W/B} +"W 4='R<5S$8FW8Y, B# #<5, CMPS{W/B} +W <='R=5S4='R<5S$<D#=5<5, REP 3 2M==Q2=$>FPO) # >F($5- +# #+14-" REPE / REPZ przedrostek dla SCAS, CMPS, gdy CX<>0 # >F$.DT(+ ##5-(" REPNE / REPNZ przedrostek dla SCAS, CMPS, gdy CX<>0 # >F$.DT)+ ##5-(" INS{W/B} <F# $ OUTS{B/W} <F H+ +(, / NOP0 +H HLT0 niemaskowalne WAIT0 $ Q4=Q0$ #