cseg segment
org 100h
assume cs:cseg,ds:dseg,ss:sseg
start:
mov ax,dseg ; установить регистр DS таким
mov ds,ax ; образом, чтобы он указывал
; на сегмент данных
mov ax,0600h
mov bh,07
mov cx,0000
mov dx,184Fh
int 10h
mov ah,9 ; функция DOS вывода строки
mov dx,OFFSET Message ; ссылка на сообщение "A B C D F"
int 21h ; вывести "A B C D F" на экран
BEGIN:
; ___
; Расчет функции F = A+C*B(+)D
mov ah, B ; копирование 'B' в ah
xor ah, D ; исключающее или
mov al, A ; копирование 'A' в al
or al, C ; логическое сложение
not al ; инверсия
and ah, al ; логическое умножение
mov F, ah ; перенос результата в F
jmp FUNC ; Переход на метку FUNC для вывода
; строчки таблицы
NEXT:
add D, 1 ;увеличение D на 1
cmp D, 2 ;если D не равно 2 ,то
jne BEGIN ;переход на метку BEGIN
mov D, 0 ;обнуление D
add C, 1 ;увеличение C на 1
cmp C, 2 ;если C не равно 2 ,то
jne BEGIN ;переход на метку BEGIN
mov C, 0 ;обнуление C
add B, 1 ;увеличение B на 1
cmp B, 2 ;если B не равно 2 ,то
jne BEGIN ;переход на метку BEGIN
mov B, 0 ;обнуление B
add A, 1 ;увеличение A на 1
cmp A, 2 ;если A не равно 2 ,то
jne BEGIN ;переход на метку BEGIN
ENDLAB:
mov ah,4ch ; функция DOS для
int 21h ; завершения программы
FUNC:
; Функции ДОС для вывода символов
; Выводим двоичные значения A B C D, а также F
mov ah,2 ; загрузка номера функции DOS для вывода символа на экран
mov dl, 48 ; код выводимого символа 48=0
add dl,A ; выводим на экран
int 21h ; значение A
mov ah,2
mov dl, 32 ; код выводимого символа 48=пробел
int 21h
mov ah,2
mov dl, 48
add dl,B
int 21h
mov ah,2
mov dl, 32
int 21h
mov ah,2
mov dl, 48
add dl,C
int 21h
mov ah,2
mov dl, 32
int 21h
mov ah,2
mov dl, 48
add dl, D
int 21h
mov ah,2
mov dl, 32
int 21h
mov ah,2
mov dl, 48
add dl, F
int 21h
mov ah,2
mov dl, 32
int 21h
mov ah,2
mov dl, 13
int 21h
mov ah,2
mov dl, 10
int 21h
jmp NEXT ;переход на метку NEXT
cseg
ends
dseg
segment
A DB 0
B DB 0
C DB 0
D DB 0
F DB 0
Message DB 'A B C D F',13,10,'$'
dseg
ends
sseg
segment stack 'stack'
db 100 dup (0)
sseg
ends
end
start
Примечания:
Ниже приведины
команды использовались в программе:
sub – двоичное вычитание. Вычитается
из первого операнда содержимое второго операнда
Мнемоника: sub
<операнд
1>,<операнд 2>
call – вызов процедуры. Передает управление
процедуре адрес которой задан операндом, после завершения процедуры, выполнение
продолжается командой следующей за командой call
Мнемоника: call
<имя
процедуры>
ret – возврат к процедуре
shr – сдвинуть логически
вправо
xor – исключающее ИЛИ
Мнемоника: xor
<операнд 1>,<операнд 2>
lea – загрузить ЕА
Мнемоника: lea
reg,<операнд>
push – включить в stack
Мнемоника: push
<операнд>
pop – извлечь из stack
Мнемоника: pop
<операнд>
mov – переслать
Мнемоника: mov
<приемник>,<источник>
inc – увеличение на 1
Мнемоника: inc
<операнд>
dec – уменьшение на 1
Мнемоника: dec
<операнд>
stosb – пересылает соединения
регистра al или ax на
который указывает регистр di
loop – команда организации цикла со счетчиком,
также короткие переходы (127б) команда уменьшает значение счетчика cx, без изменения
каких-либо флагов, если соединение cx >0, то осуществляется
переход на заданную метку, в противном случае цикл завершается.
Мнемоника: loop <метка>
.CODE – открывает сегмент
кода
.DATA -- открывает сегмент
данных
.STACK N
– определяет
сегмент stack(а); дерективы закрытия
сегментов в этом случае не используются; N – показывает размер stack(a) в байтах
Примечание: при использовании
таких деректив регистр ds инициализируется следующим образом: mov
ax,@data
mov
ds,ax
assume в этом случае не
используется