1. Получи 30.000 рублей. Для получения денег необходимо принять участие в конкурсе авторов codeby. С условиями и призами можно ознакомиться на этой странице ...

    Внимание! Регистрация авторов на конкурс закрыта.

    Скрыть объявление
  2. Требуются разработчики и тестеры для проекта codebyOS. Требования для участия в проекте: Знание принципов работы ОС на базе Linux; Знание Bash; Крайне желательное знание CPP, Python, Lua; Навыки системного администрирования. Подробнее ...

    Скрыть объявление

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

Тема в разделе "Вопросы новичков и не только", создана пользователем Ancient, 8 апр 2010.

  1. Ancient

    Ancient Гость

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

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

    Программа явно COM-типа (
    Код:
    .model tiny
    ), поэтому компилировал (на WinXP SP3) тупо:
    Код:
    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 Гость

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

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