Ассемблер и 8088

16-битные ПЦ-совместимые компьютеры с процессорами 8086/8088/80286 работающие под управлением ДОС

Moderator: Shaos

Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Ассемблер и 8088

Post by Tronix »

Дядьки, что то я затупливаю :/
Есть порт, допустим 0x300h.
Если я пишу

Code: Select all

mov dx,300h
in al,dx
то в al получаю значение из порта 0x300h. Это понятно. А что, если я пишу:

Code: Select all

mov dx,300h
in ax,dx
Что я получаю? Ну, в AL положим то же что и раньше, а что в AH? Следующий байт из регистра 0x300h или байт из регистра 0x301h?
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Ассемблер и 8088

Post by Lavr »

Tronix wrote:Ну, в AL положим то же что и раньше, а что в AH? Следующий байт из регистра 0x300h или байт из регистра 0x301h?
Теоретически - да.
Практически всё зависит от того, какой проц и как выполнено это всё аппаратно на конкретной материнской плате.
Т.е. если ты обращаешься через АХ к 8-битному порту, то железных гарантий нет, поскольку как реализовано
обращение к байту, слову и 4-битному слову определяет схемотехника чипов на материнке.

Вообще говоря, есть еще и:

Code: Select all

IN EAX, DX
не хочешь узнать что с ним будет? :wink:

А если подробнее - то посмотри документ: 8086_PROGRAMMED _IO.doc


PS. Если ты, правда, конкретно подчеркиваешь, что именно i8088, то он и IN AX, DX будет делать в 2 захода через 8-битную "глотку"...
iLavr
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Post by Tronix »

Имеется ввиду именно 8088. В том то и дело, что он не делает два захода, а походу в AH помещает значение из соседнего какого-то порта.
То есть
in al,dx
in ah,dx
нефига не равно

Code: Select all

in ax,dx
Mixa64
Doomed
Posts: 481
Joined: 25 Aug 2009 07:02
Location: Москва

Post by Mixa64 »

Tronix wrote:Имеется ввиду именно 8088. В том то и дело, что он не делает два захода, а походу в AH помещает значение из соседнего какого-то порта.
То есть
in al,dx
in ah,dx
нефига не равно

Code: Select all

in ax,dx
Все правильно. Почему же "из соседнего какого-то" ? Не из соседнего какого-то, а просто читает в два приема один 16-битный порт.
А 8086 прочитает 16-битный порт в один прием, если он выровнен на 16 бит (синоним - четный адрес), и в два приема, если его адрес нечетный. В этом смысле 88-му выравнивание по барабану.
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Tronix wrote:Имеется ввиду именно 8088.
То есть у тебя имеется конкретно плата на которой есть реальный i8088?
Ну еще раз говорю - всё зависит от того как из сигналов шины управления
на плате организовали обращение к УВВ.
Если это системная плата - там есть коннекторы ISA16 или только ISA8?
Может получиться, что при in ax,dx он просто считывает байт ерунды из ниоткуда.
Ну и потом:

Code: Select all

in al,dx 
in ah,dx
в принципе неэквивалентно

Code: Select all

in ax,dx
in ah,dx - само по себе вызывает сомнение, а эквивалентно, на мой взгляд, было бы так:

Code: Select all

in al,dx 
xchg ah,al
inc dx
in al,dx 
xchg ah,al
в этом случае, если dx = 300h
то в al - байт из 300h
а в ah - байт из 301h
iLavr
Mixa64
Doomed
Posts: 481
Joined: 25 Aug 2009 07:02
Location: Москва

Post by Mixa64 »

Lavr wrote: in ah,dx - само по себе вызывает сомнение, а эквивалентно, на мой взгляд, было бы так:

Code: Select all

in al,dx 
xchg ah,al
inc dx
in al,dx 
xchg ah,al
в этом случае, если dx = 300h
то в al - байт из 300h
а в ah - байт из 301h
Точно. А в ax при этом 16-бит слово из 300h. Масло масляное, но может прояснит, а может и запутает. :)
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Mixa64 wrote:но может прояснит, а может и запутает. :)
"Правда освобождает!" (с) :lol:
Mixa64 wrote:А 8086 прочитает 16-битный порт в один прием, если он выровнен на 16 бит (синоним - четный адрес), и в два приема, если его адрес нечетный.
Справедливо, если это реализовано в железе на плате. А что за система там с 8088 - я так и не услышал.
Если самодельная, то обращение к УВВ и надо реализовать аппаратно самому.
Я с этим сталкивался, когда сам делал интерфейс IDE, он 16-битный.
iLavr
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Post by Tronix »

Mixa64 wrote:
Lavr wrote: in ah,dx - само по себе вызывает сомнение, а эквивалентно, на мой взгляд, было бы так:

Code: Select all

in al,dx 
xchg ah,al
inc dx
in al,dx 
xchg ah,al
в этом случае, если dx = 300h
то в al - байт из 300h
а в ah - байт из 301h
Точно. А в ax при этом 16-бит слово из 300h. Масло масляное, но может прояснит, а может и запутает. :)
Я не понимаю, как 16-битное слово читается? шина - 8 битная. Соответственно на шине данных не может 16 битное слово быть никак за раз. При in al,порт - все понятно. При in al,dx; xchg al,ah; inc dx; in al,dx то же все понятно. Не понятно с in ax,dx.

Если быть ближе к практике, то я эксперементирую со своим контроллером sd-карт для ISA8. Все работает, когда я читаю из порта байтами (in al,dx), но это медленно (512 раз in al,dx; stosb). Было бы лучше читать из порта словами по 16 бит (256 раз in ax,dx; stosw), и пусть аппаратно все равно два цикла обращения по шине, зато циклов процессора поменьше. Я думал, что когда я делаю in ax,dx мне в AL придет первый байт из порта а в AH второй, но того не происходит. В AL приходит первый байт, но в AH постоянно 0XFF, как будто значение из несуществующего порта. Конкретно это все происходит на ПЭВМ Поиск, но различий при работе с портами между натуральной XT я не замечал (на примере скажем XT-IDE ROM BIOS - этот option ROM работает на Поиске без проблем). Кстати, на примере последнего (XT-IDE) биоса - сначала они тож читали из порта вроде байтами (младшие версии), а потом провели небольшой мод - поменяли местами A3 и A0 адресные линии, и теперь читают словами. И судя по схемотехнике, первый байт читается из 0x300h, а второй из 0x308h или как то так, но суть в том, что in ax,dx читает в al из одного порта, а в ah из другого (первый плюс 1 или плюс два). Для меня это не очевидно нефига.
Mixa64
Doomed
Posts: 481
Joined: 25 Aug 2009 07:02
Location: Москва

Post by Mixa64 »

Tronix wrote: Если быть ближе к практике, то я эксперементирую со своим контроллером sd-карт для ISA8.
А что мешает у своего контроллера сделать так, чтобы данные были доступны по двум адресам I/O, 1100000000b и 1100000001b ?
Для скорости можно и ПДП замутить, заодно и прикольнее гораздо: один раз программно дергаешь, а дальше оно само пересылается.
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Tronix wrote:Для меня это не очевидно нефига.
Разбирайся со схемотехникой "Поиска". Я не знаю как там сделано. И я уже 3-й раз говорю,
что всё работает так, как обеспечивается железом на плате.

8088 - выдает по шине управления сигналы, соответствующие для операций ввода-вывода,
а от того, как эти сигналы у тебя подцеплены к твоим УВВ - и зависит то, что и куда будет
записано или откуда прочитано.
Это понятно?
iLavr
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Post by Tronix »

Mixa64 wrote:
Tronix wrote: Если быть ближе к практике, то я эксперементирую со своим контроллером sd-карт для ISA8.
А что мешает у своего контроллера сделать так, чтобы данные были доступны по двум адресам I/O, 1100000000b и 1100000001b ?
Для скорости можно и ПДП замутить, заодно и прикольнее гораздо: один раз программно дергаешь, а дальше оно само пересылается.
Не мешает ничего (кроме усложнения схемы). Так то можно и вообще окно в 64 кб сделать в памяти, и сразу 64кб данных перебрасывать. Но речь не о том, а о том, что я думал раньше что при in ax,dx на адресе выставляется только dx два раза. А оно походу не так, а с инкрементом. С каким тоже не ясно пока - толи dx+1, толи dx+2.
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

Tronix wrote: я думал раньше что при in ax,dx на адресе выставляется только dx два раза. А оно походу не так, а с инкрементом. С каким тоже не ясно пока - толи dx+1, толи dx+2.
Неправильно ты думал. И я уже объяснять устал. В железе - может быть просто
"кросс-регистр" со старшей половины - в младшую.
Тогда всё запросто читается по одному адресу DX, но двумя обращениями.
Во втором обращении "кросс-регистр" или "косой регистр" перенаправляет
на 8-битную шину старший разряд слова.

Но я еще раз - НЕ ЗНАЮ, КАК ЭТО СДЕЛАНО ТАМ У ТЕБЯ.
iLavr
Mixa64
Doomed
Posts: 481
Joined: 25 Aug 2009 07:02
Location: Москва

Post by Mixa64 »

Tronix wrote:я думал раньше что при in ax,dx на адресе выставляется только dx два раза.
С такой логикой при mov ax, [si] на адресе два раза si выставится
А оно походу не так, а с инкрементом. С каким тоже не ясно пока - толи dx+1, толи dx+2.
При mov ax, [si] с каким инкрементом, si+1 или si+2?
Tronix
Doomed
Posts: 662
Joined: 18 Nov 2013 02:38
Location: Москва

Post by Tronix »

Ааааа, ну так то да...
User avatar
Lavr
Supreme God
Posts: 16689
Joined: 21 Oct 2009 08:08
Location: Россия

Post by Lavr »

А то! :lol: Но ващщет это всё написано вот в этом документе:
Lavr wrote:посмотри документ: 8086_PROGRAMMED _IO.doc...
Подробно и с картинками, правда, на английском, но, на мой взгляд,
довольно простым языком...
iLavr