У меня код заменяет числа на римские, но если ввести другие символы в строку то код не работает, так как он берёт аски цифры и с ней работает. Сейчас думаю надо сравнить если символ не входит в диапазон 31h-39h, то надо идти дальше по элементу массива( массив = введённая строка), однако не могу понять как это записать, потому что у меня при двух условиях приходится добавлять к элементу массива две единицы, если введено число.
cmp StringT[si], 31h
add si, 1
jl metka
cmp StringT[si], 39h
add si, 1
jg metka
Можно ли вообще как-то это сравнение записать так, чтобы один раз можно было прибавить к si ?
STACKSG SEGMENT PARA STACK ; определение сегмента стека
DW 128 DUP(?) ; под стек резервируем 128 слов
.386
STACKSG ENDS ; конец сегмента стека
;---------------------------------------
DATASG SEGMENT PARA use16 ; определение сегмента данных
_1 db "I-", "$"
_2 db "II-", "$"
_3 db "III-", "$"
_4 db 'IV-', '$'
_5 db 'V-', '$'
_6 db 'VI-', '$'
_7 db 'VII-', '$'
_8 db 'VIII-', '$'
_9 db 'IX-', '$'
List dw _1, _2, _3, _4,_5,_6,_7,_8,_9
MAX_SYMB EQU 64
indent db '', 0Dh,0Ah,'$'
AskClient db 'Put your numbers to convert: $'
InBuff label byte
MaxSymb Db MAX_SYMB
RealSymb Db ?
StringT db 1 dup ('$')
DATASG ENDS ; конец сегмента данных
;---------------------------------------
CODESG SEGMENT PARA use16 ; определение сегмента кода
; исполнима¤ часть программы
MAIN PROC FAR
ASSUME CS:CODESG, SS:STACKSG, DS:DATASG, ES:DATASG
; стандартное начало EXE-программы
mov ax, DATASG
mov ds,ax
xor ax,ax
MOV AX,0600H ;Запрос на очистку экрана.
MOV BH,07 ;Нормальный атрибут (черно/белый).
MOV CX,0000 ;Верхняя левая позиция.
MOV DX,184FH ;Нижняя правая позиция.
INT 10H ;Передача управления в BIOS.
xor ax,ax
xor bx,bx
xor cx,cx
xor dx,dx
mov dx, offset AskClient
mov ah,9
int 21h
xor dx,dx
xor ax,ax
mov dx, offset InBuff
mov ah, 0ah
int 21h
xor dx,dx
mov dx, offset indent
mov ah, 09
int 21h
xor dx,dx
MOV DH, 10 ; позиция по вертикали
MOV DL, 35 ; позиция по горизонтали
MOV AH, 02H ; установить положение курсора
INT 10H ; вызов прерывания BIOS 10H
mov cl, [RealSymb]
metka:
mov ax,0
mov al, StringT[si]
sub al, 49
mov bl, al
shl bl, 1 ;умножение на 2, т.к. размер адреса - 2 байта
xor ax, ax
mov dx, offset List[bx]
mov ah, 09h
int 21h
add si, 1
loop metka
mov dx, offset indent
mov ah, 09
int 21h
xor dx,dx
mov dx, offset AskClient
mov ah,9
int 21h
xor dx,dx
; стандартное окончание программы
MOV AX,4C00h
INT 21h
MAIN ENDP ; конец исполнимой части программы
CODESG ENDS ; конец сегмента кода
END MAIN ; указывает, что исполнима¤ часть программы
; начинаетс¤ с метки MAIN