Учебник по ассемблеру (ASM)
 

Ассемблер в примерах - Вывод данных из CMOS

Вопрос:
Требуется вывести данные из CMOS с пояснениями на асме.

Ответ:
Держите досовскую программу под TASM формата COM (линковать с ключом /t).
	.model	tiny
	.data
d	dw	d_0,d_1,d_2,d_3,d_4,d_5,d_6
d_0	db	'Воскресенье$'
d_1	db	'Понедельник$'
d_2	db	'Вторник$'
d_3	db	'Среда$' 
d_4	db	'Четверг$'
d_5	db	'Пятница$'
d_6	db	'Суббота$'
m	dw	m_0,m_1,m_2,m_3,m_4,m_5,m_6,m_7,m_8,m_9,m_10,m_11
m_0	db	'Января$'
m_1	db	'Февраля$'
m_2	db	'Марта$'
m_3	db	'Апреля$'
m_4	db	'Мая$'
m_5	db	'Июня$'
m_6	db	'Июля$'
m_7	db	'Августа$'
m_8	db	'Сентября$'
m_9	db	'Октября$'
m_10	db	'Ноября$'
m_11	db	'Декабря$'
sd	dw	sd_0,sd_1,sd_2,sd_3,sd_4,sd_5,sd_6,sd_7,sd_8,sd_9,sd_10
sd_0	db	'Сброс при помощи Ctrl+Alt+Del$'
sd_1	db	'Сброс после определения объема CMOS  пямяти$'
sd_2	db	'Сброс после тестирования CMOS памяти$'
sd_3	db	'Сброс после ошибки четности в ОП$'
sd_4	db	'Сброс с запросом перезагрузки$'
sd_5	db	'Перезапуск контроллера прерываний$'
sd_6	db	'Сброс после проверки защищенного режима$'
sd_7	db	'Сброс после проверки защищенного режима$'
sd_8	db	'Сброс после проверки защищенного режима$'
sd_9	db	'Сброс после блочного копирования$'
sd_10	db	'Переход по адресу BIOS 0000h:0467h$'
ngmd	dw	ngmd_0,ngmd_1,ngmd_2,ngmd_3,ngmd_4
ngmd_0	db	'не установлен$'
ngmd_1	db	'360 Кбайт$'
ngmd_2	db	'1,2 Мбайт$'
ngmd_3	db	'720 Кбайт$'
ngmd_4	db	'1,44 Мбайт$'
vid	dw	vid_0,vid_1,vid_2,vid_3
vid_0	db	'EGA или VGA$'
vid_1	db	'CGA в режиме 40x25$'
vid_2	db	'CGA в режиме 80x25$'
vid_3	db	'монохромный видеоадаптер$'
yn	dw	yn_0,yn_1
yn_0	db	'Да$'
yn_1	db	'Нет$'

mess_1	db	'Сведения CMOS'
	db	0dh,0ah,0ah,'Часы реального времени (00h-0Dh):'
	db	0dh,0ah,'Время: $'
mess_2	db	0dh,0ah,'Сигнал в: $'
mess_3	db	0dh,0ah,'Дата: $'
mess_4	db	0dh,0ah,0ah,'Байт диагностики (0Eh):'
	db	0dh,0ah,'Правильная установка RTC: $'
mess_5	db	0dh,0ah,'Жесткий диск есть: $'
mess_6	db	0dh,0ah,'Правильный размер ОП: $'
mess_7	db	0dh,0ah,'Конфигурация правильная: $'
mess_8	db	0dh,0ah,'Контрольная сумма CMOS правильная: $'
mess_9	db	0dh,0ah,'Батарея CMOS исправна: $'
mess_10	db	0dh,0ah,0ah,'Статус выключения (ShutDown 0Fh):',0dh,0ah,'$'
mess_11	db	0dh,0ah,0ah,'Тип накопителей НГМД (10h):'
	db	0dh,0ah,'Первый НГМД: $'
mess_12	db	0dh,0ah,'Второй НГМД: $'
mess_13	db	'Тип накопителей НМД (12h):'
	db	0dh,0ah,'Первый НМД: $'
mess_14	db	0dh,0ah,'Второй НМД: $'
mess_15	db	0dh,0ah,'Байт оборудования (14h):'
	db	0dh,0ah,'Установлен НГМД: $'
mess_16	db	0dh,0ah,'Математический сопроцессор: $'
mess_17	db	0dh,0ah,'Видеоадаптер: $'
mess_18	db	0dh,0ah,'Количество НГМД: $'
mess_19	db	0dh,0ah,0ah,'Основная память (15h-16h): $'
mess_20	db	' Кбайт'
	db	0dh,0ah,0ah,'Расширенная память (17h-18h): $'
mess_21	db	' Кбайт'
	db	0dh,0ah,0ah,'Тип первого расширенного диска: (19h): $'
mess_22	db	0dh,0ah,'Тип второго расширенного диска: (1ah): $'
mess_23	db	0dh,0ah,0ah,'Контрольная сумма ячеек 10h-20h (2Eh-2Fh): $'
mess_24	db	0dh,0ah,0ah,'Расширенная память (30h-31h): $'
mess_25	db	'Кбайт'
	db	0dh,0ah,0ah,'Столетие (32h): $'
mess_26	db	0dh,0ah,0ah,'Дополнительная информация из CMOS памяти (33h):'
	db	0dh,0ah,'IBM 128K памяти установлен: $'
mess_27	db	0dh,0ah,'Используется утилита SETUP: $'

m_cont	db	0dh,0ah,0ah,0ah,0ah,'Нажмите на любую клавишу для продолжения$'
m_exit	db	0dh,0ah,0ah,0ah,'Нажмите на любую клавишу для выхода$'

cmos	db	64 dup (0)

	.186
	.code
	.startup

	lea	di, cmos
	mov	cx, 64
	mov	ah, 0
GetCMOS_loop:
	mov	al, ah
	out	70h, al
	in	al, 71h
	stosb
	inc	ah
	loop	GetCMOS_loop
 
	mov	ax, 3
	int	10h

;00h-0Dh часы реального времени
	call	PrTime

;0eh статус диагностики
	call	PrDiagn

;0fh статус выключения
	call	PrOff

;10h тип флоппи-дисководов
	call	PfFlop

;смена экранов
	lea	dx, m_cont
	mov	ah, 9
	int	21h

	mov	ah, 0		;подождем нажатие клавиши
	int	16h

	call	cls

;12h тип НМД
	call	PrHard
	
;14h оборудование
	call	PrEquip

;15h-18h память
	call	PrMem

;19h-1ah расширенные диски
	call	PrExtHD

;2Eh-2Fh контрольная сумма ячеек 10h-20h
	call	PrCRC

;30h-31h расширенная память
	call	PsExMem

;32h столетие
	call	PrCent

;33h дополнительная информация из CMOS памяти
	call	PrAdd

	lea	dx, m_exit
	mov	ah, 9
	int	21h

	mov	ah, 0
	int	16h

	.exit	0

;----------------------------------------------------
;очистка экрана
cls	proc
	mov	ax, 0600h
	mov	bh, 7
	xor	cx, cx
	mov	dx, 184fh
	int	10h
	ret
cls	endp

;00h-0Dh часы реального времени
PrTime	proc
	lea	dx, mess_1
	mov	ah, 9
	int	21h
	mov	al, cmos+4	;часы BCD 00-23
	call	PrBCD
	mov	al, ':'
	int	29h
	mov	al, cmos+2	;минуты BCD 00-59
	call	PrBCD
	mov	al, ':'
	int	29h
	mov	al, cmos	;секунды BCD 00-59
	call	PrBCD

	lea	dx, mess_2
	mov	ah, 9
	int	21h
	mov	al, cmos+5	;часы alarm BCD 00-23
	call	PrBCD
	mov	al, ':'
	int	29h
	mov	al, cmos+3	;минуты alarm BCD 00-59
	call	PrBCD
	mov	al, ':'
	int	29h
	mov	al, cmos+1	;секунды alarm BCD 00-59
	call	PrBCD

	lea	dx, mess_3
	mov	ah, 9
	int	21h
	mov	al, cmos+6	;день недели 01-07 Sunday=1
	call	ItoIndD
	mov	dx,d[bx]
	mov	ah, 9
	int	21h
	mov	al, ' '
	int	29h
	mov	al, cmos+7	;день месяца BCD 01-31
	call	PrBCD
	mov	al, ' '
	int	29h
	mov	al, cmos+8	;месяц BCD 01-12
	call	ItoIndD
	mov	dx,m[bx]
	mov	ah, 9
	int	21h
	mov	al, ' '
	int	29h
	mov	al, cmos+32h	;столетие
	call	PrBCD
	mov	al, cmos+9	;год BCD 00-99
	call	PrBCD
	ret
PrTime	endp

;0eh статус диагностики
PrDiagn	proc
	lea	dx, mess_4
	mov	cx, 0102h
	call	PrDiag
	lea	dx, mess_5
	mov	cx, 0103h
	call	PrDiagR
	lea	dx, mess_6
	mov	cx, 0104h
	call	PrDiag
	lea	dx, mess_7
	mov	cx, 0105h
	call	PrDiag
	lea	dx, mess_8
	mov	cx, 0106h
	call	PrDiag
	lea	dx, mess_9
	mov	cx, 0107h
	call	PrDiag
	ret
PrDiagn	endp

PrAddFl	proc
	mov	al, cmos+33h
	jmp	PrData
PrAddFl	endp

PrEqu	proc
	mov	al, cmos+14h
	jmp	PrData
PrEqu	endp

PrDiag	proc
	mov	al, cmos+0eh
PrData:	push	ax
	mov	ah, 9
	int	21h
	pop	ax
	call	BitsToI
PrYN:	mov	ah, 0
	shl	ax, 1
	mov	bx, ax
	mov	dx, yn[bx]
	mov	ah, 9
	int	21h
	ret
PrDiag	endp

PrAddFlR	proc
	mov	al, cmos+33h
	jmp	PrDataR
PrAddFlR	endp

PrEquR	proc
	mov	al, cmos+14h
	jmp	PrDataR
PrEquR	endp

PrDiagR	proc
	mov	al, cmos+0eh
PrDataR:push	ax
	mov	ah, 9
	int	21h
	pop	ax
	call	BitsToI
	dec	al
	neg	al
	jmp	PrYN
PrDiagR	endp

;0fh статус выключения
PrOff	proc
	lea	dx, mess_10
	mov	ah, 9
	int	21h
	xor	bx, bx
	mov	bl, cmos+0fh
	shl	bx, 1
	mov	dx,sd[bx]
	mov	ah, 9
	int	21h
	ret
PrOff	endp

;10h тип флоппи-дисководов
PfFlop	proc
	lea	dx, mess_11
	mov	ah, 9
	int	21h
	mov	al, cmos+10h
	mov	cx, 0f04h	;первый
	call	BitsToI
	shl	ax, 1
	mov	bx, ax
	mov	dx, ngmd[bx]
	mov	ah, 9
	int	21h

	lea	dx, mess_12
	mov	ah, 9
	int	21h
	mov	al, cmos+10h
	mov	cx, 0f00h	;второй
	call	BitsToI
	shl	ax, 1
	mov	bx, ax
	mov	dx, ngmd[bx]
	mov	ah, 9
	int	21h
	ret
PfFlop	endp

;12h тип НМД
PrHard	proc
	lea	dx, mess_13
	mov	ah, 9
	int	21h
	mov	al, cmos+12h
	shr	al, 4		;первый
	call	PrByte

	lea	dx, mess_14
	mov	ah, 9
	int	21h
	mov	al, cmos+12h
	and	al, 0fh		;второй
	call	PrByte
	ret
PrHard	endp

;14h оборудование
PrEquip	proc
	lea	dx, mess_15
	mov	cx, 0100h
	call	PrEqu
	lea	dx, mess_16
	mov	cx, 0101h
	call	PrEquR

	lea	dx, mess_17
	mov	ah, 9
	int	21h
	mov	cx, 0304h
	mov	al, cmos+14h
	call	BitsToI
	call	ItoInd
	mov	dx, vid[bx]
	mov	ah, 9
	int	21h

	lea	dx, mess_18
	mov	ah, 9
	int	21h
	mov	cx, 0306h
	mov	al, cmos+14h
	call	BitsToI
	inc	al
	or	al, 30h
	int	29h
	ret
PrEquip	endp

;15h-18h память
PrMem	proc
	lea	dx, mess_19
	mov	ah, 9
	int	21h
	mov	ax, word ptr cmos+15h
	call	PrNum
	lea	dx, mess_20
	mov	ah, 9
	int	21h
	mov	ax, word ptr cmos+17h
	call	PrNum
	ret
PrMem	endp

;19h-1ah расширенные диски
PrExtHD	proc
	lea	dx, mess_21
	mov	ah, 9
	int	21h
	mov	al, cmos+19h
	call	PrByte
	lea	dx, mess_22
	mov	ah, 9
	int	21h
	mov	al, cmos+1ah
	call	PrByte
	ret
PrExtHD	endp

;2Eh-2Fh контрольная сумма ячеек 10h-20h
PrCRC	proc
	lea	dx, mess_23
	mov	ah, 9
	int	21h
	mov	ah, cmos+2eh
	mov	al, cmos+2fh
	call	PrNum
	ret
PrCRC	endp

;30h-31h расширенная память
PsExMem	proc
	lea	dx, mess_24
	mov	ah, 9
	int	21h
	mov	ax, word ptr cmos+30h
	call	PrNum
	ret
PsExMem	endp

;32h столетие
PrCent	proc
	lea	dx, mess_25
	mov	ah, 9
	int	21h
	mov	al, cmos+32h
	call	PrBCD
	ret
PrCent	endp

;33h дополнительная информация из CMOS памяти
PrAdd	proc
	lea	dx, mess_26
	mov	cx, 0107h
	call	PrAddFlR
	lea	dx, mess_27
	mov	cx, 0106h
	call	PrAddFlR
	ret
PrAdd	endp

;----------------------------------------------------
PrBCD	proc		;вывод BCD числа из al
	push	ax
	shr	al, 4
	or	al, 30h
	int	29h
	pop	ax
	and	al, 0fh
	or	al, 30h
	int	29h
	ret
PrBCD	endp

ItoInd	proc		;формирование индекса в bx из BCD числа
	xor	bx, bx
	jmp	nbcommon
ItoInd	endp

ItoIndD	proc		;формирование индекса в bx из BCD числа (минус 1)
	mov	bx, -1
nbcommon:		;общая часть
	push	ax
	shr	al, 4
	mov	dl, 10
	mul	dl
	add	bx, ax
	pop	ax
	and	ax, 0fh
	add	bx, ax
	shl	bx, 1	;bx - индекс
	ret
ItoIndD	endp

BitsToI	proc		;формирование числа из битов регистра al, 
			; cl - на сколько сдвинуть вправо
			; ch - маска по AND, чтобы выделить после сдвига только нужные
	mov	ah, 0
	shr	al, cl
	and	al, ch
	ret
BitsToI	endp

PrByte	proc		;вывод десятичного числа, байта из al
	mov	ah, 0
PrByte	endp

PrNum	proc		;вывод десятичного числа, слова из ax
	mov	bx, 10		; будем делить на 10
	xor	cx, cx		; счетчик цифр
div_loop:			; цикл получения десятичных разрядов
	xor	dx, dx		; подготовимся для очередного деления
	div	bx		; в dx остаток - очередной десятичный разряд
	push	dx		; сохраним в стеке (от младшего к старшему)
	inc	cx		; посчитаем
	test	ax, ax		; есть еще десятичные разряды?
	jnz	div_loop	; продолжим

pr_loop:			; цикл вывода десятичных цифр-символов
	pop	ax		; востановим очередной разряд (от старшего к младшему)
	add	al, '0'		;  символ цифры
	int	29h		; вывод
	loop	pr_loop		; по всем цифрам
	ret
PrNum	endp

	end 


   Вперёд
   Содержание
Сайт всех женщин из Мск , https://www.vzasos.info женщины Москвы дадут любому!