nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 06:37



Reply to topic  [ 16 posts ]  Go to page 1, 2  Next
Ассемблер и 8088 
Author Message
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Дядьки, что то я затупливаю :/
Есть порт, допустим 0x300h.
Если я пишу
Code:
mov dx,300h
in al,dx

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


Что я получаю? Ну, в AL положим то же что и раньше, а что в AH? Следующий байт из регистра 0x300h или байт из регистра 0x301h?


02 Apr 2014 10:04
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Tronix wrote:
Ну, в AL положим то же что и раньше, а что в AH? Следующий байт из регистра 0x300h или байт из регистра 0x301h?

Теоретически - да.
Практически всё зависит от того, какой проц и как выполнено это всё аппаратно на конкретной материнской плате.
Т.е. если ты обращаешься через АХ к 8-битному порту, то железных гарантий нет, поскольку как реализовано
обращение к байту, слову и 4-битному слову определяет схемотехника чипов на материнке.

Вообще говоря, есть еще и:
Code:
IN EAX, DX

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

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


PS. Если ты, правда, конкретно подчеркиваешь, что именно i8088, то он и IN AX, DX будет делать в 2 захода через 8-битную "глотку"...

_________________
iLavr


02 Apr 2014 11:16
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Post 
Имеется ввиду именно 8088. В том то и дело, что он не делает два захода, а походу в AH помещает значение из соседнего какого-то порта.
То есть
Quote:
in al,dx
in ah,dx

нефига не равно
Code:
in ax,dx


02 Apr 2014 21:55
Profile
Doomed

Joined: 25 Aug 2009 07:02
Posts: 459
Location: Москва
Reply with quote
Post 
Tronix wrote:
Имеется ввиду именно 8088. В том то и дело, что он не делает два захода, а походу в AH помещает значение из соседнего какого-то порта.
То есть
Quote:
in al,dx
in ah,dx

нефига не равно
Code:
in ax,dx

Все правильно. Почему же "из соседнего какого-то" ? Не из соседнего какого-то, а просто читает в два приема один 16-битный порт.
А 8086 прочитает 16-битный порт в один прием, если он выровнен на 16 бит (синоним - четный адрес), и в два приема, если его адрес нечетный. В этом смысле 88-му выравнивание по барабану.


03 Apr 2014 03:04
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Tronix wrote:
Имеется ввиду именно 8088.

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

в принципе неэквивалентно
Code:
in ax,dx

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

в этом случае, если dx = 300h
то в al - байт из 300h
а в ah - байт из 301h

_________________
iLavr


03 Apr 2014 03:19
Profile
Doomed

Joined: 25 Aug 2009 07:02
Posts: 459
Location: Москва
Reply with quote
Post 
Lavr wrote:
in ah,dx - само по себе вызывает сомнение, а эквивалентно, на мой взгляд, было бы так:
Code:
in al,dx
xchg ah,al
inc dx
in al,dx
xchg ah,al

в этом случае, если dx = 300h
то в al - байт из 300h
а в ah - байт из 301h

Точно. А в ax при этом 16-бит слово из 300h. Масло масляное, но может прояснит, а может и запутает. :)


03 Apr 2014 03:51
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Mixa64 wrote:
но может прояснит, а может и запутает. :)

"Правда освобождает!" (с) :lol:
Mixa64 wrote:
А 8086 прочитает 16-битный порт в один прием, если он выровнен на 16 бит (синоним - четный адрес), и в два приема, если его адрес нечетный.

Справедливо, если это реализовано в железе на плате. А что за система там с 8088 - я так и не услышал.
Если самодельная, то обращение к УВВ и надо реализовать аппаратно самому.
Я с этим сталкивался, когда сам делал интерфейс IDE, он 16-битный.

_________________
iLavr


03 Apr 2014 04:20
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Post 
Mixa64 wrote:
Lavr wrote:
in ah,dx - само по себе вызывает сомнение, а эквивалентно, на мой взгляд, было бы так:
Code:
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 или плюс два). Для меня это не очевидно нефига.


03 Apr 2014 04:34
Profile
Doomed

Joined: 25 Aug 2009 07:02
Posts: 459
Location: Москва
Reply with quote
Post 
Tronix wrote:
Если быть ближе к практике, то я эксперементирую со своим контроллером sd-карт для ISA8.

А что мешает у своего контроллера сделать так, чтобы данные были доступны по двум адресам I/O, 1100000000b и 1100000001b ?
Для скорости можно и ПДП замутить, заодно и прикольнее гораздо: один раз программно дергаешь, а дальше оно само пересылается.


03 Apr 2014 05:09
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Tronix wrote:
Для меня это не очевидно нефига.

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

8088 - выдает по шине управления сигналы, соответствующие для операций ввода-вывода,
а от того, как эти сигналы у тебя подцеплены к твоим УВВ - и зависит то, что и куда будет
записано или откуда прочитано.
Это понятно?

_________________
iLavr


03 Apr 2014 05:15
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Post 
Mixa64 wrote:
Tronix wrote:
Если быть ближе к практике, то я эксперементирую со своим контроллером sd-карт для ISA8.

А что мешает у своего контроллера сделать так, чтобы данные были доступны по двум адресам I/O, 1100000000b и 1100000001b ?
Для скорости можно и ПДП замутить, заодно и прикольнее гораздо: один раз программно дергаешь, а дальше оно само пересылается.


Не мешает ничего (кроме усложнения схемы). Так то можно и вообще окно в 64 кб сделать в памяти, и сразу 64кб данных перебрасывать. Но речь не о том, а о том, что я думал раньше что при in ax,dx на адресе выставляется только dx два раза. А оно походу не так, а с инкрементом. С каким тоже не ясно пока - толи dx+1, толи dx+2.


03 Apr 2014 05:17
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
Tronix wrote:
я думал раньше что при in ax,dx на адресе выставляется только dx два раза. А оно походу не так, а с инкрементом. С каким тоже не ясно пока - толи dx+1, толи dx+2.

Неправильно ты думал. И я уже объяснять устал. В железе - может быть просто
"кросс-регистр" со старшей половины - в младшую.
Тогда всё запросто читается по одному адресу DX, но двумя обращениями.
Во втором обращении "кросс-регистр" или "косой регистр" перенаправляет
на 8-битную шину старший разряд слова.

Но я еще раз - НЕ ЗНАЮ, КАК ЭТО СДЕЛАНО ТАМ У ТЕБЯ.

_________________
iLavr


03 Apr 2014 05:27
Profile
Doomed

Joined: 25 Aug 2009 07:02
Posts: 459
Location: Москва
Reply with quote
Post 
Tronix wrote:
я думал раньше что при in ax,dx на адресе выставляется только dx два раза.

С такой логикой при mov ax, [si] на адресе два раза si выставится
Quote:
А оно походу не так, а с инкрементом. С каким тоже не ясно пока - толи dx+1, толи dx+2.

При mov ax, [si] с каким инкрементом, si+1 или si+2?


03 Apr 2014 06:14
Profile
Doomed

Joined: 18 Nov 2013 02:38
Posts: 662
Location: Москва
Reply with quote
Post 
Ааааа, ну так то да...


03 Apr 2014 07:03
Profile
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Post 
А то! :lol: Но ващщет это всё написано вот в этом документе:
Lavr wrote:
посмотри документ: 8086_PROGRAMMED _IO.doc...

Подробно и с картинками, правда, на английском, но, на мой взгляд,
довольно простым языком...

_________________
iLavr


03 Apr 2014 08:11
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 16 posts ]  Go to page 1, 2  Next

Who is online

Users browsing this forum: No registered users and 6 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.