Вывод на экран таблицы Ascii (assembler)

Тема в разделе "Другие задачи", создана пользователем Ancient, 8 апр 2010.

  1. Ancient

    Ancient Гость

    Пример из отсканированной книги "Assembler, язык неограниченных возможностей" Зубков С.В, 1999 Издательство «ДМК Пресс».
    :(
    В учебнике есть замечательный пример использования функции DOS-а 09. Суть в том, что пример должен выводить ASCII-таблицу (256 символов), 16-ю строками по 16 символов+2 символа "переноса строки.
    Код (Text):
    ; 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
    Вообще, первоначально в 8-й строке
    Код (Text):
     mov         сx,256
    стояло
    Код (Text):
     mov         ex,256; вывести 256 символов

    но компилятор (TASM) решительно отказался читать подобное за и loop по описанию предназначен для работы с CX, поэтому произвёл замену EX на CX.

    Программа явно COM-типа (
    Код (Text):
    .model tiny
    ), поэтому компилировал (на WinXP SP3) тупо:
    Код (Text):
    tasm dosout1.asm
    tlink dosout1.obj
    Результатом стал файлик dosout1.com и предупреждение от tlink-а "Warning: No stack".

    Итоговая программа работает далеко не один раз, а в зависимости от кто бы его знал чего, от 5 до 36 раз (и более). Измерено с помощью вывода в файл dosout1 >dosout1.txt.
    Отладчик ничего конкретного не дал, только понимание что символы выводятся вроде как правильно и то что после последней команды, программа начинает работу сначала.

    Внимание вопрос: Какого чёрта? (Почему происходит то, что происходит). Программа должна сработать один раз... а не тучу.
    Вопрос2: Что сделать чтобы оно работало "правильно"? :)

    PS: Раньше вполне неплохо работал на Pascal-е и Delphi, но с тех пор уже немало воды утекло. Резкий переход на ASM пока что сносит все понятия о понимании. :) Заранее спасибо за помощь...
     
  2. Ancient

    Ancient Гость

    С другой стороны, Ваш пример при сборке выдал три предупреждения:
    Но работал вполне адекватно.
    А откуда тогда пример (работающий), раз совсем не знаете? :) Просто любопытно.
     
Загрузка...
Похожие Темы - Вывод на экран
  1. L1nuXXX01D
    Ответов:
    1
    Просмотров:
    1.450
  2. roma4717
    Ответов:
    3
    Просмотров:
    1.693
  3. cesta
    Ответов:
    3
    Просмотров:
    1.680
  4. KatyaVm22
    Ответов:
    3
    Просмотров:
    4.016
  5. Artur1987
    Ответов:
    6
    Просмотров:
    4.365

Поделиться этой страницей