Kezzya
@Kezzya

Как можно игнорировать элементы строки?

У меня код заменяет числа на римские, но если ввести другие символы в строку то код не работает, так как он берёт аски цифры и с ней работает. Сейчас думаю надо сравнить если символ не входит в диапазон 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
  • Вопрос задан
  • 59 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
не могу понять как это записать, потому что у меня при двух условиях приходится добавлять к элементу массива две единицы, если введено число

ты написал что-то непонятное.

надо сравнить если символ не входит в диапазон 31h-39h, то надо идти дальше по элементу массива

это можно сделать например так:

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
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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