K
K
Kezzya2021-12-08 11:58:27
assembler
Kezzya, 2021-12-08 11:58:27

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

Is it possible to somehow write this comparison in such a way that it can be added to si once?

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

1 answer(s)
J
jcmvbkbc, 2021-12-08
@Kezzya

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

you wrote something incomprehensible.
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

it can be done like this:
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 question

Ask a Question

731 491 924 answers to any question