ASSEMBLER. Mnemonik Dyrektywa Operandy (argumenty) - liczby i inne nazwy z prawej strony mnemoników, oddzielamy je przecinkiem, Instrukcja!

Podobne dokumenty
Architektura komputerów. Asembler procesorów rodziny x86

Załącznik do ćwiczenia w środowisku MASM32 wersji 10 Sterowanie przebiegiem wykonania programu

Sterowanie pracą programu

Programowanie komputera

PODSTAWOWE ELEMENTY ASEMBLERA TRYBY ADRESOWANIA. OPERATORY ASEMBLERA

INSTRUKCJE Instrukcje przeniesienia: Instrukcje konwersji: Arytmetyczne instrukcje:

Architektura systemów komputerowych Laboratorium 14 Symulator SMS32 Implementacja algorytmów

J. Duntemann Zrozumieć Assembler Leo J. Scanlon Assembler 8086/8088/80286 S. Kruk Programowanie w Języku Assembler

organizacja procesora 8086

Rejestry procesora. Nazwa ilość bitów. AX 16 (accumulator) rejestr akumulatora. BX 16 (base) rejestr bazowy. CX 16 (count) rejestr licznika

Zadanie Zaobserwuj zachowanie procesora i stosu podczas wykonywania następujących programów

Architektura Systemów Komputerowych

Architektura Systemów Komputerowych, Wydział Informatyki, ZUT

end start ; ustawienie punktu startu programu i koniec instrukcji w assemblerze.

Programowanie niskopoziomowe

Architektura komputerów

Sprzęt i architektura komputerów

Floating Point Unit Koprocesor umożliwia działania na liczbach ułamkowych (zmiennoprzecinkowych) 8 rejestrów 80-bitowych: st0,,st7 Typy danych

Sprzęt i architektura komputerów

Wprowadzenie do Architektury komputerów. Asembler procesorów rodziny x86

PROGRAMY REZYDENTNE Terminate and State Resident, TSR

5. Mikroprocesory 8086 i 8088

Architektura komputerów

Zuzanna Hartleb i Artur Angiel

Przedmiot : Programowanie w języku wewnętrznym. Ćwiczenie nr 4

CPU ROM, RAM. Rejestry procesora. We/Wy. Cezary Bolek Uniwersytet Łódzki Wydział Zarządzania Katedra Informatyki

Wprowadzenie do Architektury komputerów. Asembler procesorów rodziny x86

Architektura komputerów. Komputer Procesor Mikroprocesor koncepcja Johna von Neumanna

Ćwiczenie nr 3. Wyświetlanie i wczytywanie danych

Programowanie Niskopoziomowe

CPU. Architektura FLAGS Bit: dr Paweł Kowalczyk; DPTNS, KFCS UŁ. SI 16 bit. 16 bit. 16 bit.

Lista instrukcji mikroprocesora Programowanie w assemblerze

Technika mikroprocesorowa I Studia niestacjonarne rok II Wykład 2

PROGRAMOWANIE NISKOPOZIOMOWE. Systemy liczbowe. Pamięć PN.01. c Dr inż. Ignacy Pardyka. Rok akad. 2011/2012

Mikrokontroler ATmega32. Język symboliczny

Technika mikroprocesorowa I Wykład 2

Ćwiczenie 3. Konwersja liczb binarnych

Informacje wstępne. Historia Maszyna Turinga

Jak wiemy, wszystkich danych nie zmieścimy w pamięci. A nawet jeśli zmieścimy, to pozostaną tam tylko do najbliższego wyłączenia zasilania.

PROGRAMOWANIE NISKOPOZIOMOWE

STRUKTURA I ORGANIZACJA STOSU (FILO- First In Last Out) Rejestry stosu: SS i SP (Stack Segment i Stack Pointer)

Programowanie w asemblerze Architektura procesora

Adam Kotynia, Łukasz Kowalczyk

Podstawy techniki cyfrowej Mikroprocesory. Mgr inż. Bogdan Pietrzak ZSR CKP Świdwin

Procesor Intel 8086 model programisty. Arkadiusz Chrobot

Procesor Intel 8086 model programisty. Arkadiusz Chrobot

Programowanie Niskopoziomowe

Kod hex Instrukcja Opis 37 AAA Koryguj AL po dodawaniu BCD

Architektura komputerów

Procesory rodziny x86. Dariusz Chaberski

Lista rozkazów mikrokontrolera 8051

petla:... ; etykieta określa adres w pamięci kodu (docelowe miejsce skoku) DJNZ R7, petla

Metody Realizacji Języków Programowania

Organizacja typowego mikroprocesora

MOŻLIWOŚCI PROGRAMOWE MIKROPROCESORÓW

Architektura systemów komputerowych Laboratorium 13 Symulator SMS32 Operacje na bitach

1. Operacje logiczne A B A OR B

Programowanie hybrydowe C (C++) - assembler. MS Visual Studio Inline Assembler

Podstawy programowania w języku C i C++

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

Lista instrukcji procesora 8051 część 2 Skoki i wywołania podprogramów, operacje na stosie, operacje bitowe

Jerzy Nawrocki, Wprowadzenie do informatyki

Programowanie Niskopoziomowe

Wstęp do assemblera MA51

Architektura systemów komputerowych Laboratorium 7 Symulator SMS32 Stos, Tablice, Procedury

ARCHITEKTURA SYSTEMÓW KOMPUTEROWYCH

Architektura systemów komputerowych Laboratorium 8 Symulator SMS32 Instrukcje skoku i pętle

Mikroprocesor Intel 8088 (8086)

Lista rozkazów mikrokontrolera 8051 część pierwsza: instrukcje przesyłania danych, arytmetyczne i logiczne

Programowanie Niskopoziomowe

. III atyka, sem, Inform Symulator puterów Escape rchitektura kom A

Pascal typy danych. Typy pascalowe. Zmienna i typ. Podział typów danych:

Procesor ma architekturę rejestrową L/S. Wskaż rozkazy spoza listy tego procesora. bgt Rx, Ry, offset nand Rx, Ry, A add Rx, #1, Rz store Rx, [Rz]

1. Asembler i wstawki asemblerowe w C

Wstęp do Reverse engineeringu

Język programowania: Lista instrukcji (IL Instruction List)

UTK Można stwierdzić, że wszystkie działania i operacje zachodzące w systemie są sterowane bądź inicjowane przez mikroprocesor.

Operacje wykonywane są na operandach (argumentach operatorów). Przy operacji dodawania: argumentami operatora dodawania + są dwa operandy 2 i 5.

002 Opcode Strony projektu:

1. Pobrać plik masm.zip (Macro Assembler 6.15 & Segmented Executable Linker 5.60) (

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Odczyt danych z klawiatury Operatory w Javie

Struktura i działanie jednostki centralnej

Notatka Aplikacyjna NA 03006PL Maj 2016

Kod znak-moduł. Wartość liczby wynosi. Reprezentacja liczb w kodzie ZM w 8-bitowym formacie:

Wstęp do informatyki. System komputerowy. Magistrala systemowa. Architektura komputera. Cezary Bolek

Język C zajęcia nr 11. Funkcje

Różności w C++ Marek Pudełko

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Programowanie mikrokontrolera 8051

Ćwiczenie nr 4. Zasady kodowania podprogramów

Ćwiczenie 2. Siedmiosegmentowy wyświetlacz LED

Przerwania w architekturze mikrokontrolera X51

Zmienne, stałe i operatory

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

Architektura komputera. Cezary Bolek. Uniwersytet Łódzki. Wydział Zarządzania. Katedra Informatyki. System komputerowy

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

Transkrypt:

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$ #