.model small
.stack 100
.data
tabel db 1, 2, 3, 4, 5, 11 dup (?)
numar1 dd 145A789Fh
numar2 dd 92457ABCh
numarbcd1 dw 1234h
numarbcd2 dw 5678h
numarbcddesp1 dw 0102h
numarbcddesp2 dw 0009h
asciiTable db '0123456789ABCDEF'
.code
; ne astepam ca in ax sa avem un numar in BCD impachetat
; de exemplu 0x1234 => printam 1234
afisWord proc
push cx
mov cx, 4
reiaAfis:
rol ax, 4 ; mutam cei mai semnificativi 4 biti pe ultima pozitie
call afisareCaracter
; sau precum ati vrut: loop cx
dec cx
cmp cx, 0
jnz reiaAfis
; rotatie completa => nu e nevoie sa salvam ax
pop cx
ret
afisWord endp
; ne astepam ca in ax sa avem un numar in BCD despachetat
; de exemplu 0x0108 => printam 18
afisWordDesp proc
push cx
mov cx, 2
reiaAfisWord:
rol ax, 8 ; mutam cei mai semnificativi 8 biti pe ultima pozitie
call afisareCaracter
loop reiaAfisWord
; rotatie completa => nu e nevoie sa salvam ax
pop cx
ret
afisWordDesp endp
afisareCaracter proc
push ax
push bx
push dx
lea bx, asciiTable
and al, 0Fh ; folosim o masca pt a pastra doar ultimii octeti
xlat ; luam in al caracterul ascii din asciiTable al <- ds:[bx+al];
mov ah, 2h ; dos 21h: 'Write character to STDOUT'
mov dl, al
int 21h
pop dx ; restauram registrii
pop bx
pop ax
ret
afisareCaracter endp
start:
mov ax, @data
mov ds, ax
; random
mov ax, 12h
mov bx, 0h
not ax
and bx, ax
; aplicatia 1
mov al, 10011110b
mov cl, 3
rol al, cl
; aplicatia 2
mov bx, sp
mov cx, 2134h
push cx
mov byte ptr ss:[bx-2], 22h
pop cx
; aplicatia 3
mov cl, 4
mov ax, 0702h
shl al, cl
shr ax, cl
; aplicatia 4
mov cx, 1234H
push cx
mov bx, 2359h
push bx
mov ax, 4257h
mov bp, sp
mov byte ptr [bp], al
pop ax
; aplicatia 5
; incarcam partea low din numere si le adunam
mov cx, word ptr numar1
add cx, word ptr numar2 ; rezultatul adunarii pastrat in cx
; incarcam partea high din numere si le adunam tinand cont de cary flag
mov bx, word ptr numar1[2]
adc bx, word ptr numar2[2] ; rezultatul adunarii pastrat in bx
; afisam partea high, pastrata in bx
mov ax, bx
call afisWord
; afisam partea low, pastrata in cx
mov ax, cx
call afisWord
; rand nou
mov ah, 2h ; dos 21h: 'Write character to STDOUT'
mov dl, 10 ; '\r'
int 21h
mov dl, 13 ; '\n' ... sau invers
int 21h
; aplicatia 6
mov al, byte ptr numarbcd1 ; copiem partea low in al 0x34
mov bl, byte ptr numarbcd2 ; copiem partea low in bl 0x78
add al, bl ; al = 0x34+0x78 = 0xAC => numar ce nu e valid in BCD
daa ; ajustam rezultatul => 112 => CF = 1 si al=12
mov cl, al ; salvam rezultatul in cl
mov al, byte ptr numarbcd1[1] ; copiem partea high in al
mov bl, byte ptr numarbcd2[1] ; copiem partea high in bl
adc al, bl ; al = al + bl + CF = 0x12+0x56 + 0x1 = 0x69
daa ; ajustam rezultatul => 0x69
mov ch, al ; salvam rezultatul in ch
; afisam numarul
mov ax, cx
call afisWord
mov ah, 4ch
int 21H
end start
.stack 100
.data
tabel db 1, 2, 3, 4, 5, 11 dup (?)
numar1 dd 145A789Fh
numar2 dd 92457ABCh
numarbcd1 dw 1234h
numarbcd2 dw 5678h
numarbcddesp1 dw 0102h
numarbcddesp2 dw 0009h
asciiTable db '0123456789ABCDEF'
.code
; ne astepam ca in ax sa avem un numar in BCD impachetat
; de exemplu 0x1234 => printam 1234
afisWord proc
push cx
mov cx, 4
reiaAfis:
rol ax, 4 ; mutam cei mai semnificativi 4 biti pe ultima pozitie
call afisareCaracter
; sau precum ati vrut: loop cx
dec cx
cmp cx, 0
jnz reiaAfis
; rotatie completa => nu e nevoie sa salvam ax
pop cx
ret
afisWord endp
; ne astepam ca in ax sa avem un numar in BCD despachetat
; de exemplu 0x0108 => printam 18
afisWordDesp proc
push cx
mov cx, 2
reiaAfisWord:
rol ax, 8 ; mutam cei mai semnificativi 8 biti pe ultima pozitie
call afisareCaracter
loop reiaAfisWord
; rotatie completa => nu e nevoie sa salvam ax
pop cx
ret
afisWordDesp endp
afisareCaracter proc
push ax
push bx
push dx
lea bx, asciiTable
and al, 0Fh ; folosim o masca pt a pastra doar ultimii octeti
xlat ; luam in al caracterul ascii din asciiTable al <- ds:[bx+al];
mov ah, 2h ; dos 21h: 'Write character to STDOUT'
mov dl, al
int 21h
pop dx ; restauram registrii
pop bx
pop ax
ret
afisareCaracter endp
start:
mov ax, @data
mov ds, ax
; random
mov ax, 12h
mov bx, 0h
not ax
and bx, ax
; aplicatia 1
mov al, 10011110b
mov cl, 3
rol al, cl
; aplicatia 2
mov bx, sp
mov cx, 2134h
push cx
mov byte ptr ss:[bx-2], 22h
pop cx
; aplicatia 3
mov cl, 4
mov ax, 0702h
shl al, cl
shr ax, cl
; aplicatia 4
mov cx, 1234H
push cx
mov bx, 2359h
push bx
mov ax, 4257h
mov bp, sp
mov byte ptr [bp], al
pop ax
; aplicatia 5
; incarcam partea low din numere si le adunam
mov cx, word ptr numar1
add cx, word ptr numar2 ; rezultatul adunarii pastrat in cx
; incarcam partea high din numere si le adunam tinand cont de cary flag
mov bx, word ptr numar1[2]
adc bx, word ptr numar2[2] ; rezultatul adunarii pastrat in bx
; afisam partea high, pastrata in bx
mov ax, bx
call afisWord
; afisam partea low, pastrata in cx
mov ax, cx
call afisWord
; rand nou
mov ah, 2h ; dos 21h: 'Write character to STDOUT'
mov dl, 10 ; '\r'
int 21h
mov dl, 13 ; '\n' ... sau invers
int 21h
; aplicatia 6
mov al, byte ptr numarbcd1 ; copiem partea low in al 0x34
mov bl, byte ptr numarbcd2 ; copiem partea low in bl 0x78
add al, bl ; al = 0x34+0x78 = 0xAC => numar ce nu e valid in BCD
daa ; ajustam rezultatul => 112 => CF = 1 si al=12
mov cl, al ; salvam rezultatul in cl
mov al, byte ptr numarbcd1[1] ; copiem partea high in al
mov bl, byte ptr numarbcd2[1] ; copiem partea high in bl
adc al, bl ; al = al + bl + CF = 0x12+0x56 + 0x1 = 0x69
daa ; ajustam rezultatul => 0x69
mov ch, al ; salvam rezultatul in ch
; afisam numarul
mov ax, cx
call afisWord
mov ah, 4ch
int 21H
end start