Запись строки в файл дает на выходе странные символы в ассемблере

Я пытаюсь сохранить свою строку в файле на ассемблере, но это дает мне этот странный вывод с «версией 2.40 (все виды специальных символов)»

Это то, что я делаю:

mov ah,09
mov dx,200
int 21
int 20

e 200 "Test$"
n test.com
r cx
:0009
w
q

Он успешно сохраняет его, и он также работает нормально, когда я не выхожу из программы и не использую «g», но когда я «q» и пытаюсь запустить test.com, он дает мне вывод, который я упомянул.


person Sinan Samet    schedule 27.11.2015    source источник
comment
Просто из интереса: что это за ассемблер?   -  person cadaniluk    schedule 27.11.2015
comment
Windows 3.1 это школьное упражнение   -  person Sinan Samet    schedule 27.11.2015
comment
Windows 3.1 — это операционная система, а не ассемблер. Но все равно спасибо за подсказку, будем разбираться.   -  person cadaniluk    schedule 27.11.2015
comment
Да, нам пришлось установить Windows 3.1, и при запуске DOS просто запускается, поэтому я не знаю конкретную версию или что-то в этом роде.   -  person Sinan Samet    schedule 27.11.2015
comment
В файл был записан только опкод, а не строка, размещенная по адресу hex 0200.   -  person Dirk Wolfgang Glomp    schedule 28.11.2015


Ответы (3)


Я предполагаю, что вы используете DEBUG.EXE.

После e 200 "Test$" сделайте d 200. Вы видите дамп памяти, начинающийся со смещения 200. Это выглядит так:

16C7:0200  54 65 73 74 24 00 00 00-00 00 00 00 00 00 00 00   Test$...........
16C7:0210  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
16C7:0220  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
16C7:0230  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
16C7:0240  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
16C7:0250  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
16C7:0260  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
16C7:0270  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

Теперь считайте смещение, пока не достигнете 24: 200, 201, 202, 203, 204. Вы хотите сохранить память со смещением 100h до 204h, это 105h байт (204h-100h+1).

Это значение должно быть сохранено в CX:

r cx
:0105

С помощью w вы записываете CX байт.

person rkhb    schedule 27.11.2015
comment
Спасибо, это работает! Это всегда должно быть +1 из 24, верно? - person Sinan Samet; 27.11.2015
comment
@SinanSamet: Да. Если вы хотите сохранить один байт, начиная со 100h, вам нужно вычислить (100h - 100h + 1). Кстати: Google для отключения одной ошибкой. - person rkhb; 27.11.2015
comment
Руководство по отладке: armory.com/~rstevew/Public/Tutor /Отладка/debug-manual.html - person Dirk Wolfgang Glomp; 28.11.2015

int 20 не проблема, я не думаю. 9 в cx недостаточно, чтобы написать код в 100 (предположительно) и строку в 200. Я думаю, вы также хотите w 100. Если это не DEBUG, простите меня.

person Frank Kotler    schedule 27.11.2015

В моей книге по DOS говорится о int 20h

Это был стандартный способ завершения программ DOS в DOS V1. С появлением функций DOS 4Ch и 31h это больше не является рекомендуемым способом завершения программы, если она не должна поддерживать совместимость с системами DOS V1.

Я предлагаю вам использовать int 21h функцию AH = 4Ch с AL установленным на код возврата.

person Weather Vane    schedule 27.11.2015
comment
Для меня это немного непонятно, я действительно только новичок в этом, пытаясь понять это. - person Sinan Samet; 27.11.2015
comment
@SinanSamet Короче говоря: это устарело. Вместо этого используйте предложение WeatherVane. - person cadaniluk; 27.11.2015
comment
Это будет верно для Windows 3.1. - person Weather Vane; 27.11.2015
comment
Мы также можем завершить COM-программу для DOS с помощью инструкции ret, если мы не повредим стек и сегмент кода. Потому что DOS помещает инструкцию типа int 20h в начало PSP и помещает нулевое слово в стек как раз перед тем, как разрешить выполнение программы. Если мы наконец выполним команду ret, то процессор вернется к нулевому адресу и продолжит выполнение инструкции int 20h внутри PSP для завершения нашей программы. - person Dirk Wolfgang Glomp; 28.11.2015