DOS неправильный вывод строки - Assembler

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

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

Разбирая программу отслеживаю переходы по условию. Ветви которые в данный момент не интересуют (условно ошибочные) глушу выводом сообщения ERROR. "Правильный" путь сообщением "OK". На определённом этапе столкнулся со следующей ситуацией, вместо заглушки ОК воткнул заглушку ERROR. Техническая ошибка, скопировал, а переименовать забыл. Тем не менее программа как ни в чем не бывало продолжает выдавать сообщение OK, даже тогда, когда саму заглушку выводящую это сообщение я тупо закомнчиваю. И лишь только после того как в данных закоменчиваю строку OK программа начинает выводить ERROR. Смотрел свой же код в IDA pro? вроде все адреса на ERROR ведут, а программа один хрен рапортует OK не имея ни одного перехода на вывод этой мессаги. Код
format MZ 
entry main:start            ; program entry point
segment main                ; main program segment 
  start:
 int     12h ; Return: AX = number of contiguous 1K blocks of memory
 ; так же 0040h:0013h (0:413)
 mov     ax,seg001  ; сегмент
 mov     es, ax         ; доп доп данных
; assume es:seg001
 mov     ax, ds  ;  сегмента данных
 mov     [es:adr_ds], ax  ; сохранить в переменной (далее не встречается???)
 smsw    ax         ; чтение состояния машины
 test    al, 1  ; проверка на защищенный режим
 jz     real        ; если реальная адресация - переход
;===============================================================================
 JMP ERROR; seg000:0036 КОД_НЕ_РАЗОБРАН
;===============================================================================
 
real:   ; seg000:00EF
 mov     ah, 88h ; [url]http://www.codenet.ru/progr/dos/int_0014.php[/url]
 int     15h     ; размер extended-памяти
 jnb     Extend_mem_ok   ; CF=0 - всё ОК
;===============================================================================
 JMP ERROR; seg000:00F5 КОД_НЕ_РАЗОБРАН 
;=============================================================================== 
 
Extend_mem_ok: ; seg000:013C
;===============================================================================
 JMP ERROR; seg000:00F5 КОД_НЕ_РАЗОБРАН 
;=============================================================================== 
 
;===============================================================================
; ВРЕМЕННО 
ERROR:
    mov dx,mesERROR
    call OUTPUT_TEXT 
    jmp EXIT    
;OK:
;    mov dx,mesOK
;    call OUTPUT_TEXT 
;    jmp EXIT        
EXIT:
    mov ax,4C00h
    int 21h
    
OUTPUT_TEXT:
    mov ah,9
    int 21h
    ret
;=============================================================================== 
; СЕГМЕНТ ДАННЫХ   DS (он же дальше ES) 
segment seg001
adr_ds dw 0    ; сохранение адреса сегмента ds 
 
;===============================================================================
; ВРЕМЕННО  
mesOK db '   Ok   ',24h 
mesERROR db '   ERROR   ',24h

Решение задачи: «DOS неправильный вывод строки»

textual
Листинг программы
ERROR:
    mov ax, seg001
    mov ds,ax
    mov dx,mesERROR
    call OUTPUT_TEXT 
    jmp EXIT

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

  1. mov ax, seg001 — это команда, которая переносит значение сегмента в регистр AX.
  2. mov ds,ax — это команда, которая устанавливает сегмент данных равным значению регистра AX.
  3. mov dx,mesERROR — это команда, которая переносит адрес строки mesERROR в регистр DX.
  4. call OUTPUT_TEXT — это команда, которая вызывает процедуру вывода текста на экран.
  5. jmp EXIT — это команда, которая переходит к метке EXIT, завершая программу.

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

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