Marta Kiełczewska grupa AiR1
Barnik Grzegorz
Grzegrzółka Paweł
Majewski Paweł
Architektura Systemów Komputerowych - Projekt 1
Program nazwany przez nas „HEX” ma na celu przeliczanie liczby podanej przez użytkownika w kodzie szesnastkowym na liczbę zapisaną w kodzie dziesiętnym. Kompilator, jakiego użyliśmy do skompilowania kodu to Turbo Assembler w wersji 5.0. Aby uruchomić program należy uruchomićplik wsadowy hex.exe, natomiast kod programu zawarty został w niniejszym sprawozdaniu oraz w pliku hex.asm, załączonym do sprawozdania.
Program wykorzystuje przerwanie 21h funkcja 01h do wczytania tekstu, 21h funkcja 09h do wyświetlenia tekstu, 21h funkcja 02h oraz 21h 04ch do zakończenia programu. Działanie aplikacji opiera się na wczytaniu wprowadzonego z klawiatury znaku w kodzie ASCII do rejestru AL, następnie dokonywana jest zamiana z kodu ASCII na wartość cyfry. W kolejnym kroku przekonwertowana na postać binarna liczba zostaje zapisana w rejestrze AX. Następnie program dokonuje konwersji liczby z postaci heksagonalnej na dziesiętną i wyświetla wynik konwersji na ekranie. Warto zauważyć, że w przypadku wpisywania liczby zawierającej mniej niż 4 znaki należy wcisnąć klawisz ENTER, podczas gdy w momencie wpisania czwartego znaku wciskanie owego klawisza nie jest już konieczne, gdyż program sam zacznie wykonywać powierzone mu instrukcje co zapobiega wpisaniu przez użytkownika liczby zawierającej więcej niż 4 znaki. Instrukcje, wykonywane kolejno przez program znajdują się w komentarzach do poszczególnych linijek kodu (wyszczególnionych w niniejszym sprawozdaniu kursywą).
rys. Obraz widoczny na ekranie po zakończeniu działania programu.
Kod programu:
dane SEGMENT
komunikat db 13, 10,'Prosze podac liczbe HEX nie wieksza FFFF '
db 'i nacisnac Enter $'
wynik db 13, 10, 'Liczba zapisana w systemie dziesietnym to = $'
tbl_cyfr db 10 dup (?)
dane ENDS
rozkazy SEGMENT
ASSUME cs:rozkazy, ds:dane
pocz: mov ax, SEG dane
mov ds, ax
mov dx, OFFSET komunikat
mov ah, 9
int 21H ; wyswietlenie tekstu informacyjnego
; wczytywanie liczby dziesiętnej z klawiatury, konwersja na postać binarną, która zostaje wpisana do rejestru AX po wprowadzeniu ostatniej cyfry należy nacisnąć klawisz Enter
mov cl, 0 ; poczatkowa wartosc ilosci wpisanych liczby w rejestrze CL
mov si, 0 ; poczatkowa wartosc wyniku konwersji w
rejestrze SI
ptlc: mov ah, 1
int 21H ; wczytywanie znaku w kodzie ASCII z klawiatury do rejestru AL
cmp al, 13
je nacisn_enter ; skok, gdy naciśnięto klawisz Enter
sub al, 30H ; zamiana kodu ASCII na wartość cyfry
cmp al, 41
ja mala_litera ; zostala wpisana mala litera (a,b,...)
cmp al, 9
ja duza_litera ; zostala wpisana duza litera (A,B,...)
return: mov bx, 0 ; zerowanie rejestru BX
mov bl, al ; wpisanie kolejnej cyfry do rejestru BL
mov ax, 16 ; mnożnik
mul si ; mnożenie dotychczas uzyskanego wyniku przez 16
add ax, bx ; dodanie aktualnie wczytanej cyfry
mov si, ax ; przesłanie wyniku obliczenia do rejestru SI
inc cl
cmp cl,4
je nacisn_enter ; skok, gdyz liczba ma juz 4 znaki
jmp ptlc ; skok na początek pętli
nacisn_enter:
mov ax, si ; przepisanie wyniku konwersji do rejestru AX
jmp koniec
duza_litera:
sub al,7 ;A=10, B= 11 ... itd
jmp return
mala_litera:
sub al,39 ;a=10, b= 11 ... itd
jmp return
koniec:
; wartość binarna wprowadzonej liczby znajduje się teraz w rejestrze AX
mov si, ax ; przechowanie AX
mov dx, OFFSET wynik
mov ah, 9
int 21H ; wyświetlenie tekstu o wyniku obliczenia
; konwersja liczby zawartej w rejestrze AX
mov ax, si ; odtworzenie AX
mov cx, 10 ; liczba obiegów pętli
mov bx, 10 ; dzielnik
mov si, 9 ; indeks początkowy w tablicy tbl_cyfr
ptlw: mov dx, 0 ; zerowanie starszej części dzielnej
div bx ; dzielenie przez 10; iloraz w AX, reszta w DX
add dl, 30H ; zamiana reszty na kod ASCII
mov tbl_cyfr[si], dl ; odesłanie kodu ASCII kolejnej cyfry do tablicy tbl_cyfr
dec si ; zmniejszenie indeksu w rejestrze SI o 1
loop ptlw ; sterowanie pętlą
; usuwanie zer nieznaczących z lewej strony
mov cx, 9 ; liczba obiegów pętli usuwania
; zer nieznaczących
mov si, 0 ; indeks początkowy w tablicy tbl_cyfr
ptz: cmp byte PTR tbl_cyfr[si], 30H ; czy cyfra '0'
jne wyskocz
mov byte PTR tbl_cyfr[si], 20H ; wpisanie kodu spacji
; w miejsce zera
inc si
loop ptz
; wyświetlanie cyfr
wyskocz:
mov cx, 10 ; liczba obiegów pętli wyświetlania
mov si, 0 ; indeks poczatkowy w tablicy tbl_cyfr
ptlw2: mov dl, tbl_cyfr[si]; pobranie kodu ASCII kolejnej cyfry
mov ah, 2
int 21H ; wyświetlenie cyfry na ekranie
inc si ; zwiększenie indeksu w rejestrze SI o 1
loop ptlw2 ; sterowanie pętlą wyświetlania
mov al, 0 ; kod powrotu programu
mov ah, 4CH
int 21h ; koniec programu - przekazanie sterowania
rozkazy ENDS
END pocz