Написать комментарии к 2-ум программам - Assembler
Формулировка задачи:
Не могу разобраться с программами, писал не сам, очень не хватает комментариев, буду очень благодарен за их написание, заранее спасибо
Первая программа, удаляет лишние пробелы со строки:
Вторая программа выводит дату из CMOS:
Листинг программы
- ASSUMe CS:CODE,DS:CODE,ES:CODE
- CODE segment
- org 100h
- start:
- mov di,offset startstring
- mov cx,0
- foreverloop:
- mov ah,10h
- int 16h
- mov dl,al
- mov ah,2
- int 21h
- mov [di],dl
- inc di
- cmp dl,'.'
- je outlrfwrwr
- inc cx
- jmp foreverloop
- outlrfwrwr:
- mov si,offset startstring
- mov di,offset endstring
- loopwerwtwty:
- mov ax,[si]
- cmp ax,2020h
- je nosigse
- mov [di],al
- inc di
- nosigse:inc si
- loop loopwerwtwty
- inc di
- push ax
- mov al,10
- mov [di],al
- mov al,13
- mov [di],al
- mov al,'$'
- mov [di],al
- pop ax
- mov ah,9
- mov dx,offset endstring
- int 21h
- mov ah,10h
- int 16h
- int 20h
- startstring db 80 dup (?)
- endstring db 80 dup (?)
- CODE ends
- end start
Листинг программы
- .186
- .model small
- .stack 100h
- .data
- Messd db "Current date: ","$"
- dt_ db ?,?,'-',?,?,'-',?,?,?,?, 0Ah, 0Dh, "$"
- .code
- start:
- mov ax, @data
- mov ds, ax
- mov ax,3
- int 10h
- xor ax, ax
- xor dx,dx
- mov dx, offset Messd
- call showmess
- xor dx,dx
- call getdate
- mov ah, 4Ch
- int 21h
- showmess proc
- mov ah,09h
- int 21h
- ret
- showmess endp
- toasci proc
- ror ax, 4
- shr ah, 4
- or ax,'00'
- ret
- toasci endp
- getdate proc
- xor ax, ax
- mov ah, 04h
- int 1Ah
- xor ah, ah
- mov al, dl
- call toasci
- mov word ptr dt_, ax
- xor ah, ah
- mov al, dh
- call toasci
- mov word ptr dt_+3, ax
- xor ah, ah
- mov al,ch
- call toasci
- mov word ptr dt_+6, ax
- xor ah, ah
- mov al, cl
- call toasci
- mov word ptr dt_+8, ax
- mov dx, offset dt_
- call showmess
- ret
- getdate endp
- end start
Решение задачи: «Написать комментарии к 2-ум программам»
textual
Листинг программы
- .model small ;модель памяти
- .386 ;процессор, для которого написана программа
- .data ;сегмент данных
- db 'BeginOfData$'
- Messd db 'Current date: $';строка-подсказка
- dt_ db ?,?,'-',?,?,'-',?,?,?,?,0Ah,0Dh,'$';строка с датой
- db 'EndOfData$'
- .stack ;сегмент стека
- db 256 dup(?) ;выделение памяти под стек
- .code ;сегмент кода
- start: ;метка, с которой должна начаться выполняться программа
- mov ax,@data ;используем промежуточный регистр ax
- mov ds,ax ;для инициализации сегмента данных
- ;т.к. запись напрямую в сегментный регистр запрещена
- mov ax,00h ;выбор видеорежима
- mov al,03h ;текстовый видеорежим 80*25
- int 10h ;прерывание видеосервиса биос,
- ;чтобы функция выполнилась
- xor ax,ax ;обнуление регистра ax
- xor dx,dx ;обнуление регистра dx
- mov ah,09h ;функция вывода сообщения на консоль
- mov dx,offset Messd ;сообщение о текущей дате
- int 21h ;прерывание, чтобы функция выполнилась
- xor dx,dx ;обнуление регистра dx
- call getdate
- mov ah,4Ch ;функция выхода из программы
- mov al,00h ;код возврата
- int 21h ;прерывание, чтобы функция выполнилась
- getdate proc ;начало процедуры getdate
- mov ah,04h ;функция чтения даты из "постоянных" (CMOS) часов
- ;реального времени
- int 1Ah ;прерывание, чтобы функция выполнилась
- xor ah,ah ;обнуление регистра ah
- mov al,dl ;день в коде BCD
- call toasci ;вызов процедуры преобразования BCD числа (день недели),
- ;который находится в регистре ax, в ASCII-формат
- mov word ptr dt_,ax;запись дня недели в память
- xor ah,ah ;обнуление регистра ah
- mov al,dh ;месяц в коде BCD
- call toasci ;вызов процедуры преобразования BCD числа (месяц),
- ;который находится в регистре ax, в ASCII-формат
- mov word ptr dt_+3,ax;запись месяца в память
- xor ah,ah ;обнуление регистра ah
- mov al,ch ;столетие в коде BCD
- call toasci ;вызов процедуры преобразования BCD числа (столетие),
- ;который находится в регистре ax, в ASCII-формат
- mov word ptr dt_+6,ax;запись столетия в память
- xor ah,ah ;обнуление регистра ah
- mov al,cl ;год в коде BCD
- call toasci ;вызов процедуры преобразования BCD числа (год),
- ;который находится в регистре ax, в ASCII-формат
- mov word ptr dt_+8,ax;запись года в память
- mov ah,09h ;функция вывода строки на консоль
- mov dx,offset dt_;строка с текущей датой
- int 21h ;прерывание, чтобы функция выполнилась
- ret ;возврат из процедуры
- getdate endp ;конец процедуры getdate
- toasci proc ;начало процедуры toasci
- ;преобразовываем BCD число из упакованного формата
- ;в неупакованный формат
- ;к тому же меняем местами байты, т.к. после
- ;выхода из процедуры все число (слово) будет писаться в память
- ;(обратный порядок байт)
- ror ax,4 ;циклически сдвигаем регистр ax на четыре бита вправо
- shr ah,4 ;сдвигаем регистр ah на четыре бита
- or ax,'00' ;конвертируем цифры BCD числа в ASCII-коды
- ret ;возврат из процедуры
- toasci endp ;конец процедуры
- end start ;указывается метка, с которой должна
- ;начаться выполняться программа
Объяснение кода листинга программы
Комментарии к коду:
- Переменная
Messd
содержит строку-подсказкуCurrent date: $
. - Переменная
dt_
содержит строку с датой в форматеdd-mm-yy hh:mm:ss
. - Процедура
getdate
считывает дату изпостоянных
(CMOS) часов реального времени и выводит её на консоль в форматеdd-mm-yy
. - Процедура
toasci
преобразует BCD число в ASCII-формат, при этом меняя местами байты. - В конце кода указана метка
end start
, с которой должна начаться выполняться программа.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д