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
Объяснение кода листинга программы
- mov ax, seg001 — это команда, которая переносит значение сегмента в регистр AX.
- mov ds,ax — это команда, которая устанавливает сегмент данных равным значению регистра AX.
- mov dx,mesERROR — это команда, которая переносит адрес строки
mesERROR
в регистр DX. - call OUTPUT_TEXT — это команда, которая вызывает процедуру вывода текста на экран.
- jmp EXIT — это команда, которая переходит к метке EXIT, завершая программу.