Написать комментарии для программы, пожалуйста) - 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
Объяснение кода листинга программы
- Код написан на ассемблере для процессора i80286.
- Размер стека 256 байт.
- Модель памяти - small.
- Сегмент данных начинается с адреса 100h.
- Переменная outStr содержит строку '0000$'.
- Процедура translByte преобразует один байт в шестнадцатеричную систему счисления.
- Процедура translWord преобразует два байта в шестнадцатеричную систему счисления.
- Начало программы помечено меткой start.
- Программа инициализирует сегментный регистр данных и сегментный регистр стека.
- Затем программа вызывает процедуру translWord для преобразования двух байтов в шестнадцатеричную систему счисления.
- Результат выводится на экран с помощью функции int 21h.
- Программа завершается с кодом 4c00h.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д