Sunteți pe pagina 1din 4

Salut!

M-am gandit sa va las problema de assembler rezolvata, ca sa intelegi despre ce era vorba.
Cei care nu doresc sa verifice programul cu TASM, pot trece la pagina 3 la explicatii.

In primul rand, copiati randurile ce urmeaza intr-un fisier notepad:

dosseg
.model small
.stack 100h
.data
vect1 DW 12,8,2,14
vect2 DB 1,"A",4,'c',6
.code
startprogram:
mov ax,@data
mov ds,ax
mov cx,2
mov si,4
mov ax, vect1
et: sub ax, vect1[si]
loop et
add al, vect2[4]
cmp bx,ax
mov ax, 4C00h
int 21h
end startprogram

si salvati-l ca examen.asm

ca sa va verificati, dupa ce ati instalat in C: programul TASM.exe din rubrica de BTI,
copiati in C:\TASM\BIN\ programelul examen.asm

apoi din butonul de Start alegeti Run.. si scrieti cmd , apoi enter

in fereastra tastati cd C:\TASM\BIN enter
apoi tasm /zi examen.asm enter
daca totul a mers bine o sa apara ca in fereastra de mai jos,
altfel verificati sa nu fi scris cu greseli!


Tastati in continuare tlink /v examen.obj enter
Apoi td examen.exe si enter

O sa apara o fereastra de genul



In View alegeti Cpu si acum in noua fereastra vedeti pe dreapta registrele si segmentele.
Acum apasati pe rand F8 ca sa se ruleze rand pe rand.
Veti vedea cum se modifica registrele.
La final dati ok si daca mai vreti o data, dati F8 si Yes si tot asa cu F8.

Valorile din problema

Inainte de et: sub ax, vect1[si]
AX : 000Ch
CX : 0002h
SI : 0004h
Dupa et: sub ax, vect1[si] si pana in cmp bx,ax
AX : 000Eh
CX : 0000h
SI : 0004h

Si acum explicatia:

.

.data
; segmentul de declarari

vect1 DW 12,8,2,14
; se declara vectorul/sirul cu elementele 12, 8, 2 si 14 de tip word.
; asta insemna ca fiecare din numerele alea vor ocupa 2 bytes =1word =16 biti.
; cum noi am ales sa reprezentam bitii mai simplificat,
; grupand cate 4 intr-un nr hexazecimal,
; ele o sa apara de forma ABCDh, AB partea(octetul) cea mai semnificativa [High]
; si CD partea cea mai nesemnificativa [Low]
; vom avea deci
; 12 = 000Ch , 8 = 0008h, 2=0002h si 14=000Eh
; dar ele in memoria calculatorului se memoreaza invers, cum a spus si Vasilescu
; partea low in fata celei high (doar la registri se retine normal high-low)
; deci calculatorul va vedea in cazul vectorului vect1
; o secventa de genul [am despartit octetii prin semnul | ]
; 0C | 00 | 08 | 00 | 02 | 00 | 0E | 00 |
; primul octet este 0Ch si se acceseza prin vect1[0]
; ceea ce este scris in paranteza [x] de la vect1 inseamna accesarea informatiei
; de pe adresa/octetul x fata de prima adresa/primul octet
; prin urmare vect1[2] inseamna deplasament de 2 fata de prima adresa,
; deci al treilea octet din sir = 08h
; prin urmare n-are legatura cu al catulea element este in declarea vectorului,
; ci a-l catulea octet este in sir fata de primul
; stiind ca numerele sunt scrise/definite pe un nr de octeti [db-1,dw-2,dd-4,dt-10]
; si ca sunt retinute in memorie invers (low, apoi high)

vect2 DB 1,"A",4,'c',6
; aceeasi poveste ca mai sus
; doar ca aici sunt definite pe un byte/octet si nu mai exista low-high ca sa fie inversate
; avem deci 1=01h, A=65=41h, 4=04h, c=99=63h, 6=06h
; din cate stiu caracterele se simbolizeaza prin codul lor ascii
; dar oricum nu trebuia sa stim asta pentru ca nu se nimereau niciun a din ele la calcule
; memoria vect2: 01 | 41 | 04 | 63 | 06 |

.code
; segmentul de cod
startprogram:
; eticheta/label, loc de unde se pot relua intructiunile ca si intr-o bucla sau recursie.
mov ax,@data
mov ds,ax
; astea 2 randuri spun ca prin registrul AX se incarca in segmentul de date DS
; adresa de inceput in care sunt puse una dupa alta pe octeti succesivi,
; elementele declarate in .data .
; de exemplu vect1[10]=vect2[2]=04h
; aceste variabile vector sunt folosite doar ca reper pentru
; stabilirea adresei/octetului cu un anumit deplasament/offset de la ele.
mov cx,2
; registrul CX ia valoarea 2 => CX: 0002h el se retine normal CH-CL , ca toti registrii
mov si,4
; indexul sursa devine 4 => SI : 0004h
mov ax, vect1
; vect1 nu are specificat nicio []
; AX este de tip word
; deci AX va prelua primii 2 octeti din sir,
; echivalent mov AL, vect1[0] si mov AH, vect1[1]
; => AX : 000Ch
et: sub ax, vect1[si]
; din AX se scade aparent vect1[4]=02h, dar de fapt
; AX fiind de 2 octeti se scade 02 | 00 luati invers
; deci vine AX-vect1[4]=000Ch 0002h = 000Ah
loop et
; este echivalent cu
; dec(CX) ; daca CX diferit de 0, atunci treci la eticheta et
; prin urmare loopul se executa de CX-1 ori, adica o sg data in cazul nostru
; astfel, se mai executa o data scaderea din AX a lui 2
; => AX= 000A-0002h= 0008h
; iesind din loop => CX : 0000h
add al, vect2[4]
; AL este 08h de dinainte, la care se aduna vect2[4]=06h
; => AL=0Eh => AX : 000Eh
;pana aici se cerea la problema
; SI ramane neschimbat, SI : 0004h
cmp bx,ax
mov ax, 4C00h
int 21h
end startprogram
; ultimul rand de mai sus spune ca s-a terminat segmentul de cod prin end si ca se va executa
; programul incepand cu randul cu eticheta startprogram.

S-ar putea să vă placă și