Содержимое ячейки памяти = CA16. Какое там записано двоичное, восьмеричное, десятичное число - Assembler
Формулировка задачи:
Нужно написать программу для 16 разрядного ассемблера:
Содержимое ячейки памяти = CA16. Какое там записано двоичное, восьмеричное, десятичное число?
Решение задачи: «Содержимое ячейки памяти = CA16. Какое там записано двоичное, восьмеричное, десятичное число»
textual
Листинг программы
.model small .stack 100h .data CrLf db 0Dh, 0Ah, '$' .code main proc mov ax, @data mov ds, ax mov ax, 0CA16h call Show_UInt call NewLine call Show_Int call NewLine call ShowBin call NewLine call ShowOct mov ax, 4C00h int 21h main endp NewLine proc push ax push bx push cx push dx push di mov ah, 09h lea dx, [CrLf] int 21h pop di pop dx pop cx pop bx pop ax ret NewLine endp ; выводит знаковое 16-разрядное число из регистра AX на экран ; входные данные: ; ax - число для отображения Show_Int proc push ax push bx push cx push dx push di mov cx, 10 xor di, di ; di - кол. цифр в числе ; если число в ax отрицательное, то ;1) напечатать '-' ;2) сделать ax положительным or ax, ax jns @@ShowUInt push ax mov dx, '-' mov ah, 2 ; ah - функция вывода символа на экран int 21h pop ax neg ax @@ShowUInt: call Show_UInt pop di pop dx pop cx pop bx pop ax ret Show_Int endp ; выводит знаковое 16-разрядное число из регистра AX на экран ; входные данные: ; ax - число для отображения Show_UInt proc push ax push bx push cx push dx push di mov cx, 10 xor di, di ; di - кол. цифр в числе @@Conv: xor dx, dx div cx ; dl = num mod 10 add dl, '0' ; перевод в символьный формат inc di push dx ; складываем в стек or ax, ax jnz @@Conv ; выводим из стека на экран @@Show: pop dx ; dl = очередной выводимый символ mov ah, 2 ; ah - функция вывода символа на экран int 21h dec di ; повторяем пока di<>0 jnz @@Show pop di pop dx pop cx pop bx pop ax ret Show_UInt endp ;выводит на экран в двоичной системе счисления содержимое регистра AX ; входные данные: ; ax - число для отображения ShowBin proc push ax push bx push cx mov bx, ax ; из-за распределения регистров ; при выводе на экран с помощью int 29h, ; выводимое число будет находится в bx mov cx, 16 ; переменная цикла равна количеству бит в слове @@For: mov ax, '0' ; в регистрах al=код символа '0', ah=00h shl bx, 1 ; выделение бита adc al, ah ; сложение кода символа '0' со значением выделенного бита int 29h loop @@For pop cx pop bx pop ax ret ShowBin endp ;выводит на экран в 8 системе счисления содержимое регистра AX ; входные данные: ; ax - число для отображения ShowOct proc push ax push cx push dx ; Начинаем перевод числа AX в строку mov cl, ((16-1)/3)*3 ; 16-битный регистр, будем выводить по 3 бита (0..7) mov dx, ax ; Сохраняем число в DX @@Repeat: mov ax, dx ; Восстанавливаем число в AX shr ax, cl ; Сдвигаем на CL бит вправо (делим на 8*i) and al, 07h ; Получаем в AL цифру 0..7 (остаток от деления на 8) add al, '0' ; Получаем в AL символ цифры int 29h ; Выводим символ в AL на экран sub cl, 3 ; Уменьшаем CL на 3 для следующей цифры jnc @@Repeat ; Если знаковый CL >= 0, то повторяем pop dx pop cx pop ax ret ShowOct endp end main
Объяснение кода листинга программы
В коде используется ассемблерный язык. Содержимое ячейки памяти CA16h содержит число 16, поэтому в двоичной системе счисления это число будет выглядеть как 10001010. В восьмеричной системе счисления это число будет выглядеть как 22. В десятичной системе счисления это число будет равно 46. В коде нет прямой команды для вывода содержимого ячейки памяти CA16h, но можно вывести содержимое регистра AX, которое равно 4C00h, что в десятичной системе счисления равно 19660. Поэтому, если нужно вывести содержимое ячейки памяти CA16h в двоичной системе счисления, то нужно изменить команду mov ax, 0CA16h на mov ax, CA16h.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д