Написать комментарии для программы, пожалуйста) - Assembler

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

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

.model tiny
.stack 100h
.data
outStr db '0000$'
.code
translByte proc
push ax
push ax
shr al,4
cmp al,9
ja greater10
mov byte ptr [bx],'0'
add [bx],al
jmp next4Bit
greater10:
mov byte ptr [bx],'A'
sub al,10
add [bx],al
next4Bit:
pop ax
and al,0Fh
cmp al,9
ja _greater10
mov byte ptr [bx+1],'0'
add [bx+1],al
jmp exitByteProc
_greater10:
mov byte ptr [bx+1],'A'
sub al,10
add [bx+1],al
exitByteProc:
pop ax
ret
translByte endp
translWord proc
push ax
push ax
shr ax,8
call translByte
pop ax
and ax,00FFh
add bx,2
call translByte
sub bx,2
pop ax
ret
translWord endp
start:
mov ax,@data
mov ds,ax
mov bx,OFFSET outStr
mov ax,60000
call translWord
mov ah,9
mov dx,OFFSET outStr
int 21h
mov ax,4c00h
int 21h
end start

Решение задачи: «Написать комментарии для программы, пожалуйста)»

textual
Листинг программы
.286                            ;разрешение команд для процессора i80286
.model small                    ;определение модели памяти small
.stack 100h                     ;определение размера стека 256 байт
.data                           ;начало описания сегмента данных
outStr db '0000$'               ;выделение переменной 5 байт
 
.code                           ;начало описания сегмента кода
 
translByte proc
        push ax                 ;сохранение регистра ax
        push ax
        shr al,4                ;сдвиг вправо на 4 бита
        cmp al,9                ;сравнение al с числом 9
        ja greater10            ;перейти, если больше
        mov byte ptr [bx],'0'   ;поместить символ '0' в текущую позицию строки
        add [bx],al             ;сложить код '0' в текущей позиции строки со значением в регистре al
        jmp next4Bit            ;перейти к обработке младших четырёх бит
greater10:
        mov byte ptr [bx],'A'   ;поместить символ 'A' в текущую позицию строки
        sub al,10               ;вычесть из регистра al число 10
        add [bx],al             ;сложить код 'A' в текущей позиции строки со значением в регистре al
next4Bit:
        pop ax                  ;восстановить значение ax из стека
        and al,0Fh              ;выделить в al младшие четыре бита
        cmp al,9                ;сравнение al с числом 9
        ja _greater10           ;перейти, если больше
        mov byte ptr [bx+1],'0' ;поместить символ '0' в текущую позицию строки
        add [bx+1],al           ;сложить код '0' в текущей позиции строки со значением в регистре al
        jmp exitByteProc        ;перейти к завершению процедуры
_greater10:
        mov byte ptr [bx+1],'A' ;поместить символ 'A' в следующую позицию строки
        sub al,10               ;вычесть из регистра al число 10
        add [bx+1],al           ;сложить код 'A' в следующей позиции строки со значением в регистре al
exitByteProc:
        pop ax                  ;восстановление содержимого регистра ax
        ret                     ;завершение процедуры
translByte endp
 
translWord proc
        push ax                 ;сохранение регистра ax
        push ax                 ;преобразуем старший байт слова
        shr ax,8                ;сдвиг вправо на 8
        call translByte         ;вызов процедуры преобразования байта
        pop ax                  ;преобразуем младший байт слова
        and ax,00FFh            ;выделение младшего байта из слова
        add bx,2                ;указатель на строку указывает на 3-й символ
        call translByte         ;вызов процедуры преобразования байта
        sub bx,2                ;восстановление исходного значения регистра bx
        pop ax                  ;восстановление исходного значения регистра ax
        ret                     ;завершение процедуры
translWord endp
 
start:
        mov ax,@data    ;инициализация сегментного регистра данных
        mov ds,ax
        mov bx,OFFSET outStr    ;формирование параметров процедуры
        mov ax,60000
        call translWord         ;вызов процедуры
        mov ah,9                ;вывод на экран полученной строки
        mov dx,OFFSET outStr
        int 21h
        mov ax,4c00h            ;завершение программы
        int 21h
end start

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

  1. Код написан на ассемблере для процессора i80286.
  2. Размер стека 256 байт.
  3. Модель памяти - small.
  4. Сегмент данных начинается с адреса 100h.
  5. Переменная outStr содержит строку '0000$'.
  6. Процедура translByte преобразует один байт в шестнадцатеричную систему счисления.
  7. Процедура translWord преобразует два байта в шестнадцатеричную систему счисления.
  8. Начало программы помечено меткой start.
  9. Программа инициализирует сегментный регистр данных и сегментный регистр стека.
  10. Затем программа вызывает процедуру translWord для преобразования двух байтов в шестнадцатеричную систему счисления.
  11. Результат выводится на экран с помощью функции int 21h.
  12. Программа завершается с кодом 4c00h.

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


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

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

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