Переведите в двоичную систему счисления число 57 - Assembler

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

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

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

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

textual
Листинг программы
LOCALS
 
.model small
 
.stack 100h
 
.data
        CrLf    db      0Dh, 0Ah, '$'
 
.code
 
main    proc
        mov     ax,     @data
        mov     ds,     ax
 
        mov     ax,     57
        call    ShowBin
 
        mov     ax,     4C00h
        int     21h
main    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
 
end     main

Объяснение кода листинга программы

  1. LOCALS - сегменты данных и кода, а также стек, инициализируются перед выполнением программы.
  2. .model small - указывает компилятору, что программа написана для 16-битного процессора и использует небольшой сегментный режим.
  3. .stack 100h - устанавливает размер стека в 100 байтов.
  4. .data - сегмент данных, в котором хранятся константы и переменные программы.
  5. CrLf db 0Dh, 0Ah, '$' - определяет строку, которая выводится на экран после каждого выводимого числа.
  6. main proc - метка процедуры, которая является точкой входа в программу.
  7. mov ax, @data - перемещает адрес сегмента данных в регистр AX.
  8. mov ds, ax - устанавливает сегмент данных равным сегменту, указанному в регистре AX.
  9. mov ax, 57 - перемещает число 57 в регистр AX.
  10. call ShowBin - вызывает процедуру ShowBin, передавая ей в качестве аргумента число из регистра AX.
  11. mov ax, 4C00h - перемещает в регистр AX число, которое является кодом окончания работы программы.
  12. int 21h - вызывает функцию окончания работы программы.
  13. ShowBin proc - метка процедуры, которая выводит число в двоичной системе счисления.
  14. push ax - откладывает в стек значение регистра AX.
  15. push bx - откладывает в стек значение регистра BX.
  16. push cx - откладывает в стек значение регистра CX.
  17. mov bx, ax - копирует значение регистра AX в регистр BX.
  18. mov cx, 16 - устанавливает значение переменной CX равным 16.
  19. @@For: - метка цикла, который выполняется 16 раз.
  20. mov ax, '0' - перемещает в регистр AX число, которое является кодом символа '0'.
  21. shl bx, 1 - сдвигает значение регистра BX вправо на один бит.
  22. adc al, ah - складывает значение регистра AX с значением выделенного бита, сохраняя результат в регистре AX.
  23. int 29h - выводит на экран символ, соответствующий числу в регистре AX.
  24. loop @@For - продолжает выполнение цикла до тех пор, пока не будет выполнено условие остановки.
  25. pop cx - восстанавливает из стека значение переменной CX.
  26. pop bx - восстанавливает из стека значение регистра BX.
  27. pop ax - восстанавливает из стека значение регистра AX.
  28. ret - завершает выполнение процедуры.
  29. end main - указывает точку окончания программы.

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

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