0
Nicu Natea
#1
.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
Reply



Forum Jump: