Andy » 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 сделаю как только появится еще немного времени.
Задача 1:
[code]
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
[/code]
Задачу 2 сделаю как только появится еще немного времени.