Посимвольный вывод - Assembler

Узнай цену своей работы

Формулировка задачи:

Нужна помощь, не знаю как реализовать, при вводе конца строки($) в любой части предложения перестает считывать, т.е считывает только до знака конца строки а если поставить в начале $ то вообще ничего не выведет,как это обойти? Вот весь код:
.model small    
 
.stack 100h 
 
.data       
    s  db 80, ?, 81 dup (?)     
    r  db 81 dup (?)        ;Адрес строки результата
    
    m1 db 'vvedite:', 13, 10, '$'
    m2 db 13, 10, 13, 10, 'Result:', 13, 10, '$'
    m3 db 13, 10, 13, 10, 'nazhmite knopku ...$'
 
.code       
Start:      
    mov ax, @data       
    mov ds, ax      
    mov es, ax      
 
    lea dx, m1      
    mov ah, 09      
    int 21h         
    lea dx, s       
    mov ah, 0ah     
    int 21h
    
    lea si, s+2     ; т.к с 3 байта начинаются символы
    lea di, r       
    xor ch, ch      
    mov cl, s+1     ; Помещаем длину введеной строки
    call SetMinWord     
 
    lea dx, m2      
    mov ah, 09      
    int 21h
    lea dx, r       
    mov ah, 09
    int 21h
    
    lea dx, m3      
    mov ah, 09      
    int 21h
    mov ah, 08      
    int 21h
 
    mov ax, 4c00h       
    int 21h
 
;------------------------------------------------------------------
; Подпрограмма поиска слова наименьшей длины и
; укорачивания всех остальных
; Адреса:
;   si-адрес начала исходной строки
;   di-адрес начала строки-результата
;   
;
SetMinWord proc
    mov ah, cl      ; ah - начальная длина строки
    jcxz EXIT       
    cld         
    push cx         
    push si
    push di
 
    mov di, si       
    mov al, 32      
PERVAYA:
    repnz scasb     
                
    pushf           
    mov bx, di      ; вычисляем длину слова
    jne TRETYA          
    dec bx          
TRETYA:
    sub bx, si      
    cmp bl, ah      ; сравниваем длину строки и минимальное слово
    jnc CHETVERTAYA         
    mov ah, bl      
CHETVERTAYA:    
    mov si, di      
    popf            
    je PERVAYA          
                
    pop di          
    pop si          
    pop cx
VTORAYA:    
    push cx         
    mov cl, ah      
    rep movsb       
    pop cx          
    sub cl, ah      
    jz EXIT         
    xchg si, di     ; обмен si и di (т.к. для поиска исполуется es:di)
    repnz scasb     
    xchg si, di     
    jnz EXIT        ;пробела нету
    stosb           ; иначе записываем пробел в строку результата
    jmp VTORAYA     ; переход к адресу smB2 для копирования след. слова
EXIT:
    mov byte ptr [di], '$'  
    ret         
endp
 
end Start

Решение задачи: «Посимвольный вывод»

textual
Листинг программы
    mov  cx,s+1
    lea  si,r
@1: lodsb
    int  29h
    loop @1

Объяснение кода листинга программы

  1. mov cx,s+1 - переменной 'cx' присваивается значение переменной 's' с добавлением единицы.
  2. lea si,r - переменная 'si' получает адрес переменной 'r'.
  3. lodsb - в регистр 'al' загружается байт из памяти по адресу, на который указывает переменная 'si', и знаковый бит устанавливается в единицу.
  4. int 29h - выполняется interrupt 29h, который используется для вывода символа на экран.
  5. loop @1 - цикл, который повторяется до тех пор, пока не будет выполнено условие, указанное в инструкции после символа ':'. В данном случае цикл будет повторяться до тех пор, пока не будет выведено все символы из памяти, начиная с адреса, на который указывает переменная 'r'.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.111 из 5
Похожие ответы