PDA

Просмотр полной версии : Сомнительная мнемоника



Andrew771
18.04.2011, 14:51
Понадобилась команда jp (hl). Оказалось, действие у нее не соответствует мнемонике, ИМХО. Я думал, переход по адресу, имеющемуся в памяти, адресуемой регистром HL. А оказалось - переход по адресу, значение которого в регистре HL. Дык тогда должно быть jp hl (без скобок). Аналогично с jp(ix) и jp(iy).
Кто что думает?

Titus
18.04.2011, 15:12
Понадобилась команда jp (hl). Оказалось, действие у нее не соответствует мнемонике, ИМХО. Я думал, переход по адресу, имеющемуся в памяти, адресуемой регистром HL. А оказалось - переход по адресу, значение которого в регистре HL. Дык тогда должно быть jp hl (без скобок). Аналогично с jp(ix) и jp(iy).
Кто что думает?
Так обозначается переходы во многих архитектурах. Пример в DEC-архитектуре (PDP-11): jmp (R0); или на 680x0 аналогично.

Само взятие регистра в скобки означает, что исполнительный адрес - это ячейка памяти, адресуемая данным регистром. А уж что делать с исполнительным адресом, взять из него операнд или перейти по исполнительному адресу - это зависит от команды. Поэтому и получается, что jmp (hl) - это получить исполнительный адрес равный HL, и перейти по нему. А в команде LD (ix+00),a - получить исполнительный адрес равный ix+00, и занести в эту ячейку регистр а.

Andrew771
18.04.2011, 21:34
Само взятие регистра в скобки означает, что исполнительный адрес - это ячейка памяти, адресуемая данным регистром.
Вот-вот. Т.е., в HL должна содержаться ссылка на ячейку памяти, по которой должен происходить переход в команде jp (hl). А в реале переход происходит по самому значению в HL, а не по адресуемой им ячейке памяти. :v2_wacko:

null_device
18.04.2011, 21:56
Открывем книгу Родионова-Ларченко (http://vtrdos.ru/book/ZX_TRDOS.ZIP) на стр. 95 и читаем внизу страницы: Безусловный переход по адресу, содержащемуся в регистре ss. Не смотря на внешиний вид операнда.
----
В книге Микропроцессорный комплект Z80. Книга 1. Центральный процессор Z80 CPU, в пояснении так и обозначено, что в РС заносится значение из регистровой пары HL.

Vadim
19.04.2011, 09:16
А в i8080 команда записывалась иначе. PCHL т.е. поместить в регистр PC содержимое HL (хотя по их же логике команда должна была иметь вид mov pc,hl). И написание Интела и Зайлога кривое. Скобки указывают на косвенную адресацию, и уж понятно, что если бы команда писалась как JP HL, то это _не_ означало бы запустить команду записанную в HL. Это бессмысленно. Т.е. JP HL означало бы переход на адрес который лежит в HL, а JP (HL) то, что


Я думал, переход по адресу, имеющемуся в памяти, адресуемой регистром HL.

Но есть так, как есть.

TomCaT
19.04.2011, 14:58
Мне запись мнемоники тоже очень не нравилась. Если бы писали JP (#8000) или JP (METKA1) - тогда другое дело.

Но дело все в том, что во время установки мнемоники таких крутых команд, как перейти по адресу, хранящемуся в памяти, было не густо. А теперь мнемоника путает. Но это 100% PC<-HL .

Higgins
19.04.2011, 21:29
Круглые скобки в синтаксисе инструкций z80 добавляют проблем и в случаях с непосредственными операндами. Причем, если в случае JP (HL) это только вопрос формы записи (поскольку нет такой же инструкции без скобок), то с непосредственными операндами это порождает неоднозначность там, где допускаются круглые скобки в их математическом значении. Например, запись LD A, (0) может быть понята (и пользователем, и ассемблером) либо как инструкция вида LD A, #nn либо как инструкция вида LD A, (#nnnn).

Destr
20.04.2011, 02:38
Продолжаем флеймить.

JP (HL) - это по сути LD PC,HL

Но с регпарой PC нет мнемоник вот и отплевались на JP (HL).
Не заморачиваясь особо на интерпритацию и т.д.

Если бы-была ДОСТАТОЧНО БОЛЬШАЯ группа таких команд (ну скажем CALL HL, да еще с учитыванием флагов или например DJNZ HL) - это другое дело...)

А так - чего спорить?
Ну есть одна команда которая не слишком по правилам в мнемонический ряд попадает...
Но она однозначна.
И она работает.

Чего еще?

Andrew771
21.04.2011, 10:51
Хотя, если посмотреть с другой стороны, то получается переход на ячейку памяти, указанной в hl. И тогда вроде логичное обозначение jp (hl). Но тогда бы по логике и с простыми адресами нужно было писать не jp metka, а jp (metka).
Скорее всего, тут психология: когда мы видим hl в скобках, то мысленно связываем с тем, что лежит в ячейке по адресу hl, т.е. с данными, а не с кодом, на который можно перейти. :)

GriV
21.04.2011, 12:19
Круглые скобки в синтаксисе инструкций z80 добавляют проблем и в случаях с непосредственными операндами. Причем, если в случае JP (HL) это только вопрос формы записи (поскольку нет такой же инструкции без скобок), то с непосредственными операндами это порождает неоднозначность там, где допускаются круглые скобки в их математическом значении. Например, запись LD A, (0) может быть понята (и пользователем, и ассемблером) либо как инструкция вида LD A, #nn либо как инструкция вида LD A, (#nnnn).

(mem) - это всегда чтение из памяти по адресу mem для мнемоник Z80.
Соотвественно LD A,(0) - это чтение нулевой ячейки памяти и только оно.
a JP (HL) - это действительно команда с несоотвествием общему формальному признаку, правильнее бы её действительно было назвать LD PC,HL (хотя бы судя по тому, что есть LD SP,HL). Предлагаю просто смириться с этим фактом :-) Или потребовать у разработчиков АСМов для Z80 поддержки эквивалентной записи LD PC,HL для тех, кого смущает JP (HL).

---------- Post added at 12:19 ---------- Previous post was at 12:14 ----------


Продолжаем флеймить.

Вот этого не надо :-)


JP (HL) - это по сути LD PC,HL

Но с регпарой PC нет мнемоник вот и отплевались на JP (HL).
Не заморачиваясь особо на интерпритацию и т.д.

Если бы-была ДОСТАТОЧНО БОЛЬШАЯ группа таких команд (ну скажем CALL HL, да еще с учитыванием флагов или например DJNZ HL) - это другое дело...)

Есть куча инструкций с неявной записью в мнемонике регистра PC - это команды JP|JR которые можно трактовать как LD PC,.... для JP и ADD PC,... для JR, причём они могут изменять содержимое PC по условию, чего нет ни для одной другой команды.
Переход по регистру - это только JP (HL,IX,IY), больше нет.

Antipod
25.05.2011, 11:49
Вот-вот. Т.е., в HL должна содержаться ссылка на ячейку памяти, по которой должен происходить переход в команде jp (hl). А в реале переход происходит по самому значению в HL, а не по адресуемой им ячейке памяти. :v2_wacko:

HL - это и есть адрес ячейки памяти ( эээ, во внутрях процессора ). Поэтому, если рассматривать HL именно как адрес, запись jp (hl) имеет смысл - перейти на адрес, который лежит в регистре HL. С той же точки зрения jp label имеет смысл, поскоку label по сути является циферкой для компилятора, а не названием места, где лежит это значение %)

breeze
25.05.2011, 14:02
…мнемоника путает.

Честно скажу, сколько пишу под Z80 (а это больше 20 лет) никогда не возникало путаницы, сразу запомнил что это безусловный переход на HL. А вот что действительно периодически заставляет заглядывать в «методичку», так это какие команды влияют на какие флаги :rolleyes:

Andrew771
25.05.2011, 15:08
Поэтому, если рассматривать HL именно как адрес, запись jp (hl) имеет смысл - перейти на адрес, который лежит в регистре HL.
Тогда однозначно должно быть jp hl - переход по адресу, который содержится в HL, а не jp (hl). Как и jp metka, а не jp (metka).
А jp (hl), по логике, должен быть переход по адресу, содержащимся в ячейке с адресом hl.

---------- Post added at 15:08 ---------- Previous post was at 15:07 ----------

В других же командах, если пишем (hl), подразумеваем ячейку памяти, адресуемой hl, а не само значение в hl. :)

DimkaM
25.05.2011, 17:09
значит так.
В случае работы с регистрами LD меняем на MOV "mov b,c".
При работе с памятью используем LD и ST "LD a,0xABCD ST hl,c".
И расширить набор регистров хотя бы до буквы "Q".(шутка)

Я когда первый раз столкнулся с avr, ужаснулся, но потом понял что даже удобней.

TomCaT
27.05.2011, 00:52
…мнемоника путает.

Честно скажу, сколько пишу под Z80 (а это больше 20 лет) никогда не возникало путаницы, сразу запомнил что это безусловный переход на HL. А вот что действительно периодически заставляет заглядывать в «методичку», так это какие команды влияют на какие флаги

Да я-то тоже без проблем воспринимаю запись, мнемоника может путать в принципе. Опять же, путает по большей части благодаря другим процессорам с более перегруженными командами, которые могут и адрес перехода брать из памяти по адресу, который уже в регистре (а то и по адресу, вычисляемому как целое уравнение с регистрами :v2_dizzy_christmas2).
Типа JP на IBM-процессорах ведь будет переходить не к командам по адресу в BX, а к команадам по адресу, лежащему по адресу, который хранится в BX. Адрес в памяти. И соответсвенно, JP BX - дает переход на команды по адресу из BX.
А раз, опять же, таких команд, которые берут адреса по адресу :) не было в принципе во время оно, то вопроса, как правильно, JP (HL) или JP HL - не возникало. Визуально запись (HL) была привычнее, вот и прижилась. Хотя тогда честнее было бы писать все команды JP со скобками, JP (#0000), JP (METKA1).
А путаться негде, так как:
[B]JP (HL) не несет неоднозначности, т.к. нет таких возможностей одной командой пересылать два байта, адресуемые не прямо адресом, а содержимым регистра - (HL) во всех командах означает только один байт по адресу в HL.
JP HL, если бы было так принято, тем более вряд ли бы смущало двойным смыслом, потому что переход все равно будет в память (хоть HL и без скобок), естественно по адресу из регистра, во всяком случае ассемблеры не любят меток HL, DE, BC... и спутать с меткой тоже не удастся.

HardWareMan
27.05.2011, 13:35
Я думал, переход по адресу, имеющемуся в памяти, адресуемой регистром HL.
Рассуждения ПЦшника. :3
http://s010.radikal.ru/i314/1103/bc/d673347a52f0.jpg
На i8080/Z80 нет же указателей, есть только адреса. Что касается:

А оказалось - переход по адресу, значение которого в регистре HL. Дык тогда должно быть jp hl (без скобок). Аналогично с jp(ix) и jp(iy).
Я согласен. Потому как 0E9h - это же implied, а не indirect...

С той же точки зрения jp label имеет смысл, поскоку label по сути является циферкой для компилятора, а не названием места, где лежит это значение %)
Неверно. jp label - это absolute (расширенная версия immediate, так как операнд в теле команды, но не сама команда, и является абсолютным адресом). Понимать надо.

TomCaT
28.05.2011, 21:59
Так обозначается переходы во многих архитектурах. Пример в DEC-архитектуре (PDP-11): jmp (R0); или на 680x0 аналогично.

Само взятие регистра в скобки означает, что исполнительный адрес - это ячейка памяти, адресуемая данным регистром. А уж что делать с исполнительным адресом, взять из него операнд или перейти по исполнительному адресу - это зависит от команды. Поэтому и получается, что jmp (hl) - это получить исполнительный адрес равный HL, и перейти по нему. А в команде LD (ix+00),a - получить исполнительный адрес равный ix+00, и занести в эту ячейку регистр а.

Кстати, немного вот подумал над этим утверждением, и мне показалось, что эти случаи плохо сравнимы, и вот почему.

1) Когда в команде, скажем, LD (ix+00),a указывается в скобках выражение для получения исполнительного адреса, то на самом деле этот адрес играет вспомогательную роль при выполнении команды - содержимое регистра A помещается здесь по адресу, равному содержимому IX плюс 0. Но сам по себе регистр IX не изменяется, и по выполнении команды его содержимое не окажется ни в одном регистре, ни в ячейках памяти. Он ПОМОГАЕТ выполнению команды, его содержимое используется для определения операнда-приемника (ячейки памяти), но само содержимое IX не участвует в выполняемом действии копирования содержимого регистра в память.

2) А вот в команде LD SP, HL содержимое регистра HL в итоге окажется в другом регистре SP. И тут все понятно, скобок нет.

3) В команде JP <метка> операнд, который всегда пишется без скобок, прямо помещается в регистр PC, как если бы команда была записана в виде LD PC, <метка>.

4) Поэтому, т.к. в результате команды JP (HL) операнд играет отнюдь НЕ вспомогательное значение - содержимое HL при выполнению команды так же прямо помещается в PC, как если бы использовалась мнемоника LD PC, HL, закономерность записи со скобками нарушается.

Более того, "вспомогательное" употребление того, что записано в скобках, прослеживается во всех командах Z80. Кроме JP (HL), JP (IX), JP (IY). Вот поэтому и кажется странной запись со скобками.

Естественно, как я уже говорил, запись мнемоники в указанных архитектурах не имела принципиального значения, когда сложных команд косвенной адресации 16-битного числа вообще не было в 8-битных процессорах. И те, кто ее использовал (и использует), просто привыкают к записи. А на тех процессорах, где такая адресация возможна, естественно, JMP никто не воспринимает, как LD PC, BX.

К тому же, мнемоника для Z80 используется и описывается в таком виде повсеместно, поэтому не заменять же ее на [B]JP HL :) .

P.S.: Как вариант, может, просто поддерживать мнемонику JP HL/IX/IY в ассемблерах, наравне с действующей JP (HL/IX/IY) - для обозначения одного и того же кода. Может, приживется?.. Хотя, если еще подумать, тех, кто осваивает ассемблер Z80, такой ход запутает еще больше. :(


Предлагаю просто смириться с этим фактом :-) Или потребовать у разработчиков АСМов для Z80 поддержки эквивалентной записи LD PC,HL для тех, кого смущает JP (HL).

...хмм, на самом деле, параллельная поддержка команды LD PC,HL даже лучше, чем параллельная поддержка JP HL вместе с JP (HL) для кода #E9. Так путаницы не возникает. Я за, только подписей нужно еще очень много ;) .

Titus
28.05.2011, 23:23
jmp $1234 - точка назначения - адрес $1234
jmp hl - точка назначения - регистровая пара hl, уходим в нее и офигеваем
jmp (hl) - точка назначения - адрес, находящийся в hl

Andrew771
29.05.2011, 20:59
jmp (hl) - точка назначения - адрес, находящийся в hl
ага, или адрес находящийся в (hl) ? :)

jerri
29.05.2011, 23:52
хватит уже сопли жевать :) чо вы эту тему то апаете?

Protom
30.05.2011, 00:39
ага, или адрес находящийся в (hl) ? :)

Тогда было jp ((hl))

iceoflame
02.06.2011, 10:23
jmp $1234 - точка назначения - адрес $1234
jmp hl - точка назначения - регистровая пара hl, уходим в нее и офигеваем
jmp (hl) - точка назначения - адрес, находящийся в hl

ld hl, $1234
jmp hl попадаем на $1234


ld (hl),$1234
jmp (hl) попадаем на $1234

Судя по доке
ld hl,$1234
jmp (hl) попадаем на $1234 --- Обломс



-- добавил пример, что бы понятнее было

JP адрес.
Как только эта команда встретится в программе, в регистр
счетчика команд PC микропроцессора запишется значение указанного
адреса. Таким образом, следующей командой, которую будет выполнять
микропроцессор вслед за командой JP, будет команда, код операции
которой записан в ячейке с этим адресом.
Безусловную передачу управления можно произвести также при
помощи команд
JP (HL), JP (IX) , JP (IY),
в результате выполнения которых происходит передача управления по
адресу, хранящемуся соответственно в регистровой паре HL, IX или
IY .



МИНИСТЕРСТВО ВЫСШЕГО И СРЕДНЕГО СПЕЦИАЛЬНОГО ОБРАЗОВАНИЯ
РСФСР
Дальневосточный государственный университет
И.И.Бочаров
К.И.Фахрутдинов
Программирование на языке ассемблера Z80
Владивосток, 1990
ОГЛАВЛЕНИЕ

Protom
02.06.2011, 11:24
ld hl, $1234
jmp hl попадаем на $1234

Неверно, нет такой команды jmp hl



ld (hl),$1234
jmp (hl) попадаем на $1234

Неверно, нада сперва знать што содержать регистр HL, тогда будет и видно где пригает :)



Судя по доке
ld hl,$1234
jmp (hl) попадаем на $1234 --- Обломс

Верно. jmp (hl) это как "делать" ld pc,hl

Доки иногда врут. Читай http://www.z80.info/zip/z80cpu_um.pdf