Speccy - наш выбор!

Speccy - наш выбор! (http://zx-pk.ru/index.php)
-   Программирование (http://zx-pk.ru/forumdisplay.php?f=14)
-   -   Сомнительная мнемоника (http://zx-pk.ru/showthread.php?t=15675)

Andrew771 18th April 2011 15:51

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

Titus 18th April 2011 16:12

Quote:

Originally Posted by Andrew771 (Post 377054)
Понадобилась команда 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 18th April 2011 22:34

Quote:

Originally Posted by Titus (Post 377060)
Само взятие регистра в скобки означает, что исполнительный адрес - это ячейка памяти, адресуемая данным регистром.

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

null_device 18th April 2011 22:56

Открывем книгу Родионова-Ларченко на стр. 95 и читаем внизу страницы: Безусловный переход по адресу, содержащемуся в регистре ss. Не смотря на внешиний вид операнда.
----
В книге Микропроцессорный комплект Z80. Книга 1. Центральный процессор Z80 CPU, в пояснении так и обозначено, что в РС заносится значение из регистровой пары HL.

Vadim 19th April 2011 10:16

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

Quote:

Originally Posted by Andrew771 (Post 377054)
Я думал, переход по адресу, имеющемуся в памяти, адресуемой регистром HL.

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

TomCaT 19th April 2011 15:58

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

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

Higgins 19th April 2011 22:29

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

Destr 20th April 2011 03:38

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

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

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

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

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

Чего еще?

Andrew771 21st April 2011 11:51

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

GriV 21st April 2011 13:19

Quote:

Originally Posted by Higgins (Post 377391)
Круглые скобки в синтаксисе инструкций 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 ----------

Quote:

Originally Posted by Destr (Post 377451)
Продолжаем флеймить.

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

Quote:

Originally Posted by Destr (Post 377451)
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), больше нет.


All times are GMT +4. The time now is 05:05.

Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.