学习指点:C 中的星号运算符 * 可以说类似于 Z80 汇编器中的括号吗?
换句话说,这两个句子是否具有相似的含义:
LOAD (HL),a; VS *HL=a;
我建议你不要做出这样的假设,因为它们并不总是正确的。虽然你说的在某些情况下可能是真的,但这不能一概而论,所以我认为它是不正确的。这是因为 C 是一种比汇编更高级别的语言,因此具有一些汇编所没有的抽象。如果指针指向的数据不能放入一个寄存器会发生什么?当指针指向结构或联合时会发生什么?
我建议您使用编译器检查为不同指针类型生成的程序集并自己查看。
指针是内存地址。在 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