Сейчас на форуме: tyns777 (+4 невидимых)

 eXeL@B —› Программирование —› не пойму, что за ошибка
Посл.ответ Сообщение

Ранг: 18.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 20 октября 2010 20:21
· Личное сообщение · #1

Ситуация такая:
код срабатывает каждый раз по разному,
проверял, что находится в памяти, выяснилось, что там вся матрица верна и действительно там присутствует
данный код тестировал в досе, только вместо страничной адресации я использовал сегментную
он действительно работал корректно...
подскажите пожалуйста, в чем может быть проблема
uote



Ранг: 18.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 20 октября 2010 20:22
· Личное сообщение · #2

Code:
  1. ; режим TrueColor32
  2.     ; отрисовка буковки
  3.     xor        ebx, ebx
  4.     or        ebx, 0x00000080        ; устанавливаем 7-й бит
  5.     
  6.     mov        edx, dword ptr video_buffer
  7.     mov        [0x00102000 - 4], edx
  8.     mov        edi, 0x003FF000            ; видеобуфер
  9.     xor        edx, edx            ; переключатель
  10.     
  11.     mov        esi, 0x10000            ; здесь данные, а именно первая буква(битовая матрица)
  12.     
  13.     mov        ecx, 24                ; высота буквы 24 пикселя
  14.     jmp short go
  15. set_new_position:
  16.     or        edx, edx
  17.     jnz        set
  18.     inc        edx                ; переключаем переключатель
  19.     xor        ebx, ebx
  20.     or        ebx, 0x00000080        ; устанавливаем 7-ой бит
  21.     jmp short go
  22. set:
  23.     mov        edx, [0x00102000 - 4]
  24.     add        edx, 0x1000            ; переход на новую строку
  25.     mov        [0x00102000 - 4], edx
  26.     xor        edx, edx            ; обнуляем переключатель
  27.     mov        edi, 0x003FF000            ; указываем на видеобуфер
  28.     xor        ebx, ebx
  29.     or        ebx, 0x00000080        ; устанавливаем 7-ой бит
  30.     dec        ecx                ; сокращаем кол-во шагов
  31.     or        ecx, ecx
  32.     jz        end_of_letter            ; буква отрисована
  33. go:
  34.     xor        eax, eax
  35.     lodsb                        ; достаем из буфера шрифтов 8 бит (1 байт)
  36.     and        eax, 0x000000FF
  37. next_bit:
  38.     cmp        ebx, 0
  39.     je        set_new_position    ; просмотрели все биты ?
  40.     test    eax, ebx            ; проверяем текущий бит
  41.     jz        white_dot        ; если 0, то пусто
  42.     push    eax                ; иначе, устанавливаем пиксель
  43.     mov        eax, 0x00FF0000    ; красный
  44.     stosd                    ; отрисовываем
  45.     pop        eax            ; восстановим значение регистра, т. к. дальше нужно просматривать биты
  46.     shr        ebx, 1            ; следующий бит
  47.     jmp short next_bit
  48. white_dot:
  49.     add        edi, 4            ; просто переходим к следующему пикселю
  50.     shr        ebx, 1            ; следующий бит будем смотреть
  51.     jmp short next_bit
  52. end_of_letter:





Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 20 октября 2010 22:15
· Личное сообщение · #3

Надо чётче формировать задачу, что создаете,
здесь по отрывку кода сложно соориентироваться

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 20 октября 2010 22:19
· Личное сообщение · #4

Hell Knight пишет:
код срабатывает каждый раз по разному,

и в чем это проявляется и как

задание конечно сформулировано бредово)



Ранг: 18.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 20 октября 2010 23:36
· Личное сообщение · #5

изложу корректнее))
пишу свою исследовательскую ОС, включил режим TrueColor32 1024x768
я перешел в защищенный режим и включил страничную адресацию
принялся за разработку планировщика, по ходу дела возникла нужда в отладке,
ну или хотя бы что бы можно было выводить значения регистров на экран (отрисовка)
начал тогда писать процедуру для вывода на экран значения регистра
в коде я постарался всё подробно прокомментировать, что бы вопросов не было

приведенный код: код отрисовки символа по битовой матрице, матрица составлена корректно, тестировал в DOS
1 - рисуем пиксель
0 - ничего не делаем

в конце добавил код для вывода полоски на экране, что бы наглядно просмотреть работу
запускаю это всё добро под виртуальной машиной VMware 7.1
в итоге что получил:
пиксели появляются в области символа (16х24) в верхнем левом углу экрана (как надо)
но они в совокупности не формируют нужный символ, а лишь какой-то беспорядоченный набор точек
причем при помощи проверочной полоски проверял, что иногда проверочная строчка выводилась, не на нужной высоте
т. е. она должна вывестись во вертикале на 24 пикселе, но она рандомно выводится)))

надеюсь я понятно всё изложил




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 21 октября 2010 01:45
· Личное сообщение · #6

я не совсем понял что это
Code:
  1.    mov        edx, dword ptr video_buffer
  2.     mov        [0x00102000 - 4], edx

и почему тогда уже не прямо не брать дальше в коде с dword ptr video_buffer

то что разрешение 1024x768 еще нет гарантии что сканлан там такой какой у вас
Code:
  1. add        edx, 0x1000            ; переход на новую строку

и может быть рассинхронизация

и может быть что глубина цвета другая
тогда там и запись в видео буффер разная будет..

в самой логике вывода пикселя если нет просчетов, то и глюков можно не искать

а почему голый асм?
пишите на С, а асм вставки в самых ответсвенных частях



Ранг: 18.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 21 октября 2010 09:30
· Личное сообщение · #7

дело всё в том, что я использую страничную адресацию
этот раздел памяти отностися к каталогу №0, страница №0x3FF
edi в данном случае как раз указывает на эту страницу
Code:
  1. mov           edx, dword ptr video_buffer
  2. mov           [0x00102000 - 4], edx
  3. mov           edi, 0x003FF000                  ; видеобуфер


далее я просто увеличивал адрес видеобуфера, что бы в таблице страниц был указатель на следующую строку видеобуфера
edi инициализировал заново...
Code:
  1. mov           edx, [0x00102000 - 4]
  2.          add         edx, 0x1000                         ; переход на новую строку
  3.          mov         [0x00102000 - 4], edx
  4.          xor         edx, edx          ; обнуляем переключатель
  5.          mov         edi, 0x003FF000               ; указываем на видеобуфер


я до вывода буквы, сделал вывод фонового изображения...
я взял bmp-файл, вырезал первые 54 байта, получил бинарный файл и вывел его таким же образом
он вывелся хорошо, без всяких аномалий

reversecode пишет:
и может быть рассинхронизацияи может быть что глубина цвета другаятогда там и запись в видео буффер разная будет..в самой логике вывода пикселя если нет просчетов, то и глюков можно не искать

а как это проверить-то ?

reversecode пишет:
а почему голый асм?

еще немного осталось пару деталей доделать, и можно переходить на Си)



Ранг: 18.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 21 октября 2010 13:08
· Личное сообщение · #8

вот, как выглядит моя битовая матрица(массив)
я использую в своем код размер 16х48 бит
принцип таков, я покажу на примере 8х8

[0][0][0][1][1][0][0][0]
[0][1][1][0][0][1][1][0]
[0][1][0][0][0][0][1][0]
[1][0][0][0][0][0][0][1]
[1][0][0][0][0][0][0][1]
[0][1][0][0][0][0][1][0]
[0][1][1][0][0][1][1][0]
[0][0][0][1][1][0][0][0]

считываю байт, получаю первые 8 бит
далее в соответствии установлен или нет, я рисую пиксель или нет
по такому принципу у меня построен вывод символа...
но я только не пойму в чем ошибка

фоновое изображение я выводил так же с помощью видеобуфера, увеличивая после каждых 1024 пикселей
указатель на видеобуфер в таблице страниц на 0x1000 (т. е. 4кб или 4*1024 по 4 байта на пиксель)
и изображение прекрасно отображалось, правда я тодга использовал просто копирование туда данных,
у меня было готово изображение(обработанный bmp-файл)



Ранг: 18.0 (новичок)
Активность: 0.010
Статус: Участник

Создано: 21 октября 2010 13:43
· Личное сообщение · #9

спасибо за внимание
разрешил эту проблему...
нужно было обновлять TLB:
Code:
  1. invlpg [edi]



 eXeL@B —› Программирование —› не пойму, что за ошибка
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати