В любом текстовом редакторе создадим текстовый asm-файл программы (вполне подойдет для этой цели встроенный редактор Norton Commander, вызываемый по клавише F4).
1) Определим сегмент стека.
_STACK SEGMENT PARA STACK 'STACK' ; сегмент стека
DB 32 DUP ('ST') ; стек размером 64 байта (32 повторения 2-х
; символов ST по байту каждый)
_STACK ENDS ; закроем описание сегмента стека _STACK
2) Определим сегмент данных. В сегменте данных должны содержаться все данные, используемые в программе.
_DATA SEGMENT ; сегмент данных
MASS DB 10 DUP (9) ; массив, заполненный 10 константами 9
_DATA ENDS ; закроем описание сегмента данных _DATA
3) Определим сегмент кода. В сегменте кода содержатся сами команды программы.
;запишем описание сегмента кода _CODE
_CODE SEGMENT PUBLIC 'CODE' ; сегмент кода
ASSUME SS:_STACK, CS:_CODE, DS:_DATA ; ассоциируем имена
;сегментных регистров с сегментами нашей программы
OUR_PROG PROC FAR ; описываем нашу программу как процедуру
; OUR_PROG
;помещаем в стек такие начальные значения, чтобы программа
; могла по завершению возвратить управление вызвавшей ее
; программе (например ОС)
PUSH DS ; поместить в регистр номер блока адреса возврата
MOV AX,0 ; обнулить регистр AX
PUSH AX ; поместить в стек нулевое смещение адреса возврата
; инициализируем регистр сегмента данных
MOV AX,_DATA ; загрузка в DS указателя сегмента данных
MOV DS,AX ; через регистр AX
MOV CX,10 ; регистр CX служит счетчиком цикла для команды LOOP
; загрузим в регистр BX смещение в сегменте данных, указывающее
; на первый элемент массива MASS
MOV BX,OFFSET MASS ; загрузка указателей массива MASS в BX
MOV AL,0 ; обнулим регистр AL
; здесь начало цикла:
LP: MOV [BX],AL ; обнуление элемента массива, хранимого по
; указанному адресу, хранимому в регистре BX
INC BX ; увеличение указателя массива на 1
LOOP LP ; команда цикла
RET ; команда возврата из процедуры, она извлекает
; данные, которые мы положили в стек в начале программы
OUR_PROG ENDP ; закрываем описание процедуры OUR_PROG
_CODE ENDS ; закрываем описание сегмента кода _CODE