Переведите двоичное число 11011011 в восьмеричную и шестнадцатеричную систему счисления - Assembler

Узнай цену своей работы

Формулировка задачи:

Нужно написать программы для 16 разрядного ассемблера: Переведите двоичное число 11011011 в восьмеричную и шестнадцатеричную систему счисления.

Решение задачи: «Переведите двоичное число 11011011 в восьмеричную и шестнадцатеричную систему счисления»

textual
Листинг программы
.model small
 
.stack 100h
 
.data
        CrLf    db      0Dh, 0Ah, '$'
.code
 
main    proc
        mov     ax,     @data
        mov     ds,     ax
 
        mov     ax,     11011011b
        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
 
;выводит на экран в двоичной системе счисления содержимое регистра 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

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


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

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

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