Студентам с вопросами о лабораторных работах сюда

Тема в разделе "WASM.BEGINNERS", создана пользователем IceStudent, 11 ноя 2006.

  1. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    под ДОС или windows? Если под дос, то перехватываете прерывание 0Ch, и каждые 5 секунд пищите спикером - или делаете цикл с задержкой на 5 секунд, и печатаете символ 07. Если под винду, то делаете окно, неотображаемое (SW_HIDE), создаете таймер, и каждый раз по таймеру MessageBeep или что-то похожее.

    пикает - это не задание. Как именно пикает? Продолжительность, частота, форма кривой?

    должны ли при этом выполняться другие программы? То есть, должен ли это быть резидент в дос, или исполняющийся исключительно "бипер" в дос? Должна ли это быть нормальная корректно работающая программа под win, или вас устроит вариант "сделать что-нибудь, чтоб комп перезагрузился и начал пищать"?

    Некоторые могут написать драйвер, который будет пищать спикером из 0-го кольца. Но тогда надо еще уточнить, Win9x или NT.

    Словом, задача плохо формализована.
     
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.784
    Посмотрите
    здесь вывод мелодии через outs на спикер, просмотр содержимого CMOS, получение scan-кодов из порта клавиатуры, перезагрузка. Во вложении вывод звукового сигнала небольшой продолжительностью на спикер. Всё работает под WinXP. Как подключить таймер надеюсь сообразите сами
     
  3. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    jng тоже самое что jle
    смотрите внимательнее справочник по инструкциям
     
  4. Den

    Den New Member

    Публикаций:
    0
    Регистрация:
    22 сен 2009
    Сообщения:
    8
    Люди помогите начертить блок-схему программы, готов даже руб 50 кинуть на телефон кто сделает:
    Спикер пищит каждые 5 секунд:

    Код (Text):
    1. astack  segment stack
    2.     dw 100 dup (?)
    3. astack  ends
    4.  
    5. start   segment
    6. assume  cs: start, ss:astack
    7.  
    8. ; процедура sound
    9. ; описание:
    10. ;  начинает воспроизведение звука заданной частоты
    11. ; входные параметры:
    12. ;  AX = частота звучания
    13. sound   proc
    14.     mov cx, ax
    15.  
    16.     mov al, 0B6h
    17.     out 43h, al
    18.  
    19.     mov dx, 12h     ; DX:AX - частота генератора
    20.     mov ax, 34DDh   ;  1193181 Гц
    21.     div cx      ; расчет коэффициента пересчета
    22.     out 42h, al     ; запись младшего байта счетчика
    23.     mov al, ah
    24.     out 42h, al     ; запись старшего байта счетчика
    25.  
    26.     in  al, 61h
    27.     or  al, 11b
    28.     out 61h, al     ; запуск таймера
    29.  
    30.     ret
    31.  
    32. endp
    33.  
    34. ; процедура nosound
    35. ; описание:
    36. ;  прекращает воспроизведение звука
    37. ; параметры:
    38. ;  не имеет параметров
    39. proc    nosound
    40.  
    41.     in  al, 61h
    42.     and al, not 11b
    43.     out 61h, al     ; остановка таймера
    44.     ret
    45.  
    46. nosound endp
    47.  
    48. ; процедура beep
    49. ; описание:
    50. ;  воспроизводит звук с частотой 440 Гц и длительностью 0.1 секунды
    51. ; параметры:
    52. ;  не имеет параметров
    53. proc    beep
    54.  
    55.     mov ax, 440     ; частота для ноты "ля" первой октавы
    56.     call    sound       ; начать воспроизведение
    57.     mov ah, 2ch
    58.     int 21h
    59.  
    60.     add bl, 10
    61.     cmp bl, 100
    62.     jb  msec_ok
    63.                 sub bl, 100
    64. msec_ok:
    65.     call    _wait        ; ждем 100 мсек
    66.     call    nosound     ; закончить воспроизведение
    67.     ret
    68.    
    69.    
    70.  
    71. endp
    72.  
    73.  
    74. ; процедура _wait
    75. ; описание:
    76. ;  ожидание наступления момента времени
    77. ; параметры:
    78. ;  BX = время выхода из процедуры (BH = секунды, BL = сотые доли секунды)
    79. proc    _wait
    80.  
    81. _wait_loop:
    82.     mov ah, 2ch
    83.     int 21h
    84.     cmp dx, bx
    85.     jb  _wait_loop
    86.     ret
    87.  
    88. endp
    89.  
    90. begin proc far
    91.  
    92.     push    ds
    93.     xor ax, ax
    94.     push    ax
    95.  
    96.     mov si, 10      ; количество повторений
    97.  
    98.     mov ah, 2ch
    99.     int 21h     ; запрос системного времени
    100.     mov bx, dx
    101.  
    102. _loop:  call    beep
    103.     dec si
    104.     jz  _end
    105.     add bh, 5       ; ждать 5 секунд
    106.     call    _wait
    107.     jmp _loop
    108. _end:
    109.     ret
    110. endp
    111.  
    112. start   ends
    113. end begin
     
  5. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.784
    Den
    А твой asm-файл компилируется нормально? EXE-файл, то получился? А динамиком он пищит? Или ты думаешь главное блок-схема, а чтобы работало как нужно -- это уже второстепенное?
     
  6. Den

    Den New Member

    Публикаций:
    0
    Регистрация:
    22 сен 2009
    Сообщения:
    8
    Всё работает и exe я откампилил.Пищит динамик через каждые 5 секунд по 9 повторов.Надо просто по этому коду составить блок-схему программы.Особенно важен фрагмент блок схемы когда в порт 061h записываем младший и старший байт 11 то есть когда динамик пищит и когда динамик прекращает пищать.
    Код (Text):
    1. in  al, 61h
    2.     or  al, 11b
    3.     out 61h, al     ; запуск таймера
    4.  
    5.     ret
    6.  
    7. endp
    8.  
    9. ; процедура nosound
    10. ; описание:
    11. ;  прекращает воспроизведение звука
    12. ; параметры:
    13. ;  не имеет параметров
    14. proc    nosound
    15.  
    16.     in  al, 61h
    17.     and al, not 11b
    18.     out 61h, al     ; остановка таймера
    19.     ret
    Срочно плз.почта моя voland199@ya.ru
     
  7. atatart

    atatart New Member

    Публикаций:
    0
    Регистрация:
    30 сен 2009
    Сообщения:
    1
    Здравствуйте,
    Моя работа заключается в создании планировщика в пользовательском пространстве,
    Я имею общую картину, как узнать или где можно взглянуть подробнее на точную структуру программы в памяти.

    Будет создан вектор в котором будут хранится процессы.

    init_sched инициализирует библиотеку,
    new_proc(void (*)f (int), int arg) регистрирует новый процесс к исполнению,
    start_sched() начинает планировщик,
    mysetjmp(int) mylongjmp(int) принимают номер следующего избранника в векторе, сохраняют нынешнего и передают исполнение другому, вот пока сделал это - правильно или нет? Может где то есть уже решение похожей задачи?

    Код (Text):
    1. #define init_sched() ({char var; top_stack = & var;})
    2. #define SRUN 1
    3. #define NOPROCESS 0
    4.  
    5. #include <setjmp.h>
    6. #include <stdio.h>
    7. #include <stdlib.h>
    8. #include <string.h>
    9.  
    10. struct Tproc{
    11.   jmp_buf regs;
    12.   char pile[SIZE_PILE];
    13.   int taille_pile;
    14.   int etat;
    15.   /* 0 – нет процесса, SRUN == 1 готов к исполнению  */
    16. } ;
    17.  
    18. struct Tproc proc[NPROC];
    19. /* будет NPROC процессов  */
    20.  
    21. //int setjmp(jmp_buf env);
    22.  
    23. int elu;
    24. /* variable indicant le nombre du processeur elu*/
    25. char * top_stack;
    26. /* c est par ici que l on placera lw sommet de la pile */
    27.  
    28. int mysetjmp (int ind);
    29. void mylongjmp (int ind);
    30.  
    31. int main(int argc, char ** argv  ){
    32.   elu = 1;
    33.   init_sched();
    34.   printf("в вершине стека %i\n", top_stack);
    35.  
    36.   return 0;
    37. }
    38.  
    39. int mysetjmp(int ind){
    40.   if( setjmp(proc[ind].regs)== 0){
    41.     memcpy(proc[ind].pile,top_stack - SIZE_PILE, SIZE_PILE);
    42.     return 0;
    43.   /* если здесь значит сохраняемся*/
    44.   }
    45.   else
    46.     {
    47.       /* значит восстанавливаемся */
    48.       memcpy(top_stack - SIZE_PILE, proc[ind].pile, SIZE_PILE);
    49.       elu = ind;
    50.       return 1;
    51.     }
    52. }
    53. void mylongjmp(int ind){
    54.   elu = ind;
    55.   mysetjmp(ind);
    56.   proc[ind].regs;
    57. }
     
  8. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.784
    Den
    Судя твой листинг в #1844 и masm'ом и tasm'ом компелируется с ошибками, если ошибки исправить то логика работы нарушена, ты сам пишешь,
    хотя в счетчик ты кладешь число 10, а может пропищать 5 или 7 раз, главная ошибка, что ты увеличиваешь число секунд
    а в bh может уже оказаться число 59 таким образом в bh будет 64 а в dh не может быть больше 59 и твоя программа вешается. Нарисовать блок-схему для программы на ассемблере проще некуда, каждую команду кроме jmp, jb обводи квадратом и рисуй стрелку вниз, а вот jb помести в ромбик и одна стрелка к метке, а другая вниз
    Код (Text):
    1. .model tiny
    2. .286
    3. .code
    4. org 100h
    5. begin:
    6.     +---------+
    7.     │mov si,10|        ; количество повторений
    8.     +---------+        
    9.        \|/
    10.     │mov ah,0       ; запрос системного времени
    11.        \|/
    12.     │int 1Ah        ; возвращает в регистрах CX:DX число тиков от полуночи
    13. ; в секунде 18,2 тика
    14.        \|/
    15.     │mov bx,dx      ;сохраняем полученное значение
    16. ;  воспроизводим звук с частотой 440 Гц и длительностью 0.27 секунды
    17. _loop:      +-------------+
    18.            \|/            |
    19.     │in al,61h      ; получаем текущее состояние порта 61h в AL
    20.            \|/            |
    21.     │or al,11b      ; установим 0-ой и 1-ый биты в 1
    22. ;бит 0 разрешает работу канала таймера, а бит 1 включает динамик
    23.            \|/            |
    24.     │out 61h,al     ; теперь динамик включен
    25.            \|/            |
    26.     │mov al,0B6h    ; канал 2, режим 3
    27. ;10.11.011.0b=0B6h        |
    28. ;|  |  |   |              |
    29. ;|  |  |   формат счетчика двоичное число от 0 до 0FFFFh
    30. ;|  |  генератор прямоугольных импульсов
    31. ;|  чтение сначала младшего, а потом старшего байта
    32. ;2-ой канал               |
    33.            \|/            |
    34.     │out 43h,al     ;отправляем в командный регистр
    35.            \|/            |
    36.     │mov al,98h; коэффициент пересчета 1193181 Гц/440 Гц =2711,775=0A98h
    37.            \|/            |
    38.     │out 42h,al     ; запись младшего байта счетчика
    39.            \|/            |
    40.     │mov al,0Ah       |
    41.            \|/            |
    42.     │out 42h,al     ; запись старшего байта счетчика  
    43.            \|/            |
    44.     │add bx,5       ; задержка 5000/182=27,5 мСек
    45.         +-----------+ |
    46. @@:    \|/          | |
    47.     │int 1Ah        | |
    48.            \|/          | |
    49.     cmp dx,bx       | |
    50.            \|/          | |
    51.            /\           | |
    52.          /    \---------+ |
    53.     jb @b /;ждем 27,5  | мсек
    54.      \   /            |
    55.        \/             |
    56.       \|/             |
    57.     │in al,61h        |; получаем текущее состояние порта 61h в AL
    58.     │and al,not 11b   |; обнуляем два младших бита
    59.     │out 61h,al       |; теперь динамик выключен
    60.     │add bx,91        | ; ждать 5 секунд  18,2*5=91
    61. @@:     ------------+ |
    62.     │int 1Ah        | |
    63.     cmp dx,bx       | |
    64.     jb @b ----------+ |
    65.     │dec si           |
    66.     jnz _loop --------+
    67.     │retn
    68. end    begin
     
  9. Den

    Den New Member

    Публикаций:
    0
    Регистрация:
    22 сен 2009
    Сообщения:
    8
    Mikl___
    Огромное тебе спасибо!!!программа действительно немного косячно работает.Не мог ты подправить код как должно быть.
     
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.784
    Den
    В #1848 убери графическое оформление (|, /, \, +) остальное там проверенный, рабочий листинг, который компелируется и masm'ом и tasm'ом в com :)
     
  11. Den

    Den New Member

    Публикаций:
    0
    Регистрация:
    22 сен 2009
    Сообщения:
    8
    Mikl___
    Попробывал откампилить вот этот код
    Код (Text):
    1. .model tiny
    2. .286
    3. .code
    4. org 100h
    5. begin:
    6.     mov si,10      ; количество повторений
    7.         mov ah,0       ; запрос системного времени
    8.     int 1Ah        ; возвращает в регистрах CX:DX число тиков от полуночи
    9.     ; в секунде 18,2 тика
    10.     mov bx,dx      ;сохраняем полученное значение
    11.     ;  воспроизводим звук с частотой 440 Гц и длительностью 0.27 секунды
    12. _loop:   
    13.         in al,61h      ; получаем текущее состояние порта 61h в AL
    14.         or al,11b      ; установим 0-ой и 1-ый биты в 1
    15.     ;бит 0 разрешает работу канала таймера, а бит 1 включает динамик
    16.     out 61h,al     ; теперь динамик включен
    17.     mov al,0B6h    ; канал 2, режим 3
    18.     ;10.11.011.0b=0B6h        
    19.     ;|  |  |   |              
    20.     ;|  |  |   формат счетчика двоичное число от 0 до 0FFFFh
    21.     ;|  |  генератор прямоугольных импульсов
    22.     ;|  чтение сначала младшего, а потом старшего байта
    23.     ;2-ой канал              
    24.     out 43h,al     ;отправляем в командный регистр
    25.     mov al,98h; коэффициент пересчета 1193181 Гц/440 Гц =2711,775=0A98h
    26.     out 42h,al     ; запись младшего байта счетчика
    27.     mov al,0Ah      
    28.     out 42h,al     ; запись старшего байта счетчика 
    29.     add bx,5       ; задержка 5000/182=27,5 мСек
    30.  @@:     
    31.     int 1Ah        
    32.     cmp dx,bx      
    33.         jb @b  ;ждем 27,5  | мсек
    34.  
    35.     in al,61h        ; получаем текущее состояние порта 61h в AL
    36.     and al,not 11b   ; обнуляем два младших бита
    37.     out 61h,al       ; теперь динамик выключен
    38.     add bx,91         ; ждать 5 секунд  18,2*5=91
    39. @@:  
    40.     int 1Ah        
    41.     cmp dx,bx      
    42.     jb @b
    43.     dec si          
    44.     jnz _loop
    45.     retn
    46. end    begin
    но мне почему то при запуске tasm пишет 3 ошибки:
    ***Error***5.asm(33) Undefined symbol: @B
    ***Error***5.asm(39) Symbol already defined elsewhere: @@
    ***Error***5.asm(42) Undefined symbol: @B
    Помогите разобраться пожалуйста
     
  12. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.784
    Den
    метки @@ поддерживаются в masm, fasm, tasm (интересно чем же ты компилируешь?) чтобы не заморачиваться с названиями, jmp @b означает переход назад (back) к ближайшей @@ метке, jmp @f означает переход вперед (forward) к ближайшей @@ метке, поставь на 30 строке вместо @@ метку a1, на 33 строке "jb a1 ;ждем 27,5 мсек" на 39 строке вместо @@ метку a2, на 42 строке "jb a2"
     
  13. Den

    Den New Member

    Публикаций:
    0
    Регистрация:
    22 сен 2009
    Сообщения:
    8
    Mikl___
    Ага всё откампилилось и прога работает.Не мог бы ты мне по коду ещё кое-что разъяснить.
    - сколько длится звуковой сигнал (1 секунду?) и где в коде это прописано?
    -
    Код (Text):
    1. .model tiny
    2. .286
    3. .code
    4. org 100h
    что это?
    - i
    Код (Text):
    1. int 1Ah
    ; возвращает в регистрах CX:lol: X число тиков от полуночи
    ; в секунде 18,2 тика. Для чего это?
    -
    Код (Text):
    1. mov al,98h
    ; коэффициент пересчета 1193181 Гц/440 Гц =2711,775=0A98h
    что такое 775 и какую роль он играет и 2711-коэффициент пересчёта????
    -
    Код (Text):
    1. add bx,5
    ; задержка 5000/182=27,5 мСек .Что такое 5000 и 182.Задержка чего?
    -
    Код (Text):
    1. add bx,91
    ; ждать 5 секунд 18,2*5=91. что такое 91???
    -
    Код (Text):
    1. int 1Ah
    - тоже не понял что это(((
    плз разъясни если можешь, хочу разобраться в программе.
     
  14. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.784
    Den
    Как же вас ассемблеру учат? Да и ты сам мог бы в учебник заглянуть .model tiny - модель памяти соответствует приложению COM - программа из одного сегмента в котором находится и стек и код и данные, для создания приложений EXE используют small (Код программы нахо­дится в одном сегмен­те. Данные и стек на­ходятся в другом сег­менте), medium (Код находится в нескольких сегмен­тах, по одному на каждый программ­ный модуль. Данные объединены в один сегмент), compact (Код находится в од­ном сегменте. Данные могут находится в несколь­ких сегментах. Для ссылки на данные из кода применяются указатели даль­него типа), large (Код может размещать­ся в нескольких сег­ментах, на каждый мо­дуль новый сег­мент. Данные также разме­щаются в нескольких сегментах. Для ссылки на данные из кода применяются указате­ли дальнего типа), huge (Код может размещаться в нескольких сег­ментах, на каждый мо­дуль новый сегмент. Данные и код имеют тип huge), для windows приложений используют модель flat
    .286 - это директива описа­ния типа микропроцессора (может быть еще и .8086, .8087, .186, .286, .287, .386, .387, .486, .586, .mmx с добавлением или без добавления букв P (приви­легированные команды) и C или N (непривилегированные команды))
    .code - По этой директиве будет определен сегмент кода.
    org 100h - директива установки адреса, используется, чтобы программа ассемблировалась с определенного адреса
    mov ah,0 /int 1Ah - вызов 0 функции прерывания 1Ah, в комментарии рядом написано. что делает эта функция. Для чего? чтобы сделать задержку на 5 секунд (перерыв между гудками) и на 0,27 секунд если ты читаешь внимательно то там написано в одной секунде 18,2 тиков, соответственно 5 секунд это 18,2*5=91 тик
    коэффициент пересчета 1193181 Гц/440 Гц =2711,775=0A98h как коэффициент пересчета был получен в твоем варианте программы 1193181 = 1234DDh 12h ты отправлял в регистр dx, а 34DDh в регистр ax, потом ты поместил в регистр cx число 440 и разделил dx:ax на cx, в ax у тебя получилось 2711, я тоже самое сделал на калькуляторе и получил число 2711,775~2712=0A98h это число частями я и вывожу в порт 42h (mov al,98h /out 42h,al /mov al,0Ah /out 42h,al)
     
  15. Den

    Den New Member

    Публикаций:
    0
    Регистрация:
    22 сен 2009
    Сообщения:
    8
    Mikl___
    Спасибо тебе большое.С кодом разобрался.А ассемблеру нас не учат это только одна лаба на нём.Дали задание и идите пишите(((И masm tasm tlink сказали где скачать и всё.
     
  16. NewNewbie

    NewNewbie New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2009
    Сообщения:
    4
    Здравствуйте! Помогите с лабораторной работой.
    Задание: ввести 2 десятичных числа и перевести первое из них в систему счисления с основанием второго числа.
    Требования: Tasm/Masm, 16 бит, на выходе exe-файл.
     
  17. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    NewNewbie
    абсурд
     
  18. NewNewbie

    NewNewbie New Member

    Публикаций:
    0
    Регистрация:
    6 окт 2009
    Сообщения:
    4
    wsd
    не спорю.. давайте не будем о системе нашего образования, т.к. об этом наверняка уже говорилось и не мало..
    имеется в виду: вводим a и b, и нужно перевести a в b-ую систему счисления.. 2<=b<=35
     
  19. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Ну этож везде описано "почти". Делим a на b , остаток переводим.
    Для перевода простая прожка : для 0-9 добавляем код символа нуля 0х30, для 10 и далее код буквы A - 10. частное опять делим, символы копим в буфере. Потом выводим. Писать на ассемблере не буду.
     
  20. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Символы копим задом наперед или выводим задом наперед.