Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
41 / 39 / 7
Регистрация: 27.05.2010
Сообщений: 252
1

Драйвер: найти ошибки

25.10.2010, 22:17. Показов 3183. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет, етот пример из методички из университетской кафедры. Походу есть ошыбки, помогите найти.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
DATA Segment byte public 'DATA'
   String DB 'Test printer!!!',13,10,0
   lpt_adr DW 0
DATA ENDS
CODE Segment byte public 'CODE'
ASSUME CS:CODE,DS:DATA,ES:DATA
 start:
        mov ax,data
        mov ds,ax
        push dx
        mov ax,40h
        mov dx,es:[08]
        mov lpt_adr,dx
        pop dx
        loop1:
        mov ah,ds:[bx]
        cmp ah,0h
        je exit
        call out_byte
        inc bx
        jmp loop1
        exit:
        mov ax,04Ch
        int 21h
        out_byte:
        push dx
        loop2:
        mov dx,lpt_adr
        inc dx
        test al,80h
        jz loop2
        dec dx
        mov al,ah
        out dx,al
        inc dx
        inc dx
        in al,dx
        and al,11111110b
        out dx,al
        or al,00000001b
        out dx,al
        and al,11111110b
        out dx,al
        pop dx
        ret
code ends
end start
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.10.2010, 22:17
Ответы с готовыми решениями:

Не устанавливается драйвер модема (код ошибки 31)
Перестали устанавливаться дравера на модем, причем не важно какой. Подключал разные устройства,...

Драйвер беспроводных сетей поврежден код ошибки 39
Версия wind 8.1 после выкл wi-fi и повторного ВКЛ пропали все беспроводные сети потом перезагрузил...

Код ошибки : 0x00000124 Драйвер причины : ntoskrnl.exe
Файл дампа : 021913-18330-01.dmp Время аварии : 19.02.2013 0:48:15 Текст ошибки ...

Не запускается драйвер Realtek WLAN на нетбуке ASUS Eee PC 900 (код ошибки 10)
Bvttncz Нетбук ASUS Eee PC 900 с установленной на нём XP Pro SP3x86 лицензионная, активированная,...

21
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
26.10.2010, 10:19 2
в начале явно пропущена одна строчка

Цитата Сообщение от Jettard Посмотреть сообщение
mov ax,40h
mov dx,es:[08]
грузит 2 байта не из области данных биос, а из псп(в es по умолчанию). Надо вставить
Assembler
1
2
3
mov ax,40h
mov es, ax
mov dx,es:[08]
дальше не смотрел

Добавлено через 19 минут
посмотрел дальше - out_byte тоже не верно. Кто составлял методичку?
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
out_byte:
        push dx
        mov dx, lpt_adr
        inc dx
loop2:
        in al, dx
        test al, 8  ; проверим на ошибку
        jnz pr_err
        test al,80h ; проверим на занятость
        jz loop2
 
        dec dx
        mov al,ah
        out dx,al   ; посылаем символ на принтер
        inc dx
        inc dx
        in al,dx
        and al,11111110b
        out dx,al   ; это как я понял стробирующие импульсы
        or al,00000001b
        out dx,al
        and al,11111110b
        out dx,al
        pop dx
pr_err:
; сообщение об ошибке
; и желательно какой нибудь флаг чтобы не продолжать цикл
        ret
Добавлено через 54 минуты
кстати не понятно название темы - на драйвер явно не тянет
1
41 / 39 / 7
Регистрация: 27.05.2010
Сообщений: 252
26.10.2010, 14:07  [ТС] 3
Цитата Сообщение от Jettard Посмотреть сообщение
cmp ah,0h
je exit
ето ведь тоже не верно? потому что если конец строчки то выход, а не печать...

Добавлено через 48 секунд
Цитата Сообщение от vital792 Посмотреть сообщение
это как я понял стробирующие импульсы
угу...

Добавлено через 40 секунд
короче ппц
1
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
26.10.2010, 14:42 4
Цитата Сообщение от Jettard Посмотреть сообщение
Сообщение от Jettard
cmp ah,0h
je exit
ето ведь тоже не верно? потому что если конец строчки то выход, а не печать...
это как раз верно. Выводится на печать посимвольно, а если конец строки - выход
1
41 / 39 / 7
Регистрация: 27.05.2010
Сообщений: 252
31.10.2010, 22:36  [ТС] 5
Assembler
1
test al, 8      ; проверим на ошибку
на какую именно ошибку?
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
31.10.2010, 23:16 6
Регистр статуса
бит 0-2 не используются
бит 3 0 = ошибка принтера 1 = нет ошибки
бит 4 0 = принтер off-line 1 = принтер on-line
бит 5 0 = бумага вставлена 1 = нет бумаги
бит 6 0 = принтер подтверждает прием символа 1= нормальная установки
бит 7 0 = принтер занят 1 = принтер свободен
я порылся в интернете и нашел пример из твоей методички - один в один.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
; Пример разработан на TASM.
DATA Segment byte public 'DATA'   ; Описываем сегмент
                                  ; данных
String   DB  'Test printer !!!',0Dh, 0Ah,0 ; выводимая строка
Lpt1_adr DW 0  ; Переменная для хранения базового адреса LPT1
 
DATA ENDS ; конец сегмента данных
 
 
; Сегмент кода - в нем расположим саму программу
CODE Segment byte public 'CODE'
ASSUME CS:CODE,DS:DATA,ES:DATA
 
START:   ; Начало программы
 mov ax, data ; установим ds на сегмент данных
 mov ds, ax
 push dx
 mov ax, 40h
 mov es, ax   ; в es - сегмент = 0040h
 mov  dx, es:[08] ; dx = базовый адрес порта lpt1
 mov lpt1_adr, dx ; запомнили адрес порта lpt1 в переменной lpt1_adr
 pop dx
LOOP1:          ; цикл печати строки
 mov ah, ds:[bx] ; прочитали очередной символ строки
 cmp ah, 0h      ; это конец строки ?
 je  exit        ; да, выход
 call out_byte   ; нет, печатаем его
 inc bx          ; на следующий символ
 jmp loop1       ; повторяем, пока не достигли конца строки
EXIT:            ; завершение программы
 mov ax,4C00h ; завершить с кодом возврата 0
 int 21h
 
;**** процедуры и функции программы ****
OUT_BYTE:   ; процедура вывода символа из ah на принтер с ожиданием
 push dx
 LOOP2:
  mov dx, lpt1_adr
  inc dx  ; адрес регистра состояния (lpt1_adr+1)
  in  al, dx  ; Читаем регистр состояния
  test al, 80h ; Проверим сигнал BUSY (<1> - принтер готов)
  jz  loop2   ; если нет, то повторим опрос
  dec dx      ; адрес регистра данных (lpt1_adr)
  mov al, ah  ; Загрузка передаваемого байта в AL
  out dx, al  ; Запись байта в регистр данных
  inc dx
  inc dx      ; адрес регистра управления (lpt1_adr+2)
  in  al, dx  ; Читаем регистр управления
  ; Формируем строб
  and al, 11111110b ; Бит 0 (Strobe):=0
  out dx, al   ; Запись в регистр управления
  or  al, 00000001b ; Бит 0 (Strobe):=1
  out dx, al   ; Запись в регистр управления
  and al, 11111110b ; Бит 0 (Strobe):=0
  out dx, al   ; Запись в регистр управления
  pop dx
 ret     ; выход в основную программу
code ends
end start
тут на ошибку не проверяется, а зря - у меня lpt порт физически отсутствует и бит 3 регистра статуса установлен всегда
2
41 / 39 / 7
Регистрация: 27.05.2010
Сообщений: 252
20.11.2010, 08:34  [ТС] 7
и еще. Будет ли работать ета программа на современных принтерах? Если нет то как осуществить?
0
41 / 39 / 7
Регистрация: 27.05.2010
Сообщений: 252
23.11.2010, 16:14  [ТС] 8
на моем не работает. Ошыбок никаких нет, запускаю прогу, и все, пустое окно, действий от принтера нету. Только когда нажимаю любую кнопочку ( я вставил в конце
Assembler
1
2
xor ah,ah
  int 16h
) и на принтере мигает лампочка данных, опять же действий никаких. Скажите в чем проблема?
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
23.11.2010, 16:36 9
c usb принтерами может не работать. Это же для lpt
0
41 / 39 / 7
Регистрация: 27.05.2010
Сообщений: 252
23.11.2010, 16:41  [ТС] 10
Цитата Сообщение от vital792 Посмотреть сообщение
c usb принтерами может не работать. Это же для lpt
LPT в мну
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
23.11.2010, 16:48 11
тогда не знаю. К сожалению не на чем проверить. Это самый низкий уровень работы с принтером, может попробовать повыше?
0
41 / 39 / 7
Регистрация: 27.05.2010
Сообщений: 252
23.11.2010, 19:08  [ТС] 12
Цитата Сообщение от vital792 Посмотреть сообщение
Это самый низкий уровень работы с принтером
Возможно. Может быть что современные программы используют "высший" уровень общения с принтером. Можеш навести такой пример ?Или как я понимаю это инлайн в С++(для примера)?
0
4165 / 1817 / 216
Регистрация: 06.10.2010
Сообщений: 4,074
23.11.2010, 19:47 13
Под чистым досом попробуй.
0
41 / 39 / 7
Регистрация: 27.05.2010
Сообщений: 252
23.11.2010, 23:10  [ТС] 14
в инете нарыл:

В семействе NT приложение не может работать с портом напрямую и ему придется обращаться через драйвер виртуального устройства VxD.

в этом и весь прикол...

VxD является модель драйвера устройства используется в Microsoft Windows/386, 386 расширенном режиме Windows 3.x и Windows 9x. VxDs иметь доступ к памяти ядра и всех запущенных процессов, а также прямой доступ к аппаратному обеспечению. (перевод Гугл, с вики)
2
Ушел с форума
Автор FAQ
16279 / 7604 / 1065
Регистрация: 11.11.2010
Сообщений: 13,617
24.11.2010, 07:11 15
Лучший ответ Сообщение было отмечено как решение

Решение

Jettard, в случае с портом LPT или COM может -- почитай статью Ещё раз о прямом доступе к аппаратуре
3
0 / 0 / 0
Регистрация: 05.07.2011
Сообщений: 53
17.07.2015, 07:44 16
Всем привет! Я в этой программе не понял следующее:
1. Где конкретно используется строчка сегмента данных "String DB"Test printer",0Dh,0Ah,0" ?
2. ES:[08] это сегмент и смещение базового адреса?
3. Не понимаю что получиться после выполнения этой строчки mov ah,ds:[bx]?
Объясните мне пожалуйста по подробнее!
Заранее спасибо!

Добавлено через 19 часов 17 минут
Тема до сих пор актуальна!
0
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
17.07.2015, 08:31 17
Цитата Сообщение от Rus7am Посмотреть сообщение
2. ES:[08] это сегмент и смещение базового адреса?
В регистре ES сегмент. В данном случае он 40h.
8 - смещение.
Итого это дает адрес 40h:8 = 408h
По этому адресу BIOS хранит значение базового порта LPT1.
К тому-же адресу можно обратиться по другому. Например сделав сегмент 0, а смещение 408h
1
435 / 246 / 43
Регистрация: 05.08.2013
Сообщений: 1,670
18.07.2015, 15:30 18
Ethereal, 40h:8h = 4008h, а не 408h. но не суть.
0
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,047
19.07.2015, 14:41 19
Цитата Сообщение от Мотороллер Посмотреть сообщение
40h:8h = 4008h, а не 408h. но не суть.
Суть. Именно 408h !

Добавлено через 7 минут
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    Model   Tiny
    .Code
    Org 100h
 
Start:  mov ax, 40h
    mov es, ax
    mov bx, es:8
    xor ax, ax
    mov es, ax
    mov cx, es:408h
    mov dx, offset Moto
    cmp bx, cx
    je  _
    mov dx, offset Eth
_:  mov ah, 9
    int 21h
    ret
 
Moto    db  'Мотороллер - тормоз$'
Eth db  'Ethereal - тормоз$'
 
    End Start
Добавлено через 4 минуты
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    Model   Tiny
    .Code
    Org 100h
 
Start:  mov ax, 40h
    mov es, ax
    mov bx, es:8
    xor ax, ax
    mov es, ax
    mov cx, es:4008h
    mov dx, offset Eth
    cmp bx, cx
    je  _
    mov dx, offset Moto
_:  mov ah, 9
    int 21h
    ret
 
Moto    db  'Мотороллер - тормоз$'
Eth db  'Ethereal - тормоз$'
 
    End Start
0
435 / 246 / 43
Регистрация: 05.08.2013
Сообщений: 1,670
20.07.2015, 10:39 20
мб я что-то забыл... по идее физический адрес формируется как сегмент*16 + смещение... ВТФ?
0
20.07.2015, 10:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.07.2015, 10:39
Помогаю со студенческими работами здесь

Не устанавливается драйвер блютуз на ноутбуки Сони Авио PCG 718112V КОД ОШИБКИ 43
Добрый день ребят, подскажите как установить драйвер блютуз на ноутбук , так как уже разные ставил...

Найти ошибки в данной программе (известно что есть только 2 ошибки)
У меня в модуле с програмирования задание: Найти ошибки в данной программе (известно что есть...

Acer Predator Helios 300 PH317-51 (LA-E921P Rev:1B) Не ставится драйвер на чип 1060 Код ошибки 43
На ноутбуке было короткое замыкание на видео-памяти GPU-1060. Дело оказалось в сдвоенном полевом...

Найти ошибки в коде и исправить эти ошибки (Наследование)
Вот в общем 3 файла, изучаю наследование на примере односвязного и двусвязного списков: list.h...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru