Разыменование C против Ассемблера

Изучение указателей: Можно ли сказать, что оператор звездочки * в C аналогичен круглым скобкам в ассемблере Z80?

Другими словами, имеют ли эти два предложения одинаковое значение:

  LOAD (HL),a;       VS         *HL=a;

3 ответа

Я предлагаю вам не делать таких предположений, потому что они не всегда верны. Хотя то, что вы говорите, может быть правдой в некоторых обстоятельствах, это не может быть обобщено, поэтому я не думаю, что это правильно. Это потому, что C является языком более высокого уровня, чем ассемблер и, следовательно, имеет некоторые абстракции, которых ассемблер не имеет. Что происходит, если указатель указывает на данные, которые не могут поместиться в один регистр? Что происходит, когда указатель на структуру или объединение?

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

Указатель является адресом памяти. В C, когда вы разыменовываете указатель, вы выбираете или сохраняете элемент ссылочного типа с или по адресу, сохраненному в указателе. В С, когда вы выполняете LD (HL), A вы получаете байт с адреса, хранящегося в HL, Таким образом, в этом отношении две вещи тесно связаны.

Тем не менее, скобки используются в ассемблере Z80 непоследовательно, чтобы не быть осмысленным оператором. Например, следующее:

JP (HL)

Это обычный способ выражения операции, которая загружает HL к счетчику программ. Из памяти ничего не извлекается, это просто прямое присваивание - я предполагаю, что запутанный синтаксис возникает потому, что это означает, что то, что находится в HL, будет прочитано в будущем в результате выполнения программы.

В качестве второго примера смотрите:

OUT (C), A

Это хранит байт в A в порт BC, Таким образом, скобки действуют так, что говорят, что то, что находится внутри них, будет читаться или записываться, но то, что находится внутри скобок, является аббревиатурой (технически, потому что оригинальный 8080 выполнял только 8-битную адресацию портов, поэтому Zilog не хотел запутывать вещи).

Конечно. другие примеры (в реальных программах должны быть приведения типов):

LD DE,HL     --      DE=HL
LD DE,(HL)   --      DE=*HL (add typecast: DE=(int *)*HL
LD DE,((HL)) --      DE=**HL (add typecasts: DE=(int *)**(int **)HL
Другие вопросы по тегам