1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
.286 ; Директива, позволяющая использовать непривилегированные инструкции процессора 80286 и инструкции арифметического сопроцессора 80287
.model small ; Определение памяти ближнего типа
.code ; Начало сегмента с кодом
org 100h ; Смещение адресации на 100h байт
begin:
JMP start ; Безусловный переход к метке start
trans:
PUSHA ; Сохранение содержимого регистров в стек
XOR cx,cx ; Обнуление регистра cx
isDiv:
XOR dx,dx ; Обнуление регистра dx
DIV bx ; Деление значений регистров ax на bx
PUSH dx ; Помещение значение регистра dx в стек
INC cx ; Увеличение значения регистра cx на единицу
OR ax,ax ; Попарное сложение всех битов операндов
JNZ isDiv ; Осуществление перехода, если значение регистра ax не равно 0
isOut:
POP ax ; Помещение значения вершины стека в регистр ax (при этом указатель стека уменьшается на единицу)
CMP al,9 ; Сравнение значения регистра al с числом 9
JLE noHex ; Переход к метке noHex, если al <= 9
ADD al,7 ; Прибавление числа 7 к регистру al
noHex:
ADD al,30h ; Прибавление числа 30h к регистру al
INT 29h ; Прерывание для вывода символа (Обычно, вызов функции 0Eh прерывания 10h)
LOOP isOut ; Вычитание из регистра cx единицы. Если значение регистра cx не равно 0, то выполнить переход на метку isOut
POPA ; Загрузка из стека значение всех регистров
ret ; Возврат к точке вызова
start:
INT 11h ; Запрос списка подключенного оборудования. Результат помещается в регистр ax
MOV bx,2 ; Помещение в регистр bx числа 2
CALL trans ; Вызов метки trans
MOV ax,10 ; Помещение в регистр ax числа 10
MOV dx,ax ; Помещение в регистр dx значение числа ax
MOV ax,200h ; Помещение в регистр ax значения 200h
INT 21h ; Вызов функции DOS
INT 12h ; Запрос размера физической памяти. Результат помещается в регистр ax
CALL trans ; Вызов метки trans
MOV ax,4C00h; Помещение в регистр ax значения 4C00h (функция DOS для завершения программы)
INT 21h ; Вызов функции DOS
END begin ; Окончание программы
|