curs de formare

În partea anterioară a tutorialului, am folosit steagul CF pentru a reveni la procedurile de informare de eroare. Pentru a dezvoltat o imagine completă, am decis în această parte a elabora pe steagurile comenzilor de control.

După cum probabil vă amintiți steagurile sunt modificate ca urmare a efectuării aritmetice și logice, instrucțiuni, precum și comanda de deplasare. steaguri înregistrare pot fi salvate în stivă prin comenzi PUSHF și de a restabili stiva cu ajutorul echipei POPF. În plus, procesorul, există comenzi speciale, care vă permit să setați în mod explicit sau resetarea pavilion CF, DF și IF. Acesta este un foarte simplu de comandă: ei nu au operanzi, iar rezultatul este doar o modificare a valorii pavilion corespunzătoare.

CLC comandă șterge un CF. steag

comandă STC stabilește pavilion CF în unitate.

comandă CMC inversează valoarea CF. pavilion

pavilion direcție DF

Acest pavilion determină direcția de date comenzi înlănțuite (din care să explice în detaliu într-un articol separat). Acesta trebuie să fie stabilite sau eliminate înainte de a utiliza aceste comenzi.

CLD comandă resetează pavilion DF.

STD comanda seteaza steagul DF la unul.

întrerupe pavilion IF

CLI resetărilor de comandă semnalați dacă (dezactivează întrerupe).

STI comandă setează un steag dacă o unitate (permite întreruperi).

Echipe LAHF și SAHF

steaguri LAHF sarcini de comandă Jr. înregistrare octet AH. Este convenabil de a folosi atunci când aveți nevoie pentru a obține valorile de mai multe steaguri. locație evocator ordinea prezentată mai jos:

comandă SAHF efectuează operația inversă - încarcă conținutul AH în octetul scăzut de înregistrare steaguri. Acest lucru vă permite să schimbați valorile unui număr de steaguri. Biții 1, în care 3, 5 registrul AH sunt ignorate.

Ca un exemplu, utilizați LAHF comanda am scris o rutină care primește și afișează valorile pe steaguri consola SF, ZF, AF, PF și CF. O procedură similară poate fi utilizată în scopuri de depanare. Este suficient să-l adăugați la apelul la locația programului în cazul în care doriți să verificați starea steaguri.

Pentru a afișa valoarea biților individuali este convenabil pentru a scrie un protsedurku Imprimare CF pavilion separat, ca un simbol. Bitul dorit va fi plasat în comanda CF pavilion folosind schimbare SHL.

Dar procedura reală pentru pavilioanele de retragere. După cum puteți vedea, nu e nimic procedură complicată păstrează cazul steaguri și îl vom restabili înainte de a reveni, astfel încât să puteți suna oriunde, fără griji că va rupe executarea programului principal.

Full exemplu codul sursă - printflags.asm. Programul de ieșire arată astfel:

curs de formare

Pentru a lucra steagurile, scrie următorul program. Se calculează suma valorilor steaguri CF, SF, ZF și de ieșire rezultat adăugarea la consola. În cazul în care rezultatul este mai mare decât 1, valoarea pavilion CF invertit

Zdravstvute!
Am făcut, dar asta e kakya de gunoi, dacă rulați programul din Windows, suma = 0, iar în cazul în care rulează într-un depanator, suma = 1. De ce o astfel de diferență nu înțelege.
utilizare16
org 100h
Start JMP
; ---------
summ_flags db 'Summa Flagov = $'

; ---------
începe:
mov dx, summ_flags
mov ah, 09h
int 21h
topor XOR, topor
lahf
SHR ah, 1
suna summa
SHL ah, 2
suna summa
SHL ah, 1
suna summa
cl, 1 cmp
JG inv_cf
vivod:
XOR dx, dx
mov ax, cx
mov bx, 10
div bx

add dl, '0'
mov ah, 02h
int 21h
mov ah, 08h
int 21h
mov ax, 4c00h
int 21h

summa:
jc summ
putrezi
Summ:
adaugă cl, 1
putrezi
inv_cf:
cmc
JMP vivod

Din moment ce trebuie sa echipa LAHF merge XOR AX, AX, atunci suma steaguri trebuie să fie egal cu 1 (ZF = 1, CF = 0, SF = 0).

Diferența din cauza faptului că, evident, nu resetați CL registru. pornire Debugger schimbarea valorilor registrului, iar când lansarea fără un debugger, registre poate fi o valoare diferită.

Apropo, face protecția de depanare de pe un principiu similar. Dacă executați programul de orice registre la zero, acesta este rulat in debugger)))

mov ax, 4C00h; \
int 21h; Programul / Completare
; -----------------------
Print:
împinge topor
mov ah, 09h
int 21h
pop ax
putrezi

Foarte bine.
Mi-a placut algoritmul pentru a găsi suma steaguri. Nici nu cred că le puteți pune în bucla

utilizare16
org 100h
adaugă cx, 1; un steag este setat să nu fie 0
sub cx, 2; un steag este setat să nu fie 0
Marcare apel; Procedura de apel
topor XOR, topor
mov al, [CFZ]; împiedică valoarea de pavilion
mov ah, [SFZ]; împiedica flag valoarea s
add al, ah; c = c + s
mov ah, [ZFZ]; împiedica flag valoarea s
add al, ah; c = c + s
cmp al, 1; verifica valoarea
ja m; dacă al> 1 trece apoi
JMP m3; în cazul în care al
m:
topor XOR, topor
mov al, [CFZ];
cmp al, 1; inversare Procedura stare apel la umiditate
m1 jz; c> 1
jb m2; c <1
JMP m3

m1:
CLC; schimbarea stării actuale a drapelului
JMP m3
m2:
STC; schimbarea stării actuale a drapelului
JMP m3
m3:
mov ax, 4C00h
int 21h
SFZ rb 1
ZFZ rb 1
AFZ rb 1
PFZ rb 1
CFZ rb 1
DS10 rb 10

Flag:
PUSHF; menține steaguri în Stoke
xor bx, bx
topor XOR, topor
xor si, si
mov cx, 8; Contor = 8
POPF; restabili
PUSHF; menține steaguri în Stok
LAHF
; ----- SAL ah, 0
împinge topor
SHR ah, 7; Am mutat de 7 biți pentru dreptul de a rămâne 7bit
mov [DS10 + si], ah; rezervă
pop ax
inc si
; -----
zl:
SAL ah, 1; se amestecă cu 1 bit. sau x = x + 1
împinge topor
SHR ah, 7; Se schimbă totul de prisos Părăsirea doar 1 bit
mov [DS10 + si], ah; păstrează în memorie
topor XOR, topor
pop ax
inc si
Buclă ZL
mov bl, [DS10 + 0]
mov [SFZ], bl; SFZ = S
mov bl, [DS10 + 1]
mov [ZFZ], bl; ZFZ = Z
mov bl, [DS10 + 3]
mov [AFZ], bl; AFZ = A
mov bl, [DS10 + 5]
mov [PFZ], bl; PFZ = P
mov bl, [DS10 + 7]
mov [CFZ], bl; CFZ = C
POPF
putrezi

Destul de ciudat, funcționează

Dar modalități simple nu sunteți foarte căutați.
Aici, de asemenea, o mulțime de registre inutile Aducerea la zero.

Dacă eliminați XOR inutile, apoi POPF / PUSHF nu trebuie să, ca și steagurile echipa MOV nu se schimba.

Apoi, de ce ai nevoie de 10 octeți DS10, în cazul în care toate folosite 8? Valorile variabilelor steaguri duplicat bytes DS10 matrice. Ai putea face acest lucru pur și simplu, să declare diferite:

Atunci nu aveți nevoie de un cod care copiază valori.

O mulțime de echipe de tranziție suplimentare. pavilion CF Reverse comanda mai ușor CMC.
O altă problemă este aceea că steagurile sunt schimbate în calcularea sumei, astfel inversat o valoare diferită CF.

articole similare