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

Тема в разделе "Другие", создана пользователем Guest_maku, 9 дек 2004.

Статус темы:
Закрыта.
  1. Guest_maku

    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

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

    ???? Гость

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

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

    Код (Text):
    ; (С) Авторские права на файлы-приложения принадлежат подписчикам рассылки
    ; "Ассемблер? Это просто! Учимся программировать"
    ; Автор рассылки:
    ; Калашников Олег Александрович (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
    Там же (см. ссылку выше) есть и примеры резидентов. Примеры резидентов есть в каждом учебнике по Ассемблеру и огромное количество в интернете.
    З.Ы. А на пары (лабы) надо ходить.
     
  4. maku

    maku Гость

    <!--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 возникают ошибки...

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

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


    Заранее спасибо.
     
  5. ReDM@N

    ReDM@N Гость

    У меня проблема: нужно написать резидентную МУЗЫКАЛЬНУЮ программу для курсовой. :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

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

    Guest_Serg_* Гость

    <!--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]
     
  7. Guest

    Guest Гость

    Бог поможет, сын мой... :unsure:
     
  8. nik

    nik Гость

    Сколько стоит 1 час работы web-программиста?
     
  9. Barmutik

    Barmutik Гость

    Смотря какой web-программист и смотря где он работает ...
     
  10. nik

    nik Гость

    <!--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
     
Загрузка...
Похожие Темы - Помогите новичку
  1. artem4486
    Ответов:
    0
    Просмотров:
    14
  2. rn3rjd
    Ответов:
    9
    Просмотров:
    1.232
  3. maxiik
    Ответов:
    3
    Просмотров:
    1.581
  4. zaza41rus
    Ответов:
    0
    Просмотров:
    1.054
  5. Radion2
    Ответов:
    0
    Просмотров:
    1.670
Статус темы:
Закрыта.

Поделиться этой страницей