Содержимое ячейки памяти = 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.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.083 из 5
Похожие ответы