Answer the question
In order to leave comments, you need to log in
How can you ignore the elements of a string?
My code replaces numbers with Roman ones, but if you enter other characters into a string, then the code does not work, since it takes asci numbers and works with it. Now I think we need to compare if the character is not in the range 31h-39h, then we need to go further along the array element (array = input string), but I can’t figure out how to write it down, because I have to add two units to the array element under two conditions if a number is entered.
cmp StringT[si], 31h
add si, 1
jl metka
cmp StringT[si], 39h
add si, 1
jg metka
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
Answer the question
In order to leave comments, you need to log in
I can’t figure out how to write it down, because under two conditions I have to add two units to the array element if a number is entered
it is necessary to compare if the character is not included in the range 31h-39h, then it is necessary to go further along the array element
metka:
mov ax,0
mov al, StringT[si]
sub al, 49
jl next # перейти к следующей цифре, если код текущей меньше '1'
cmp al, 9
jnl next # перейти к следующей цифре, если текущая больше 9
mov bl, al
shl bl, 1 ;умножение на 2, т.к. размер адреса - 2 байта
xor ax, ax
mov dx, offset List[bx]
mov ah, 09h
int 21h
next:
add si, 1
loop metka
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question