A
Ancient
Пример из отсканированной книги "Assembler, язык неограниченных возможностей" Зубков С.В, 1999 Издательство «ДМК Пресс».
В учебнике есть замечательный пример использования функции DOS-а 09. Суть в том, что пример должен выводить ASCII-таблицу (256 символов), 16-ю строками по 16 символов+2 символа "переноса строки.
Вообще, первоначально в 8-й строке
стояло
но компилятор (TASM) решительно отказался читать подобное за и loop по описанию предназначен для работы с CX, поэтому произвёл замену EX на CX.
Программа явно COM-типа (
), поэтому компилировал (на WinXP SP3) тупо:
Результатом стал файлик dosout1.com и предупреждение от tlink-а "Warning: No stack".
Итоговая программа работает далеко не один раз, а в зависимости от кто бы его знал чего, от 5 до 36 раз (и более). Измерено с помощью вывода в файл dosout1 >dosout1.txt.
Отладчик ничего конкретного не дал, только понимание что символы выводятся вроде как правильно и то что после последней команды, программа начинает работу сначала.
Внимание вопрос: Какого чёрта? (Почему происходит то, что происходит). Программа должна сработать один раз... а не тучу.
Вопрос2: Что сделать чтобы оно работало "правильно"?
PS: Раньше вполне неплохо работал на Pascal-е и Delphi, но с тех пор уже немало воды утекло. Резкий переход на ASM пока что сносит все понятия о понимании. Заранее спасибо за помощь...
В учебнике есть замечательный пример использования функции DOS-а 09. Суть в том, что пример должен выводить ASCII-таблицу (256 символов), 16-ю строками по 16 символов+2 символа "переноса строки.
Код:
; dosout1.asm
; Выводит на экран все ASCII-символы
;
.model tiny
.code
org 100h ; начало СОМ-файла
start:
mov сx,256; вывести 256 символов
mov dl,0 ; первый символ - с кодом 00
mov ah,2 ; номер функции DOS "вывод символа"
cloop: int 21h ; вызов DOS
inc dl ; увеличение DL на 1 - следующий символ
test dl,0Fh; если DL не кратен 16,
jnz continue_loop; продолжить цикл,
push dx ; иначе: сохранить текущий символ
mov dl,0Dh; вывести CR
int 21h
mov dl,0Ah; вывести LF
int 21h
pop dx ; восстановить текущий символ
continue_loop:
loop cloop ; продолжить цикл
ret ; завершение СОМ-файла
end start
Код:
mov сx,256
Код:
mov ex,256; вывести 256 символов
Программа явно COM-типа (
Код:
.model tiny
Код:
tasm dosout1.asm
tlink dosout1.obj
Результатом стал файлик dosout1.com и предупреждение от tlink-а "Warning: No stack".
Итоговая программа работает далеко не один раз, а в зависимости от кто бы его знал чего, от 5 до 36 раз (и более). Измерено с помощью вывода в файл dosout1 >dosout1.txt.
Отладчик ничего конкретного не дал, только понимание что символы выводятся вроде как правильно и то что после последней команды, программа начинает работу сначала.
Внимание вопрос: Какого чёрта? (Почему происходит то, что происходит). Программа должна сработать один раз... а не тучу.
Вопрос2: Что сделать чтобы оно работало "правильно"?
PS: Раньше вполне неплохо работал на Pascal-е и Delphi, но с тех пор уже немало воды утекло. Резкий переход на ASM пока что сносит все понятия о понимании. Заранее спасибо за помощь...