caute, potreboval by som pomôcť so zadanim. neako mi to nejde vie to niekto upraviť..
pls
Text zadania:
Načítajte zo súboru reťazec znakov ukončený znakom "konca súboru". Nech tento reťazec predstavuje celé číslo v desiatkovej sústave. Preveďte toto číslo do šestnástkovej sústavy a vytlačte výsledok.
TITLE prevod.asm
.MODEL SMALL
.STACK 400
.DATA
lf DB 13
cr DB 10
output1 DB 'Zadane cislo je $'
output2 DB ' v sestnastkovej sustave.',13,10,'$'
char DB 0
kelosoli DB 0,0
tabulka DB '0123456789ABCDEF'
.CODE
newline MACRO ;makro noveho riadku
push ax
push dx
mov ah,02h
mov dl,CR
int 21h
mov dl,LF
int 21h
pop dx
pop ax
ENDM
ukaz16kovo PROC ;procedura na zobrazenie cisla v decimalnom kode parametrom je cislo ulozene v bufferi
push bp ;ulozenie ukazovatela na aktualnu poziciu zasobnika
mov bp,sp
push ax ;na zaciatku procedury ulozime do zasobnika stare obsahy registrov
push bx
push cx
push dx
mov ah,02h
mov dl,'0'
int 21h
mov dl,'.' ;kedze ide o desatinne cislo tak najprv napisat 0.
int 21h
mov cx,00h
mov dh,00h ;pripravenie parametrov
mov bx,0000h
mov ax,[bp+4] ;nacitanie zo zasobnika cislo na zobrazenie
nocheinmal:
mov cx,16
mov dx,0000h
mul cx ;nasobenie sestnastkou
add dl,48 ;pripocitanie ASCII nuly
push ax
mov ah,02h ;vypis danej cislice v dl na obrazovku
int 21h
pop ax
cmp ax,00h
jnz nocheinmal
pop dx
pop cx ;vratenie povodnych obsahov registrov
pop bx
pop ax
pop bp
ret 2
ukaz16kovo ENDP
getc PROC NEAR ;procedura na nacitanie znaku z klavesnice
push bp ;parametrom procedury je offset buffera na ulozenie znaku
mov bp,sp
push ax ;na zaciatku procedury ulozime do zasobnika stare obsahy registrov
push bx
mov bx,[bp+4] ;nacitanie z zasobnika offset buffera na ulozenie znaku
mov ah,01h ;DOS funkcia na nacitanie znaku z klavesnice
int 21h ;volanie prerusenia
mov [bx],al ;ulozenie znaku do buffera
cmp al,lf ;porovnanie s koncom riadku
pop bx ;vratenie povodnych obsahov registrov
pop ax
pop bp
ret 2
getc ENDP
start:
mov ax,@DATA ;ulozenie datoveho segmentu
mov ds,ax ;do ds
mov dx,0000h
mov bx,OFFSET char ;pripravenie prametra procedury getc
mov ax,2000h
cyklus:
push bx ;sprostredkovanie parametra procedure getc cez zasobnik
call getc ;volanie nacitania znaku
jz navestie1 ;skoc na vypis
mov cx,[bx]
cmp cl,'.' ;porovnanie ci moze zacat nacitavat cislo lebo desatinne miesta idu od bodky
jz nastav
cmp dl,01h ;ci treba este nacitavat ci sa uz neprekrocila hranica poctu znakov
jz cyklus
cmp dh,01h ;nastavenie aby viac uz necitalo znaky
jnz cyklus
cmp cl,'0' ;kontrola intervalu cislic
js navestie1
cmp cl,'9'
jns navestie1
push ax
push bx
push dx
mov ch,00h
sub cl,30h
mul cx
mov bx,OFFSET kelosoli
mov cx,[bx]
add cx,ax ;pripocitanie vysledneho cisla
mov [bx],cx
pop dx
pop bx
pop ax
ror ax,3 ;rotacia o tri bity vpravo
cmp ax,4000h
jz nastavd
jmp cyklus ;skoc na nacitanie a testovanie noveho znaku
nastav:
mov dh,01h
jmp cyklus
nastavd:
mov dl,01h
jmp cyklus
navestie1: newline ;volanie makra newline t.j. novy riadok
mov ah,09h ;DOS funkcia zobrazenia retazca na obrazovku
mov dx,OFFSET output1 ;do dx dame offset zaciatku retazca
int 21h ;volanie prerusenia
mov bx,OFFSET kelosoli
mov ax, [bx] ;pripravenie prametra procedury ukaz16kovo
push ax ;sprostredkovanie parametra procedure cez zasobnik
call ukaz16kovo ;volanie zobrazenia cisla v hexa kode
mov ah,09h
mov dx,OFFSET output2
int 21h ;volanie prerusenia
definitiv:mov ax,4c00h ;koniec programu
int 21h ;volanie prerusenia
end start