;в сегменте 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 — точка входа)