PDA

Просмотр полной версии : Помогите новичку



Maku
09.12.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
10.12.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 сделаю как только появится еще немного времени.