Мусор при выводе строки - Assembler

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

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

В общем, вводится строка, а потом выводится... кракозябрами
.model  tiny
.data
 
sIn db  'Ââåäèòå ñòðîêó:  $'
sOut    db  0dh,0ah,'ГЉГ®Г*ГҐГ·Г*Г*Гї ñðîêГ*: $'
 
buf label   byte    ; ГЎГіГґГҐГ° äëÿ ïðèåìГ* ñòðîêè Г± ГЄГ«Г*ГўГЁГ*òóðû (ГЇГ® Гґ-ГЁ 0ah)
max db  128         ; Г¬Г*ГЄГ±ГЁГ¬Г*ëüГ*Г*Гї äëèГ*Г* ñòðîêè
len db  0           ; ðåГ*ëüГ*Г*Гї äëèГ*Г* ââåäåГ*Г*îé ñòðîêè
string  db  128 dup (?) ; Г±Г*Г¬Г* ñòðîêГ*

.code
.startup
 
    lea dx, sIn
    mov ah, 9
    int 21h     ; ïðèãëГ*ГёГҐГ*ГЁГҐ ГўГўГҐГ±ГІГЁ ñòðîêó
 
    lea dx, buf
    mov ah, 0ah
    int 21h     ; ââîäèì ñòðîêó
 
    xor bl, bl      ; bl - ГґГ«Г*ГЈ òîãî, Г·ГІГ® õîòÿ ГЎГ» 1 ñëîâî Г*Г*éäåГ*Г®
    xor bh, bh      ; bh =1, êîãäГ* ìû óæå äîáГ*âèëè îäèГ* ïðîáåë (Г*Г* ñëó÷Г*Г© ãðóïïû Г°Г*çäåëèòåëåé)
    lea si, string  ; Г±Г*Г¬Г* ñòðîêГ* 
    
main_loop:          ; îñГ*îâГ*îé öèêë
    lodsb           ; î÷åðåäГ*îé ñèìâîë Гў ðåãèñòð al
    cmp al, 0dh     ; ГЄГ®Г*ГҐГ¶ ñòðîêè ?
    je  print_rezult; Г*Г* ГЄГ®Г*ГҐГ¶ îáðГ*áîòêè
 
    cmp al, 30h     ; öèôðû ?
    jb  separator   ; ìåГ*ГјГёГҐ - Г°Г*çäåëèòåëü
    cmp al, 39h     ; '9'
    jbe word_found  ; Г·Г*Г±ГІГј ñëîâГ*
 
    cmp al, 'A'     ; áîëüøèå Г«Г*ГІГЁГ*Г±ГЄГЁГҐ ?
    jb  separator   ; ìåГ*ГјГёГҐ - Г°Г*çäåëèòåëü
    cmp al, 'Z'
    jbe word_found  ; Г·Г*Г±ГІГј ñëîâГ*
 
    cmp al, 'a'     ; Г¬Г*ëûå Г«Г*ГІГЁГ*Г±ГЄГЁГҐ ?
    jb  separator   ; ìåГ*ГјГёГҐ - Г°Г*çäåëèòåëü
    cmp al, 'z'
    jbe word_found  ; Г·Г*Г±ГІГј ñëîâГ*
 
    cmp al, 80h     ; êèðèëëèöГ* ГЂ-ГЇ
    jb  separator   ; ìåГ*ГјГёГҐ - Г°Г*çäåëèòåëü
    cmp al, 0afh
    jbe word_found  ; Г·Г*Г±ГІГј ñëîâГ*
 
    cmp al, 0e0h    ; êèðèëëèöГ* Г°-Гї,ВЁ,Вё,ГіГЄГ°Г*ГЁГ*Г±ГЄГЁГҐ,áåëîðóññêèå áóêîâêè
    jb  separator   ; ìåГ*ГјГёГҐ - Г°Г*çäåëèòåëü
    cmp al, 0f7h
    jbe word_found  ; Г·Г*Г±ГІГј ñëîâГ*
 
separator:
    cmp bl,0        ; ìîæГ*Г® ëè äîáГ*âëÿòü ïðîáåëû?
    je next         ; äîáГ*âëÿòü Г*åëüçÿ
    cmp bh, 0       ; ïðîáåë ГҐГ№ГҐ Г*ГҐ äîáГ*âëÿëè
    je add_probel   ; äîáГ*âëÿåì ïðîáåë
    jmp next
 
add_probel: 
    mov bh,1        ; ôèêñèðóåì äîáГ*âëåГ*ГЁГҐ ïðîáåëГ*
    ; äîáГ*âëÿåì ïðîáåë
    
    jmp next
   
word_found:         ; ñëîâî
    mov bl,1        ; õîòÿ ГЎГ» îäГ*Г® ñëîâî Г*Г*éäåГ*Г®,ìîæГ*Г® äîáГ*âëÿòü ïðîáåëû
    mov bh,0        ; 
    jmp next        ; Г*Г* Г·ГІГҐГ*ГЁГҐ î÷åðåäГ*îãî ñèìâîëГ*
 
next:
    jmp main_loop   ; Г*Г* îñГ*îâГ*îé öèêë
    
print_rezult:       ; âñòðåòèëè ГЄГ®Г*ГҐГ¶ ñòðîêè
    ; ГЇГҐГ·Г*ГІГ*ГҐГ¬ ГІГҐГЄГ±ГІ
    mov ah,09h
    lea dx,sOut
    int 21h
 
    ;ГЇГҐГ·Г*ГІГ*ГҐГ¬ ñòðîêó
    mov ah, 09h
    lea dx, string  ; Г°Г*ГўГ*îñèëüГ*Г® mov dx, offset string
    int 21h

ret
endp
end
Вывод строки вроде стандартный...

Решение задачи: «Мусор при выводе строки»

textual
Листинг программы
add_probel:
    mov bh,1            ; фиксируем добавление пробела
    ; добавляем пробел -???
 
    jmp next

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

В данном коде выполняется добавление пробела в строку, но в коде присутствуют некоторые непонятные моменты:

  1. mov bh,1 - здесь переменной bh присваивается значение 1. В контексте данной задачи, скорее всего, это означает, что в строку будет добавлен пробел.
  2. ; добавляем пробел -??? - здесь отсутствует реализация добавления пробела. Возможно, это означает, что пробел должен быть добавлен каким-то другим способом, например, через изменение значения другой переменной.
  3. jmp next - здесь выполняется переход к следующей инструкции, которая, скорее всего, должна быть реализована вне данного блока кода. Вот список выполненных действий:
  4. Фиксация добавления пробела с помощью переменной bh.
  5. Отсутствует реализация добавления пробела.
  6. Выполняется переход к следующей инструкции.

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


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

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

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