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

  • Автор темы Guest_maku
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest_maku

#1
Вот задачки 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

Если можно, то с комментариями.
Заранее бОООльшое спасибо.
 
?

????

#2
>>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
Полная статья
 
?

????

#3
Guest_maku
Там же (см. ссылку выше) есть и примеры резидентов. Примеры резидентов есть в каждом учебнике по Ассемблеру и огромное количество в интернете.
З.Ы. А на пары (лабы) надо ходить.
 
M

maku

#4
<!--QuoteBegin-????+9:12:2004, 23:51 -->
<span class="vbquote">(???? @ 9:12:2004, 23:51 )</span><!--QuoteEBegin-->Guest_maku
Там же (см. ссылку выше) есть и примеры резидентов. Примеры резидентов есть в каждом учебнике по Ассемблеру и огромное количество в интернете.
З.Ы. А на пары (лабы) надо ходить.[/quote]
Большое спасибо за ответ, за помощь и за ваш сайт, который позволил мне почерпнуть много нового и интересного. В свое время я сталкивался с ассеблером, когда учился, правда это было довольно давно. Но моей девушке необходима была помощь в решение этих задач.
Вот в частности использовать для нахождения размера памяти 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 возникают ошибки...

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

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


Заранее спасибо.
 
R

ReDM@N

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

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

А вот с резидентом потруднее...
В общем все должно быть несложно - при нажатии горячей клавиши с динамика начинает играть мелодия,
и на екране - текстовое сообщение. Но для меня реализировать все это сложновато.
Помогите пожалуста!! <_<
 
G

Guest_Serg_*

#6
<!--QuoteBegin-Guest_maku+9:12:2004, 22:01 -->
<span class="vbquote">(Guest_maku @ 9:12:2004, 22:01 )</span><!--QuoteEBegin-->Вот задачки 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

Если можно, то с комментариями.
Заранее бОООльшое спасибо.
[snapback]14531" rel="nofollow" target="_blank[/snapback]​
[/quote]
 
B

Barmutik

#9
Смотря какой web-программист и смотря где он работает ...
 
N
#10
<!--QuoteBegin-Barmutik+8:12:2005, 09:37 -->
<span class="vbquote">(Barmutik @ 8:12:2005, 09:37 )</span><!--QuoteEBegin-->Смотря какой web-программист и смотря где он работает ...
[snapback]28159" rel="nofollow" target="_blank[/snapback]​
[/quote]
Удаленная работа, для выполнения некого объема работы, для web
 
Статус
Закрыто для дальнейших ответов.