Другие языки программирования и технологии
Прокомментируйте плиз простейшую программу на ассемблере.
Эта прога выводит текущий день недели. Не обязательно комментировать каждую строку, главное опишите фрагмент программы, заключенный между горизонтальными чертами. Зачем там обнулять ah вычитанием из него его самого и зачем умножать на 2 ax. .model small .stack 100h .data td db 'vspovtsrchpysu' otw db '**','$' .code start: mov ax,@data mov ds,ax mov ah,02ah int 21h ____________ sub ah,ah mov bx,2 mul bx mov si,ax mov di,0 mov cx,bx r: mov al,td[si] mov otw[di],al inc di inc si loop r ____________ mov ah,9 mov dx,offset otw int 21h mov ah,0 int 16h mov ax,4c00h int 21h end start
sub ah,ah; обнуление ah, так как этот регистр задействован в последующем умножении, а после возврата из прерывания в нём записан код вызванной функции 2Аh. Намного чаще для обнуления используется команда xor ah,ah. Обнуление не нужно было бы делать, если дальше умножать не на 16-разрядное, а на 8-разрядное число - ah обнулился бы автоматически.
mov bx,2; Умножение на два. Так как функция 2Аh возвращает номер дня недели ( 0 - воскресенье, 1 - понедельник и т. д.) , а для вывода на экран используются два символа, поэтому для получения смещения на начало соответствующего двухсимвольного обозначения умножается на 2.
mul bx; собственно умножение. Обычно умножение на 2 делают сдвигом влево на 1 разряд.
mov si,ax; смещение на начало нужного двухсимвольного обозначения пересылается в индексный регистр для последующей косвенной адресации.
mov di,0; начальное смещение на результирующую строку.
mov cx,bx; загрузка счётчика символов для цикла пересылки результата. В bx (см. выше) ранее было загружено значение 2.
r: ; метка начала цикла пересылки символов результата
mov al,td[si]; загрузка очередного символа результата в аl из текущего смещения в si
mov otw[di],al; пересылка очередного символа в результирующую строку по смещению в di
inc di; переход на следующую позицию результата
inc si; переход к следующему символу исходной строки обозначений дней недели
loop r; собственно цикл. Уменьшение сх на 1 и если сх не равно 0, то переход на начало цикла. Вообще-то для пересылок строк есть команда rep movsb
Автор программы применил нестандартные подходы при написании, свойственные начинающим. У меня этот фрагмент выглядел бы так:
xor ah,ah
shl ax,1
mov si,ax
mov ax,word ptr td[si]
mov word ptr otw,ax
без всяких циклов.
mov bx,2; Умножение на два. Так как функция 2Аh возвращает номер дня недели ( 0 - воскресенье, 1 - понедельник и т. д.) , а для вывода на экран используются два символа, поэтому для получения смещения на начало соответствующего двухсимвольного обозначения умножается на 2.
mul bx; собственно умножение. Обычно умножение на 2 делают сдвигом влево на 1 разряд.
mov si,ax; смещение на начало нужного двухсимвольного обозначения пересылается в индексный регистр для последующей косвенной адресации.
mov di,0; начальное смещение на результирующую строку.
mov cx,bx; загрузка счётчика символов для цикла пересылки результата. В bx (см. выше) ранее было загружено значение 2.
r: ; метка начала цикла пересылки символов результата
mov al,td[si]; загрузка очередного символа результата в аl из текущего смещения в si
mov otw[di],al; пересылка очередного символа в результирующую строку по смещению в di
inc di; переход на следующую позицию результата
inc si; переход к следующему символу исходной строки обозначений дней недели
loop r; собственно цикл. Уменьшение сх на 1 и если сх не равно 0, то переход на начало цикла. Вообще-то для пересылок строк есть команда rep movsb
Автор программы применил нестандартные подходы при написании, свойственные начинающим. У меня этот фрагмент выглядел бы так:
xor ah,ah
shl ax,1
mov si,ax
mov ax,word ptr td[si]
mov word ptr otw,ax
без всяких циклов.
Похожие вопросы
- помогите написать программы в ассемблере
- Нужна помощь с программой на ассемблере - комментирование каждой строки
- Приведите пожалуйста пример программы на ассемблере, использующая API функцию GlobalMemoryStatus. Заранее спасибо.
- Помогите написать программу на ассемблере, завтра экзамен а я в нём совсем не шарю.
- Нужно составить программу на ассемблере
- Помогите написать небольшую программу на ассемблере (TASM). Подробности внутри.
- программа на ассемблере, не пойму в чем ошибка и как исправить
- Помогите с программой на Ассемблере
- Простейшая задачка на Ассемблере
- Нужно написать программа на ассемблере для функции СигнумХ . Как правильно это сделать?