понедельник, 9 марта 2009 г.

ASCII table in asm

Программа рисует таблицу ASCII. Для компиляции используется flat assembler. Таблица составляется с помощью макросов на этапе компиляции. Во время выполнения таблица просто копируется в видеопамять.

org 100h

        mov     ax, 3
        int     10h         ; установка видеорежима

        push    0b800h
        pop     es          ; es = сегмент видеопамяти

        mov     si, table   ; si = таблица, откуда читать данные
        mov     di, 0       ; di = куда писать

        cld                 ; прямое направление для строковых операций
        mov     cx, 18*80   ; 18 строк по 80 символов
        mov     ah, 0Fh     ; атрибут

next_char:
        lodsb               ; считываем символ
        stosw               ; записываем в видеопамять вместе с атрибутом
        loop    next_char

        mov     ah, 0       ; ждем клавишу
        int     16h
        ret                 ; выходим

; символы, используемые для построения таблицы:
VERT_LINE  = 0b3h
HORIZ_LINE = 0c4h
CROSS      = 0c5h

table:

; шапка таблицы:
db 3 dup(' ')
db VERT_LINE, " 0 1 2 3 4 5 6 7 "
db VERT_LINE, " 8 9 A B C D E F "
FIIL_LEN = 80 - ($-table)    ; FIIL_LEN = сколько пробелов надо добавить
db FIIL_LEN dup (' ')        ; дополняем строку да 80 символов пробелами

db  3 dup (HORIZ_LINE), CROSS
db 17 dup (HORIZ_LINE), CROSS
db 17 dup (HORIZ_LINE)
db FIIL_LEN dup (' ')

; содержимое таблицы:
y=0             ; y = строка
c=0             ; c = код символа
while y<16
   ; цифра слева от таблицы
   if y<9
      db ' ', y+'0', ' '  ; цифры 0, 1, ..., 9
   else
      db ' ', y+'0'+7,' ' ; шестнадцатиричные A, B, C, ..., F
   end if

   ; две группы по 8 символов, разделенные вертикальной чертой
   repeat 2
      db VERT_LINE, ' '
      repeat 8
         db c, ' '
         c=c+1
      end repeat
   end repeat
   db FIIL_LEN dup (' ')   ; дополняем строку да 80 символов пробелами
   y=y+1
end while

Комментариев нет:

Отправить комментарий