Documente Academic
Documente Profesional
Documente Cultură
@echo off
c:\borlandc\bin\tasm.exe %1
if errorlevel 1 goto err
c:\borlandc\bin\tlink.exe %1
if errorlevel 1 goto err
:err
echo Assembler error!
:quit
del %1.MAP >NUL
del %1.OBJ >NUL
Acum pentru a asambla și rula un program se poate folosi comanda ASM PROG unde
PROG este numele fișierului PROG.ASM fără extensie.
Vom fi nevoiți să anticipăm anumite noțiuni, fără de care nu se poate face aproape
nimic. De ex. este imposibil de conceput programare fără decizii, care în Assembler sunt sub
forma de salturi condiționate. De asemenea, dată fiind complexitatea codului la care se poate
ajunge este neapărat nevoie de subrutine/proceduri.
În această lucrare vom analiza problema afișării unor numere în hexazecimal. Începem
cu niblul inferior (biții 0-3) al unui registru, alegem DL pentru că este convenabil. Avem funcția
DOS 02h care afișează caracterul al cărui cod ASCII este în DL de aici.
Pentru a păstra doar niblul inferior trebuie să aplicăm o mască de biți și operația logică
bit-cu-bit AND, masca fiind 0Fh = 00001111b. Apoi va trebui să transformăm numărul din DL
într-un cod ASCII, dar cifrele și literele A-F nu au coduri consecutive deci este nevoie de cel
puțin o decizie.
model small
.stack 1024
.data
.code
start:
mov ax, @data
mov ds, ax
model small
.stack 1024
.data
.code
PrintNewline PROC
push ax ; salvam registrii AX, DX
push dx
mov ah, 02h ; print CR (carriage return)
mov dl, 0Dh
int 21h
mov ah, 02h ; print LF (line feed)
mov dl, 0Ah
int 21h
pop dx ; restauram DX, AX
pop ax
ret
PrintNewline ENDP
PrintNibbleHex PROC
push ax ; salvam registrii AX, DX
push dx
mov dl, al
and dl, 0Fh ; lasa numai niblul inferior
cmp dl, 0Ah ; comparatie cu 10
jb PrintNibbleHex_et1 ; salt daca AL<10
add dl, 'A'-'0'-10 ; 'A'-'0'-10 este o expresie constanta
PrintNibbleHex_et1:
add dl, '0' ; transformam numarul in cod ASCII
mov ah, 02h ; apel functie DOS 02h, afiseaza char in DL
int 21h
pop dx ; restauram DX, AX
pop ax
ret
PrintNibbleHex ENDP
start:
mov ax, @data
mov ds, ax
call PrintNibbleHex
call PrintNewline
model small
.stack 1024
.data
.code
PrintNewline PROC
push ax ; salvam registrii AX, DX
push dx
mov ah, 02h ; print CR (carriage return)
mov dl, 0Dh
int 21h
mov ah, 02h ; print LF (line feed)
mov dl, 0Ah
int 21h
pop dx ; restauram DX, AX
pop ax
ret
PrintNewline ENDP
PrintNibbleHex PROC
push ax ; salvam registrii AX, DX
push dx
mov dl, al
and dl, 0Fh ; lasa numai niblul inferior
cmp dl, 0Ah ; comparatie cu 10
jb PrintNibbleHex_et1 ; salt daca AL<10
add dl, 'A'-'0'-10 ; 'A'-'0'-10 este o expresie constanta
PrintNibbleHex_et1:
add dl, '0' ; transformam numarul in cod ASCII
mov ah, 02h ; apel functie DOS 02h, afiseaza char in DL
int 21h
pop dx ; restauram DX, AX
pop ax
ret
PrintNibbleHex ENDP
PrintByteHex PROC
push ax ; salvam AX (deci si AL)
shr al, 4 ; deplasare dreapta cu 4 biti
call PrintNibbleHex
pop ax ; restauram AX (deci si AL)
call PrintNibbleHex
ret
PrintByteHex ENDP
PrintWordHex PROC
xchg al, ah ; interschimb AL <-> AH
call PrintByteHex
xchg al, ah ; interschimb AL <-> AH
call PrintByteHex
ret
PrintWordHex ENDP
start:
mov ax, @data
mov ds, ax
OBS: Astfel de lanțuri de proceduri tind să devină foarte mari mergând mai departe.
Există însă posibilitatea de a separa fișierele odată ce procedurile au fost testate și merg.
Directiva include poate face asta.
OBS: Atenție la numele de fișiere! Ele trebuie să respecte convenția 8.3 altfel DOSBox
nu le vede și nu le poate accesa. Adică maxim 8 caractere în nume, punct și maxim 3 caractere
în extensie.