Wyświetlanie liczby - Asembler

0

Witam. Na zaliczenie muszę oddać program zamieniający liczbę dec na oct, jednakże najpierw zatrzymałem się na samym wczytaniu liczby oraz jej wyświetleniu. Jestem początkującym programistą asemblera. Piszę w TASM'ie. Oto mój kod:

dane segment
napis1 db 'Podaj liczbe dziesietna:', 10, 13, '$'
dane ends

sts segment
dw 512 dup(?)
sts ends

program segment
	assume cs:program, ss:sts, ds:dane

start:
	mov ax, seg dane
	mov ds, ax

	mov ah, 9	;funkcja pobierania danych z klawiatury
	mov dx, offset napis1
	int 21h

	xor bx, bx	;zerujemy bx
	mov cx, 5

wczytywanie:
	mov ah, 1	;funkcja pobierania danych z klawiatury
	int 21h
	cmp al, 13	;czy to jest enter?
	je wyswietl	;jeśli tak, idziemy dalej
	cmp al, '9'
	jg koniec
	cmp al, '0'
	jl koniec
	sub ax, '0'	;zamiana znaku ASCII na liczbę
	push ax
	mov ax, 10	;wczytanie mnożnika
	mul bx
	mov bx, ax
	pop ax
	add bx, ax
	jc koniec
	loop wczytywanie

wyswietl:
	mov ax, bx
	add ax, '0'
	mov ah, 2
	int 21h
	mov ah, 1
	int 21h
koniec:
	mov ah, 4ch
	int 21h

program ends
end start 

Dwie rzeczy, w których prosiłbym o pomoc. Po pierwsze, czy poprawnie zrobione jest zabezpieczenie zapobiegające przekroczeniu 16 bitów? Jeśli nie bardzo proszę o poprawienie kodu lub jakieś wskazówki. Po drugie, samo wyświetlanie liczby. Obecnie program wyświetla tylko jeden znak i to nie liczbę, po prostu jakiś znak. Nie wiem w jaki sposób zmienić kod, aby działał poprawnie.

0
  1. No bo jak to chcesz tak po znaku wypisywać to chyba bierzesz pod uwagę że liczba może mieć więcej niż 1 cyfrę? Więc samo dodanie '0' nic ci tu nie daje. Musiałbyś teraz ten swój wynik dzielić przez 10 aż sie nie wyzeruje i wypisywać reszty z dzielenia (i to od końca!).
0

Ja bym napisał ten program w c++ a później zdekompilował go do assemblera. Po co się męczyć ;d?

0

To juz lepiej skompilować do asemblera (gcc -S) niż dekompilować ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1