Авторизация
Ник
Пароль:
      
ASM
Список конференций  Список ТемСоздать новую тему  Добавить свой ответ
Chainik (Аспирант)
Чайник.  
Необходимо написать коммуникационную программу, которая бы осуществляла чтение данных, их запись в файл, передачу данных в устройство подключенное к компьютеру через СОМ-порт. Вот программа:(предупреждаю сразу,ошибок много,когда писал аж расплакался,столько опечаток у меня даже на экзамене не было,напишу верную программу когда все желающие ответят,кто не хочет напишите)Удачи,Чайник.
CSEG segment
assume cs:CSEG,ds:CSEG,es:CSEG,es:CSEG
org 100h
Begin: ;Установка нашего обработчика прерываний
  mov al,IRQ;Получение старого вектора обработчика
  mov ah,35h
  int 21h
  mov word ptr old_irq,bx
  mov word ptr old_irq+2,es;Сохранение старого адреса обработчика в old_irq
  ;Установка вектора прерывания IRQ на нашу процедуру (irq_handler)
  mov ah,25h
  mov al,IRQ
  mov dx,offset irq_handler
  int 21h   ;Инициализация регистра разрешения прерываний (СОМ+1)
  mov dx,COM+1;Если старший бит регистра 3F9=0
  mov al,0; то это регистр разрешения прерываний
  out dx,al;Запрещаем все прерывания
  mov dx,COM+5;Чтение из регистра
  in al,dx;состояния линии
  mov dx,COM+0;Чтение из регистра
  in al,dx;приема данных
  mov dx,COM+2;Открываем регистр FCR
  mov al,0
  out dx,al;Отключаем FIFO   ;Установка скорости СОМ порта
  mov dx,COM+3;открываем регистр управления линией (3FB)
  mov al,80h;Выставляем 7-й бит этого регистра в 1.
  out dx,al;В этом случае 3F8,3F9 работают как делитель частоты
  mov dx,COM+0;В регистр 3F8 записываем
  mov al,0Ch;младший байт делителя частоты
  out dx,al
  mov dx,COM+1;В регистр 3F9 записываем
  mov al,0;старший байт делителя частоты
  out dx,al;Мы записали 000Сh-скорость9600   ;Инициализация регистра управления линией (3FB)
  mov dx,COM+3;Записать в регистр управления линией
  mov al,0011b;число соответствующему длине слова 8бит
  out dx,al;1 без четности, 1 стоп-бит   ;Инициализация регистра разрешения прерываний (3F9)
  mov dx,COM+1;Открываем 3F9
  mov al,0111b; Разрешаем прерывания по состоянию BREAK
  out dx,al;если буфер передачи пуст, если пришли новые данные
 
;Процедура обработчика прерывания
  irq_handler proc far
  push ax
  push cx
  push dx
  push bx
  push sp
  push bp
  push si
  push di
M1:
  mov dx,COM+2; Читаем регистр идентификации
  in al,dx;прерываний
  test al,1;Если 0-й бит=0, то прерывание было
  jnz M1   ;Если 0-й бит =1, то прерывания не было
 
  mov dx,COM+5;Читаем регистр состояния линии
  in al,dx;в al
  test al,00100000b;Если 5-й бит равен 1, то регистр хранения передатчика пуст-можно писать в 3F8
  jz RECEIVE;Если регистр хранения передатчика полный,то переходим на прием данных
 
  mov ah,1;Функция проверки нажатия клавиши
  int 16h;прерывания 16h BIOS
  jz M1;Если не нажата уходим в начало (идентификацию прерываний)
  mov ah,01;была функция 8
  int 21h   mov ah,0 
  int 16h;  Получение кода клавиатуры (символ записан в al)
  mov dx,COM
  out dx,al
  jmp ANOT
 
  RECEIVE:
  mov dx,COM
  in al,dx
  mov byte ptr symbol,al;Принятый байт записывается в symbol
  int 29h   ANOT:
  mov dx,COM+2;
  in al,dx
  test al,1
  jz M1
  mov al,20h
  out 20h,al
  pop di
  pop si
  pop bp
  pop sp
  pop bx
  pop dx
  pop cx
  pop ax
iret
  irq_handler endp
COM equ 03f8h; Номер порта
IRQ equ 0Bh; Номер прерывания для IRQ3
old_irq dd ?
symbol dw 100h (?) CSEG ends
end Begin
 16.05.2008 14:29 
Chainik (Аспирант)
 
Это не тест,просто пока вопросов нет...
 16.05.2008 15:18 
Chainik (Аспирант)
 
Вот верный вариант программы:
CSEG segment
assume cs:CSEG,ds:CSEG,es:CSEG,es:CSEG
org 100h
Begin: ;Инициализация порта
 call COM_init
;Установка нашего обработчика прерываний
 call Set_COM_IRQ
;Основной цикл передача - по нажатию, прием - в прерывании
main_loop:
 mov ah,0
 int 16h; Получение кода клавиатуры (символ записан в al)  cmp ah, 1 ; Выход по ESC
 je finish  mov dx,COM+5;Читаем регистр состояния линии в al
 mov ah,al
wait_busy:;проверяем буфер передатчика (бесконечно ждать нехорошо, но для теста сойдет)
 in al,dx
 test al,00100000b;Если 5-й бит равен 1, то регистр хранения передатчика пуст-можно писать в 3F8
 jz wait_busy  mov al,ah
 mov dx,COM
 out dx,al
 jmp main_loop finish:
;Вернем вектор на место
 push ds
 lds dx, old_irq
 mov ah,25h
 mov al,IRQ
 int 21h
 pop ds  mov ax,4c00h; Завершаемся
 int 21h ;Процедура обработчика прерывания
irq_handler proc far
 push ax; сохраняем только те, что используются
 push bx
 push dx  mov dx,COM+5;Читаем регистр состояния линии
 in al,dx;в al  test al,2
 jnz overflow
 test al,1
 jz overflow
 mov dx,COM
 in al,dx
 mov ah,al
 mov dx,COM+5;Читаем регистр состояния линии
 in al,dx
 test al,2
 jnz overflow
 mov al,ah int_ret:
 mov bx, cs:index
 mov cs:[bx+symbol],al
 inc bx
 mov cs:index, bx
 int 29h  mov al,20h
 out 20h,al
 pop dx
 pop bx
 pop ax
 iret overflow:
 mov dx,COM
 in al,dx
 xor al,al
 jmp int_ret
irq_handler endp ;Установка нашего обработчика прерываний
Set_COM_IRQ proc near
 mov al,IRQ;Получение старого вектора обработчика
 mov ah,35h
 int 21h
 mov word ptr old_irq,bx
 mov word ptr old_irq+2,es;Сохранение старого адреса обработчика в old_irq
 ;Установка вектора прерывания IRQ на нашу процедуру (irq_handler)
 mov ah,25h
 mov al,IRQ
 mov dx,offset irq_handler
 int 21h
 ret
Set_COM_IRQ endp ;Инициализация порта
COM_init proc near
 ;Инициализация регистра разрешения прерываний (СОМ+1)
 mov dx,COM+1;Если старший бит регистра 3F9=0
 mov al,0; то это регистр разрешения прерываний
 out dx,al;Запрещаем все прерывания
 mov dx,COM+5;Чтение из регистра
 in al,dx;состояния линии
 mov dx,COM+0;Чтение из регистра
 in al,dx;приема данных
 mov dx,COM+2;Открываем регистр FCR
 mov al,0
 out dx,al;Отключаем FIFO  ;Установка скорости СОМ порта
 mov dx,COM+3;открываем регистр управления линией (3FB)
 mov al,80h;Выставляем 7-й бит этого регистра в 1.
 out dx,al;В этом случае 3F8,3F9 работают как делитель частоты
 mov dx,COM+0;В регистр 3F8 записываем
 mov al,0Ch;младший байт делителя частоты
 out dx,al
 mov dx,COM+1;В регистр 3F9 записываем
 mov al,0;старший байт делителя частоты
 out dx,al;Мы записали 000Сh-скорость9600  ;Инициализация регистра управления линией (3FB)
 mov dx,COM+3;Записать в регистр управления линией
 mov al,0011b;число соответствующему длине слова 8бит
 out dx,al;1 без четности, 1 стоп-бит  ;Инициализация регистра разрешения прерываний (3F9)
 mov dx,COM+1;Открываем 3F9
 mov al,1; Разрешаем прерывания, только если пришли новые данные !!!
 out dx,al
; mov al,0111b; Разрешаем прерывания по состоянию BREAK
; out dx,al;если буфер передачи пуст, если пришли новые данные  in al,21h
 and al,not IRQ_mask; Разрешаем прерывания от COM-а !!!
 out 21h,al  ret
COM_init endp COM equ 03f8h; Номер порта для COM1
IRQ equ 0Ch; Номер прерывания для IRQ4 (для COM1 IRQ=4 и вектор 0Ch !!!)
IRQ_mask equ 10h; маска разрешения IRQ4 для контроллера прерывания ;COM equ 02f8h; Номер порта для COM2
;IRQ equ 0Bh; Номер прерывания для IRQ3
;IRQ_mask equ 08h; маска разрешения IRQ3 для контроллера прерывания old_irq dd ?
index dw 0;индекс в строке symbol
symbol db 100h dup (?) CSEG ends
end Begin
 17.05.2008 16:05 

Пришло время электрокаров!
Новости, обзоры, видео, все об электромобилях Tesla на форуме TeslaTime.com.ua.


Добро пожаловать на наш Компьютерный Форум. Здесь Вы можете задавать свои вопросы касательно работы компьютера и его комплектующих, программного обеспечения и софта.
Всегда рады Вам помочь!!!
Rambler's Top100

0.0182111263275