OSDev

для всех
Текущее время: 09 май 2024, 10:48

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Текстовый вывод
СообщениеДобавлено: 29 ноя 2010, 18:47 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Во-первых, не хамить. А во-вторых, значения помещаются не прямо на шину адреса, а сначала в регистры. А эти самые регистры в ДОСе 16-разрядные (32-разрядные использовать можно, но не для целей адресации в стандартном реальном режиме). Соответственно, 20-разрядная величина использоваться для адресации не может.

Пы.Сы. А прочитать _внимательно_ документацию на процессор, хорошенько изучив, как именно формируется физический адрес в реальном режиме, очень даже стоит.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Текстовый вывод
СообщениеДобавлено: 29 ноя 2010, 20:08 

Зарегистрирован: 29 ноя 2010, 13:07
Сообщения: 6
Уважаемый SII, хотелось бы заметить что для формирования адреса используются два регистра, хоть в реальном режиме, хоть в нереальном. В реальном же режиме адрес получается как регистр сегмента сдвинутый на 4 бита влево + регистр смещения, таким образом заполняется шина на 20 разрядов. о каких 16 идёт речь? я указал 20тибитный адрес значит он должен первые 16 поместить в сегмент а последние 4 в смещение. я понимаю это так.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Текстовый вывод
СообщениеДобавлено: 29 ноя 2010, 20:44 

Зарегистрирован: 29 ноя 2010, 13:07
Сообщения: 6
аналогичная инструкция на ассемблере работает видимо и правда компилятор си неправильно помещает адрес в переменную

Код:
org 100h
push ds
mov  ax, 0xb800
mov ds, ax
mov al, 32
mov ah, 14
mov si,0
mov [ds:si], ax
pop ds
ret 


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Текстовый вывод
СообщениеДобавлено: 29 ноя 2010, 21:02 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
tommi-boy писал(а):
я указал 20тибитный адрес значит он должен первые 16 поместить в сегмент а последние 4 в смещение. я понимаю это так.

Да, но компилятор по умолчанию считает, что адрес является именно смещением и только смещением, а сегмент используется текущий и неизменный. Поэтому у тебя ничего не работает. Для формирования дальнего адреса, в описании указателя нужно использовать атрибут __far. Ещё, адрес скорей всего надо прописывать не одним числом, а двумя (сегмент/смещение), в виде ключевого макроса. Изучай справку, это всё зависит от конкретного компилятора.
При этом модель памяти должна быть как минимум medium.
char __far* video=(char __far*)0xB8000;
char __far* video=(char __far*)MK_FP(0xB800, 0); //Open Watcom C


Последний раз редактировалось Himik 29 ноя 2010, 21:33, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Текстовый вывод
СообщениеДобавлено: 29 ноя 2010, 21:29 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
tommi-boy писал(а):
Уважаемый SII, хотелось бы заметить что для формирования адреса используются два регистра, хоть в реальном режиме, хоть в нереальном. В реальном же режиме адрес получается как регистр сегмента сдвинутый на 4 бита влево + регистр смещения, таким образом заполняется шина на 20 разрядов. о каких 16 идёт речь? я указал 20тибитный адрес значит он должен первые 16 поместить в сегмент а последние 4 в смещение. я понимаю это так.


Понимаете и правильно, и неправильно одновременно. Компилятор никому ничего не должен, если это не прописано явным образом в стандарте языка или в документации на компилятор (если прописано, но не делает -- это ошибка в компиляторе, но если не прописано, то он и не должен делать).

Вы же, похоже, смешиваете два понятия -- указатель и адрес ячейки памяти. На самом деле это разные вещи, только об этом нередко либо забывают, либо вообще не знают (прямое указание на этот факт я находил только в спецификации Ады; правда, там нет указателей в привычном понимании, а есть ссылочные типы, но сути это не меняет). Вы в своей программе задаёте не правильное значение указателя, а обычную 32-разрядную целую константу. То, что Вы её приводите к типу указателя, ещё не означает, что она будет преобразована в него правильным (с Вашей точки зрения) образом -- тут надо изучать документацию на компилятор и стандарт языка (поскольку я Си без крайней надобности не использую, то наизусть этих вещей не знаю).

Во времена ДОС, помнится, значения дальних указателей (т.е. состоящие из пары 16-разрядных значений сегмент:смещение, а не из одного только 16-разрядного смещения, которое использовалось совместно со стандартным значением сегмента данных или кода) задавались в явном виде -- т.е. отдельно сегмент, отдельно смещение; соответственно, компилятору ни о чём думать не приходилось. Как сейчас -- не знаю; как правильно заметил Чиж, надо изучать документацию на конкретный компилятор.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Текстовый вывод
СообщениеДобавлено: 29 ноя 2010, 21:38 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
tommi-boy писал(а):
аналогичная инструкция на ассемблере работает

Такие маленькие программы быстрей и легче написать на Ассемблере. Ведь на разбор с компилятором ЯВУ (и потом ещё оптимизацию) может уйти много времени, а выигрыша это не даст ни какого.


Последний раз редактировалось Himik 29 ноя 2010, 23:21, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Текстовый вывод
СообщениеДобавлено: 29 ноя 2010, 23:16 

Зарегистрирован: 30 янв 2010, 19:44
Сообщения: 63
если конкретно: мб color должен быть не int, а char?
и все равно я бы на твоем месте попробовал бы уже 100500 раз продебагить код.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Текстовый вывод
СообщениеДобавлено: 29 ноя 2010, 23:21 

Зарегистрирован: 28 окт 2007, 18:33
Сообщения: 1418
Не, тут тип не скажется: компилятор будет просто приводить инт к чару, отбрасывая старшую часть. А вот что с дальними указателями так работать нельзя, это факт.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Текстовый вывод
СообщениеДобавлено: 30 ноя 2010, 21:39 

Зарегистрирован: 18 апр 2010, 15:59
Сообщения: 155
1) 32-битный код в ДОС не катит --> юзай 16-битный времен дос (другая одресация другие размеры операндов, другие опкоды)
2) Пиши не подряд а через символ. в видеопамяти на символ приходится 2 байта (0-й собственно код символа, 1-й код рюшечек с которыми нужно выводить символ)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 93


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB