.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 ; Окончание программы