Помогите новичку

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
Maku
Сообщения: 1
Зарегистрирован: 09 дек 2004, 22:58

09 дек 2004, 23:10

Вот задачки 2 есть, помогите найти решение...
1)Hаписать программу в формате exe, выводящую на экран в десятичной системе счисления количество расширенной (XMS) памяти
(выше 1 Мб) (в байтах)

Примечание:
-Значение количества расширенной памяти можно определить, прочитав содержимое ячеек 17h (младший байт) и 18h (старший
байт) CMOS.
-Чтение из CMOS осуществляется следующим образом: в порт 70h записывается номер требуемого файла, затем его сдержимое
считывается из порта 71h.
-Т.к. CMOS медленное устройство и после записи в порт желательно вставить jmp short $+2

2) Hаписать резидентный обработчик прерывания клавиатуры, который при нажатии определённой комбинации (например,
CTRL-ALT-DEL) клавиш выводит на экран текущее время и завершается.
Примечание:
-Обработчик прерывания клавиатуры IRQI (INT 9) может быть дополнен во избежание переписывания всего кода обработки
клавиатуры.
-Для проверки сочетания нажатых клавиш может быть использован буфер клавиатуры, находящийся в области данных BIOS (сегмент
0040h). Адрес головы буфера клавиатуры размещён по смещению 001Ah, а адрес хвоста - по смещению 001Ch. Если адреса головы и
хвоста равны, то буфер пуст. Текущее состояние флагов клвиатуры содержится в байте состояния клавиатуры, находящемся по
смещению 0017h. Этот байт имеет следующую структуру:
0 бит клавиша Right Shift
1 бит клавиша Left Shift
2 бит клавиша Ctrl
3 бит клавиша Alt
4 бит переключатель Scroll Lock
5 бит переключатель Num Lock
6 бит переключатель Caps Lock
7 бит переключатель Insert

Если можно, то с комментариями.
Заранее бОООльшое спасибо.
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

10 дек 2004, 22:51

Задача 1:

Код: Выделить всё

	
CSeg	segment
	assume cs:CSeg,ds:CSeg
	org	100h
	.386		; работаем с XMS 3.0, нужны 32bit регистры
start:	
	mov	ax,3	; clrscr()
	int	10h
	; конечно можно работать с XMS через порты, но
	; мы будем грамотными (!) - как по спецификации, через
	; сервисные прерывания. XMS ваще может не быть.
	mov	ax,4300h
	int	2fh
	cmp	al,80h	; если не равно, то XMS отсутствует
	jnz	xms_unavaible
	
	push	es
	; получим точку входа (для пользования функциями)
	mov	ax,4310h
	int	2fh
	mov	word ptr xms_ep,bx
	mov	word ptr xms_ep + 2,es
	pop	es
	
	; тут можно (и нужно в реальной программе) проверить
	; версию XMS, но мы полагаем что не ниже 3.0
	
	; определяем размер памяти
	mov	ah,8
	mov	bl,0
	call	dword ptr xms_ep
	
	mov	ah,9
	mov	dx,offset xms_totalmem
	int	21h
	
	call	hex2dec
	
	jmp	exit_process
	
xms_unavaible:
	mov	ah,9
	mov	dx,offset xmserror_unavaible
	int	21h
exit_process:
	mov	ah,4ch
	int	21h

hex2dec:	; копирайт (c) процедуры НЕ МОЙ.	
	mov	di,offset string_buffer
	mov	eax,edx

	mov	ebx,10
	xor	ecx,ecx
divlp:
	xor	edx,edx
	div	ebx
	add	dl,'0'
	push	edx
	inc	ecx
	or	eax,eax
	jnz	divlp
store:
	pop	eax
	stosb
	loop	store
	
	mov	ah,9
	mov	dx,offset string_buffer
	int	21h
	
	mov	dx,offset string_kb
	int	21h
	
	ret
	; *************** ДАННЫЕ ***************
xms_ep			dd ?

xms_totalmem		db "Total memory: $"
xmserror_unavaible	db "XMS not found!$"
string_kb		db " kilobytes$"
string_buffer		db 255 dup('$')

CSeg	ends
end	start
Задачу 2 сделаю как только появится еще немного времени.
*provided AS IS
Ответить