Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите новичку
Форум программистов > Системное программирование > Другие
Guest_maku
Вот задачки 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

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

Сам переделаешь (доделаешь). Основа есть...

; (С) Авторские права на файлы-приложения принадлежат подписчикам рассылки
; "Ассемблер? Это просто! Учимся программировать"
; Автор рассылки:
; Калашников Олег Александрович (e-mail: Assembler@Kalashnikoff.ru)
;                 http://www.Kalashnikoff.ru

; --- Ассемблирование (получение *.com файла) ---
;При использовании MASM 6.11 - 6.13:
;ML.EXE XMSMEM.asm /AT

;При использовании TASM:
;TASM.EXE XMSMEM.asm
;TLINK.EXE XMSMEM.obj /t/x


.386
.8087
CSEG segment use16
assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG
org 100h

Start:
    mov ah,9
    mov dx,offset Mess_about
    int 21h

;Проверим на наличие Himem.sys в памяти...
    mov ax,4300h
    int 2Fh

    cmp al,80h
    je Himem_loaded;Если AL = 80h, то Himem.sys загружен.

;Иначе выводим сообщение о том, что Himem в памяти не обнаружен...
    mov ah,9
    mov dx,offset Mess_nohimem
    int 21h
    ret


Himem_loaded:
;Готовим XMS-память (отводим блок в XMS-памяти)
    call Prepare_XMS

    ret



;=== Готовим XMS-память ===
Prepare_XMS proc
    mov ax,4310h
    int 2Fh

    mov word ptr XMS_Addr,bx
    mov word ptr XMS_Addr+2,es;Сохраним обработчик XMS-функций

    mov ah,88h ;Получить кол-во Кб XMS-памяти (всего)
    call dword ptr XMS_Addr
    mov dword ptr Number_dec,edx;Сохраним кол-во Кб XMS-памяти

    mov dx,offset Mess_TotalMemory
    mov ah,9
    int 21h

    mov ah,3
    mov bh,0
    int 10h;Читаем текущую позицию курсора

    add dx,8
    mov ah,2
    int 10h;Установим курсор на 8 позиций правее, после выведенного сообщения

    call Out_dec;Выводим кол-во килобайт XMS в текущую позицию курсора

    mov dx,offset Mess_cursor
    mov ah,9
    int 21h
    ret
Prepare_XMS endp


;=== Вывод десятичного числа на экран с использованием сопроцессора ===
;Здесь без комментариев... См. предыдущие выпуски...
Out_dec proc
   finit

   fstcw Dat
   or Dat,0C00h
   fldcw Dat
   fldz
   fild Divider
   fild Number_dec
   fst st(7)

Next_sym:
   fprem
   fistp Dat
   call Out_sym
   fld st(6)
   fdiv st,st(1)
   frndint
   fst st(7)
   fcom st(2)
   fstsw ax
   and ax,4500h
   cmp ax,4000h
   jnz Next_sym
Finish_dec:
   ret

Number_dec dq 0

Divider dw 10
Dat dw ?
Out_dec endp

;=== Вывод одного символа на экран в текущую позицию курсора ===
Out_sym proc
   push dx

   mov ah,2
   mov dl,byte ptr Dat
   add dl,'0'
   int 21h
   pop dx

   dec dx
   mov ah,2
   mov bh,0
   int 10h

   ret
Out_sym endp


Mess_about db 0Ah, 0Dh, 'XMSMEM - определяем объем XMS-памяти.',0Ah, 0Dh
          db 'Рассылка "Ассемблер? Это просто! Учимся программировать", Выпуск № 030',0Ah,0Dh
          db 'http://www.Kalashnikoff.ru. E-mail: Assembler@Kalashnikoff.ru',0Ah,0Dh,0Ah
          db '(C) Авторские права на файлы-приложения принадлежат всем подписчикам рассылки.',0Ah, 0Dh, 0Ah
          db 9,9,'=== Россия, Москва, 2001 год ===',0Ah,0Dh,'$'

Mess_nohimem db 'Драйвер Himem.sys не загружен! Невозможно использовать XMS-память!!!'
Mess_cursor db 0Ah, 0Dh,'$'

Mess_TotalMemory db 0Ah,0Ah,0Dh,'Всего XMS-памяти (Килобайт):$'

XMS_Addr dw ?
CSEG ends
end Start


]]>Полная статья]]>
????
Guest_maku
Там же (см. ссылку выше) есть и примеры резидентов. Примеры резидентов есть в каждом учебнике по Ассемблеру и огромное количество в интернете.
З.Ы. А на пары (лабы) надо ходить.
maku
Цитата(???? @ 9:12:2004, 23:51 )
Guest_maku
Там же (см. ссылку выше) есть и примеры резидентов. Примеры резидентов есть в каждом учебнике по Ассемблеру и огромное количество в интернете.
З.Ы. А на пары (лабы) надо ходить.

Большое спасибо за ответ, за помощь и за ваш сайт, который позволил мне почерпнуть много нового и интересного. В свое время я сталкивался с ассеблером, когда учился, правда это было довольно давно. Но моей девушке необходима была помощь в решение этих задач.
Вот в частности использовать для нахождения размера памяти CMOS. Я понял, что нужно выполнить нечто подобное:

xms dw ?

...
mov al,18h
out 70h,al
jmp $+2
in al,71h

mov bl,al

mov al,17h
out 70h,al
jmp $+2
in al,71h

mov ah,bl; т.е. регистр ах содержит размер памяти, но направляя
mov xms,ax; ... а потом процедуры, предложенные Вами Out_dec и Out_sym возникают ошибки...

Вы конечно можете признать меня полным чайником в этом вопросе, но я буду Вам благодарен, если поможете разобраться в этом вопросе.

Предложенная программа работает, спасибо. Но хотелось бы через порты ....


Заранее спасибо.
ReDM@N
У меня проблема: нужно написать резидентную МУЗЫКАЛЬНУЮ программу для курсовой. huh.gif
Музыкальную часть я сделал:

DO equ 4520
DO_ equ 4290
RE equ 4070
RE_ equ 3810
MI equ 3610
FA equ 3390
FA_ equ 3220
SOL equ 2995
SOL_ equ 2845
LIA equ 2700
LIA_ equ 2560
SII equ 2395
DOO equ 2270
DOO_ equ 2145
REE equ 2050
REE_ equ 1905
MII equ 1810
FAA equ 1720
FAA_ equ 1620
SOLL equ 1510
SOLL_ equ 1430
LIAA equ 1350
LIAA_ equ 1290
SIII equ 1220

OCT equ 2
QRT equ 4
HLF equ 8
FLL equ 12

freq dw REE_,SII,SOL_,SII,REE_,SII,REE_,MII,REE_,LIA_,FA_,LIA_,REE_,DOO_
dw REE_,SII,SOL_,SII,REE_,SII,REE_,MII,REE_,LIA_,FA_,LIA_,REE_,DOO_
dw REE_,SII,SOL_,SII,REE_,SII,REE_,MII,REE_,LIA_,FA_,LIA_,REE_,LIAA_
dw REE_,SII,SOL_,SII,REE_,SII,REE_,MII,REE_,LIA_,FA_,LIA_,REE_,DOO_
dur db QRT,QRT,QRT,QRT,QRT,QRT,QRT,QRT,QRT,QRT,QRT,QRT,HLF,HLF
db QRT,QRT,QRT,QRT,QRT,QRT,QRT,QRT,QRT,QRT,QRT,QRT,HLF,HLF
db QRT,QRT,QRT,QRT,QRT,QRT,QRT,QRT,QRT,QRT,QRT,QRT,FLL,QRT
db QRT,QRT,QRT,QRT,QRT,QRT,QRT,QRT,QRT,QRT,QRT,QRT,HLF,HLF
melody db 01,02,03,04,05,06,07,08,09,10,11,12,13,14
db 15,16,17,18,19,20,21,22,23,24,25,26,27,28
db 29,30,31,32,33,34,35,36,37,38,39,40,41,42
db 43,44,45,46,47,48,49,50,51,52,53,54,55,56,0ffh

music proc near
mov al,0B6h
out 43h,al
in al,61h
or al,3
out 61h,al
mov cx,2

mov cx,112
mov si,0
play:
lea bx,melody
mov al,[bx][si]
cmp al,0ffh
je stop
cbw

mov bx,offset freq
dec ax
shl ax,1
mov di,ax
mov dx,[bx][di]
mov al,dl
out 42h,al
mov al,dh
out 42h,al

mov ah,0
int 1ah
mov bx,offset dur
mov cl,[bx][si]
mov ch,0
mov bx,dx
add bx,cx
cont:
int 1ah
cmp dx,bx
jne cont
inc si
jmp play
stop:
in al,61h ;получим значение порта 61h в AL
and al,0FCh ;выключить динамик
out 61h,al ;в порт 61h
ret
music endp

А вот с резидентом потруднее...
В общем все должно быть несложно - при нажатии горячей клавиши с динамика начинает играть мелодия,
и на екране - текстовое сообщение. Но для меня реализировать все это сложновато.
Помогите пожалуста!! unsure.gif
Guest_Serg_*
Цитата(Guest_maku @ 9:12:2004, 22:01 )
Вот задачки 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

Если можно, то с комментариями.
Заранее бОООльшое спасибо.
*
Guest
Бог поможет, сын мой... ph34r.gif
nik
Сколько стоит 1 час работы web-программиста?
Barmutik
Смотря какой web-программист и смотря где он работает ...
nik
Цитата(Barmutik @ 8:12:2005, 09:37 )
Смотря какой web-программист и смотря где он работает ...
*

Удаленная работа, для выполнения некого объема работы, для web
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.