[an error occurred while processing this directive]
|
Простарнство адресов ввода/вывода точно такое же как и пространство памяти.
Так как обмен по PCI стандартно 32 битный, то при записи в порт
или в память всегда выставляется адрес кратный 4(как SM уже сказал)
Ножки A0 и A1 всегда в нуле.
[pre]
Если адрес порта тоже кратен 4 то данные попадают в D[7..0]
Если остаток от деления на 4 равен 1 то в D[15..8].
2 - соответственно D[23..16].
3 - соответственно D[31..24].
Для того чтобы карточка разобралась куда идет запись, и существуют
биты выбора байта.
Если используется команда "out dx,ax" и при этом адрес(число в DX ) оканчивается на 11 в двоичном выражении, то будут сформированы два
цикла.
Вначале записан al, который попадет в D[31..24],
затем ah, который попадет в D[7..0]
Что будет похоже на следующий ассемблерный код
out dx,al
mov al,ah
inc dx
out dx,al
При команде "out dx, eax" также возможна подобная ситуация.
Для предотвращения этих ситуаций, базовый адрес выдаваемый BIOS
всегда кратен 4 (PCI 2.1 стр 196).
Таким образом, чтобы данные попали в старшие разряды(автор вопроса подразумевал D31..D24?) нужно обращатся командой
out DX,AX
При этом DX должен иметь адрес оканчивающийся на 10 в двоичной ситеме.
Или "out DX, EAX" (в dx адрес оканчивающийся на 00).
При этом в старшие разряды попадет старшая половина EAX.
[/pre]
E-mail: info@telesys.ru