@thatmaniscool

Как вывести 4 значное десятичное число в assembler?

Здравствуйте!
Написал небольшую программу, которая которая преобразовывает 16-й код в десятичный с сохранением разрядности.
Но столкнулся с проблемой того, что если в числе есть ноль, то он его не выводит. Как решить эту проблему, до меня не доходит.
#make_COM#

; COM file is loaded at CS:0100h
ORG 100h

MOV BP, 3021
MOV DI, 0


l1:
MOV AX, BP
CMP AX, 9999
JA mCX1
CMP AX, 999
JA mCX2
CMP AX, 99
JA mCX3
CMP AX, 9
JA mCX4
CMP AX, 0
JA mCX5



; Первая цифра
mCX1:
MOV DI, 1
MOV BX, 10000
XOR DX, DX
DIV BX
MOV BP, DX
ADD AX, 30h
MOV DL, AL
MOV AH, 2h
INT 21h
JMP l1

; Вторая цифра
mCX2:
MOV DI, 2
MOV BX, 1000
XOR DX, DX
DIV BX
MOV BP, DX
ADD AX, 30h
MOV DL, AL
MOV AH, 2h
INT 21h
JMP l1

; Третья цифра
mCX3:
CMP DI, 2
JNE st1
MOV AH, 2
MOV DL, 30h
INT 21h
st1:
MOV DI, 3
MOV BX, 100
XOR DX, DX
DIV BX
MOV BP, DX
ADD AX, 30h
MOV DL, AL
MOV AH, 2h
INT 21h
JMP l1

; Четвертая цифра
mCX4:
CMP DI, 3
JNE st2
MOV AH, 2
MOV DL, 30h
INT 21h
st2:
MOV DI, 4
MOV BX, 10
XOR DX, DX
DIV BX
MOV BP, DX
ADD AX, 30h
MOV DL, AL
MOV AH, 2h
INT 21h
JMP l1

; Пятая цифра
mCX5:
CMP DI, 4
JNE st3:
MOV AH, 2
MOV DL, 30h
INT 21h
st3:
MOV DI, 5
MOV BX, 1
XOR DX, DX
DIV BX
MOV BP, DX
ADD AX, 30h
MOV DL, AL
MOV AH, 2h
INT 21h


HLT
stop

Если в значении нет нуля, то все выводится великолепно.
  • Вопрос задан
  • 285 просмотров
Пригласить эксперта
Ответы на вопрос 2
fox_12
@fox_12
Расставляю биты, управляю заряженными частицами
- помещаете цифру в младший разряд
- прибавляете 48 (в ascii коды цифр начинаются с 48)
- выводите полученный символ на экран

З.Ы. Почитайте про организацию циклов. Как-то сложно все у вас.
Ответ написан
15432
@15432
Системный программист ^_^
Вы на последнее сравнение поглядите. Прыжок происходит только если число больше ноля (Jump Above).
там не нужно сравнения вообще, просто JMP mCX5
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы