На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Перед отправкой сообщения внимательно прочтите правила раздела!!!
1. Запрещается обсуждать написание вирусов, троянов и других вредоносных программ!
2. Помните, что у нас есть FAQ раздела Assembler и Полезные ссылки. Посмотрите, возможно, там уже имеется решение вашего вопроса.

3. Настоятельно рекомендуем обратить особое внимание на правила форума, которые нарушаются чаще всего:
  3.1. Заголовок темы должен кратко отражать её суть. Темы с заголовками типа "Срочно помогите!" или "Ассемблер" будут отправляться в Корзину для мусора.
  3.2. Исходники программ обязательно выделяйте тегами [code]...[/code] (одиночные инструкции можно не выделять).
  3.3. Нежелательно поднимать старые темы (не обновлявшиеся более года) без веской на то причины.

Не забывайте также про главные Правила форума!

Добро пожаловать и приятного вам общения!!! ;)
 
Модераторы: Jin X, Qraizer
  
> ПРограмма на ассемблере.Помогите пожалуйста разобраться в некоторых вещах.( , TimeAsm
    Код разделен на три части: 1). void setpointer()
    2). void clock_p_s
    3). void retpointer().
    Что делается в каждой из частей?


    ExpandedWrap disabled
      _TEXT segment byte public 'CODE'
      _TEXT ends
       
      DGROUP group _DATA,_BSS
      assume cs:_TEXT,ds:DGROUP
       
      _DATA segment word public 'DATA'
      _off_1ch equ 1ch*4
      _maskf db 7
      _position dw 0
      _DATA ends
       
      _BSS segment word public 'BSS'
      _oldoffset1c dw ?
      _oldsegemnt1c dw ?
      _BSS ends
       
      _DATA segment word public 'DATA'
      _counttakts dw 0
      _timeend dw 20
      _oldsec dw 0
      _DATA ends
       
      _TEXT segment byte public 'CODE'
       
      ; ************************************************************************
      ; void setpointer()
      ; ************************************************************************
      assume cs:_TEXT
      @setpointer$qv proc near
      cli
      mov ax,0
      mov es,ax ;таблица находится в 0м сегменте
      mov bx,_off_1ch ;засылаем в bx смещение
      mov ax,[es:bx] ;засылаем в аккумулятор значение по ардесу es:bx смещение
      ;(первые 2 байта адреса системного обработчика)
      mov _oldoffset1c,ax ;засылаем в oldoffset1c cмещение ...
      mov ax,[es:bx+2] ;аналогично, только сегмент
      mov _oldsegemnt1c, ax
       
      ;записать новый вектор в таблицу векторов прерываний
      mov ax, offset @clock_p_s$qv;смещение нового обработчика в ax
      mov bx,_off_1ch
      mov [es:bx],ax
      push cs
      pop ax ;настройка ax на cs
      mov [es:bx+2],ax ;запись сегмента
       
      mov ax, 0b800h
      mov es, ax
      mov cx, 3838
      mov ax,32+7*256
      m0:
      mov bx, cx
      mov [es:bx],ax
      dec cx
      loop m0
       
      sti
      ret
      @setpointer$qv endp
       
      ; ************************************************************************
      ; void clock_p_s()
      ; ************************************************************************
      assume cs:_TEXT
      @clock_p_s$qv proc near
       
      ;сохранение в стеке используемых регистров
      push ax
      push bx
      push dx ;dx портит imul и idiv
      push es
      push ds
       
      ; настройка ds на cs
      push cs
      pop ds
       
      inc _counttakts ;инкремент counttakts
      mov ax,_counttakts
      mov dx,10
      imul dx
      mov bx,182
      idiv bx
      cmp ax,_oldsec
      jz endprog
      mov _oldsec,ax
      sub ax,_timeout
      jl endprog
      dec _timeend
      mov ax,2Ah
       
      ;запись в es адреса начала видеопамяти - B800:0000
      mov bx, 0b800h
      mov es, bx
      mov bx, _position ;позицию на экране - в bx
      mov ah, _maskf ;маску вывода - в ah
      mov es:[bx],ax ;вывод символа в центр экрана
      ;восстановление используемых регистров:
      inc _position
      inc _position
      endprog:
      pop ds
      pop es
      pop dx
      pop bx
      pop ax
      iret
      @clock_p_s$qv endp
       
      ; ************************************************************************
      ; void retpointer()
      ; ************************************************************************
      assume cs:_TEXT
      @retpointer$qv proc near
       
      cli
      ;восстановление вектора прерывания от таймера
      ;запрет аппаратных прерываний
      xor ax, ax ;снова настройка es на начало таблицы
      mov es, ax ;векторов прерываний
      mov ax, _oldoffset1c ;запись в таблицу смещения старого
      mov bx,_off_1ch
      mov [es:bx],ax ;обработчика прерывания от таймера
      mov ax,_oldsegemnt1c ;запись сегмента
      mov [es:bx+2], ax
      sti ;разрешение аппаратных прерываний
       
      ret
      @retpointer$qv endp
       
      _TEXT ends
       
      _DATA segment word public 'DATA'
      _DATA ends
      _TEXT segment byte public 'CODE'
      _TEXT ends
      public @clock_p_s$qv
      public @retpointer$qv
      public @setpointer$qv
      extrn _timeout:word
      public _oldsec
      public _timeend
      public _counttakts
      public _oldsegemnt1c
      public _oldoffset1c
      public _position
      public _maskf
      public _off_1ch
      end
    Сообщение отредактировано: Qraizer -
      M
      Используем тег [code] для добавления текста программы в пост! Устное предупреждение! Читаем правила!
        Прямо до боли напоминает сдачу лабораторных по асму в колледже... :whistle:

        Там же все в комментариях написано
        1. Вешается свой обработчик на прерывание таймера
        2. Выводится символ по центру экрана
        3. Восстанавливается прежний обработчик прерывания.
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0216 ]   [ 15 queries used ]   [ Generated: 6.10.24, 11:12 GMT ]