![]() |
Сомнительная мнемоника
Понадобилась команда jp (hl). Оказалось, действие у нее не соответствует мнемонике, ИМХО. Я думал, переход по адресу, имеющемуся в памяти, адресуемой регистром HL. А оказалось - переход по адресу, значение которого в регистре HL. Дык тогда должно быть jp hl (без скобок). Аналогично с jp(ix) и jp(iy).
Кто что думает? |
Quote:
Само взятие регистра в скобки означает, что исполнительный адрес - это ячейка памяти, адресуемая данным регистром. А уж что делать с исполнительным адресом, взять из него операнд или перейти по исполнительному адресу - это зависит от команды. Поэтому и получается, что jmp (hl) - это получить исполнительный адрес равный HL, и перейти по нему. А в команде LD (ix+00),a - получить исполнительный адрес равный ix+00, и занести в эту ячейку регистр а. |
Quote:
|
Открывем книгу Родионова-Ларченко на стр. 95 и читаем внизу страницы: Безусловный переход по адресу, содержащемуся в регистре ss. Не смотря на внешиний вид операнда.
---- В книге Микропроцессорный комплект Z80. Книга 1. Центральный процессор Z80 CPU, в пояснении так и обозначено, что в РС заносится значение из регистровой пары HL. |
А в i8080 команда записывалась иначе. PCHL т.е. поместить в регистр PC содержимое HL (хотя по их же логике команда должна была иметь вид mov pc,hl). И написание Интела и Зайлога кривое. Скобки указывают на косвенную адресацию, и уж понятно, что если бы команда писалась как JP HL, то это _не_ означало бы запустить команду записанную в HL. Это бессмысленно. Т.е. JP HL означало бы переход на адрес который лежит в HL, а JP (HL) то, что
Quote:
|
Мне запись мнемоники тоже очень не нравилась. Если бы писали JP (#8000) или JP (METKA1) - тогда другое дело.
Но дело все в том, что во время установки мнемоники таких крутых команд, как перейти по адресу, хранящемуся в памяти, было не густо. А теперь мнемоника путает. Но это 100% PC<-HL . |
Круглые скобки в синтаксисе инструкций z80 добавляют проблем и в случаях с непосредственными операндами. Причем, если в случае JP (HL) это только вопрос формы записи (поскольку нет такой же инструкции без скобок), то с непосредственными операндами это порождает неоднозначность там, где допускаются круглые скобки в их математическом значении. Например, запись LD A, (0) может быть понята (и пользователем, и ассемблером) либо как инструкция вида LD A, #nn либо как инструкция вида LD A, (#nnnn).
|
Продолжаем флеймить.
JP (HL) - это по сути LD PC,HL Но с регпарой PC нет мнемоник вот и отплевались на JP (HL). Не заморачиваясь особо на интерпритацию и т.д. Если бы-была ДОСТАТОЧНО БОЛЬШАЯ группа таких команд (ну скажем CALL HL, да еще с учитыванием флагов или например DJNZ HL) - это другое дело...) А так - чего спорить? Ну есть одна команда которая не слишком по правилам в мнемонический ряд попадает... Но она однозначна. И она работает. Чего еще? |
Хотя, если посмотреть с другой стороны, то получается переход на ячейку памяти, указанной в hl. И тогда вроде логичное обозначение jp (hl). Но тогда бы по логике и с простыми адресами нужно было писать не jp metka, а jp (metka).
Скорее всего, тут психология: когда мы видим hl в скобках, то мысленно связываем с тем, что лежит в ячейке по адресу hl, т.е. с данными, а не с кодом, на который можно перейти. :) |
Quote:
Соотвественно 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:
Quote:
Переход по регистру - это только 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.