Turbo Assembler: Пример 4
; Программа cоздает двумерный массив --
; таблицу умножения M x N
; M x N < 256
include io.asm ; описывает различные процедуры ввода/вывода на экран
; в частности outint
.model SMALL
.stack 256
.data
; СЕГМЕНТ данных
M dw (?)
N dw (?)
t dw 256 dup (?)
invit db "Введите координаты M и N $"
.code
; СЕГМЕНТ кода
Entry:
; Стандартное начало
mov AX,@data
mov DS,AX
;------------------------------------------------------------------------
lea DX, invit ; Процедура outstr печатает текст
outstr ; начало которого указано в DX
inint M ; считываем размеры таблицы
inint N ;
; НАЧАЛО ЦИКЛА В ЦИКЛЕ
; Регистр CX содержит переменную цикла
; как первого так и второго
; перед тем как начать вложенный цикл
; мы запоминаем счетчик внешнего цикла в стеке push CX
; а потом восстанавливаем его pop CX
; по команде loop он уменьшается на единицу пока не дойдёт до нуля
; Когда CX=0, цикл заканчивается
; Обнуляем
xor DI,DI ; DI - переменная 1, её обнуляем перед
; первым циклом
; SI - переменная 2, её будем обнулять каждый раз
; перед началом внутреннего цикла
xor BX,BX ; BX - смещение в массиве t
; каждый раз оно увеличивается на 2
; так как элемент массива t есть слово = 2 байта
; ЦИКЛ 1
mov CX,N ; инициализируем переменную внешнего цикла
C1: inc DI ; DI++
push CX ; запомним переменную внешнего цикла в СТЕКЕ
xor SI,SI ; обнулим переменную 2
; ЦИКЛ 2
mov CX,M ; инициализируем переменную внутреннего цикла
C2: inc SI ; SI++
mov AX,DI ; \ В результате этих трех операций в t[BX]
mul SI ; | помещается произведение SI на DI
mov t[BX],AX ; /
outint t[BX] ; вывод произведения SI x DI
add BX,2 ; переход к следующему слову массива t
outch 09h ; вывод на экран символа TAB чей ASCii код = 9
loop C2 ; приводит к смещению курсора в ближайшую справа
; кратную 8 позицию
; КОНЕЦ ЦИКЛА 2
pop CX
newline
loop C1
; КОНЕЦ ЦИКЛА 1
; КОНЕЦ ЦИКЛА В ЦИКЛЕ
; задержка до нажатия клааиши
mov AH, 08h
int 21h
;------------------------------------------------------------------------
; Стандартный конец
mov AH,4ch
int 21h
end Entry