Загрузка данных


;в сегменте indat находятся переменные X, Y и Z
indat segment                ;начало сегмента indat
dw ?                         ;пустая переменная, нужна для bochs
X dw 05h                     ;переменная X
Y dw 0Ah                     ;переменная Y
Z dw 02h                     ;переменная Z
indat ends                   ;конец сегмента indat

;в сегменте outdat находится переменная R, в которую запишется результат
outdat segment               ;начало сегмента outdat
R dw ?                       ;R не инициализирована, в нее запишется результат
outdat ends                  ;конец сегмента outdat

code segment                 ;начало сегмента code

;сегментные регистры будут указывать на соответствующие сегменты
assume cs:code, ds:indat, es:outdat

begin: mov dx, indat         ;точка входа в программу, инициализация
                             ;сегментного регистра ds
mov ds, dx                   ;инициализация сегментного регистра ds

mov dx, outdat               ;инициализация сегментного
mov es, dx                   ;регистра es

mov ax, X                    ;в регистр AX (аккумулятор) читается переменная X
add ax, Y                    ;к X прибавляется Y: AX = X + Y
sub ax, Z                    ;AX = X + Y - Z
shl ax, 1                    ;сдвиг AX влево на 1 бит: AX = (X + Y - Z) * 2
or ax, 0F0Fh                 ;AX = (X + Y - Z) * 2 OR 0F0Fh
mov R, ax                    ;запись результата в переменную R

mov ax, 4c00h                ;запись в AX номера функции завершения программы
int 21h                      ;вызов прерывания DOS для завершения программы

code ends                     ;конец сегмента code
end begin                     ;конец программы (команда с меткой begin — точка входа)