【问题标题】:Dereferencing C vs Assembler取消引用 C 与汇编程序
【发布时间】:2013-07-25 07:33:16
【问题描述】:

学习要点:我们可以说C中的星号运算符*类似于Z80汇编程序中的括号吗?

也就是说,这两个句子的意思是否相似:

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

【问题讨论】:

  • 汇编程序本身没有“运算符”,但您通常走在正确的轨道上。我会调用(HL) 一个内存操作数,它对应于取消引用C 中的一个指针。
  • 哇!!! Z80总成!我在 80 年代研究过!现在还用吗?
  • 是的,许多国家的许多固定电话仍然基于 z80/81
  • @hivert:实际上,8 位 CPU 在数量上仍然远远超过 16、32 和 64 位 CPU,以销售数量衡量。 ;-)
  • @DevSolar 想获得关于这最后一条语句的参考 :)

标签: c assembly z80


【解决方案1】:

我建议您不要做出这样的假设,因为它们并不总是正确的。尽管您所说的在某些情况下可能是正确的,但这不能一概而论,因此我认为它不正确。这是因为 C 是一种比汇编更高级的语言,因此具有一些汇编所没有的抽象。如果指针指向的数据不能放入一个寄存器会发生什么?当指针指向结构或联合时会发生什么?

我建议你使用你的编译器检查为不同指针类型生成的程序集并自己查看。

【讨论】:

    【解决方案2】:

    指针是内存地址。在 C 中,当您取消引用指针时,您从指针中存储的地址获取或存储引用类型的项目。在 C 中,当您执行 LD (HL), A 时,您会从存储在 HL 中的地址中获取一个字节。所以在这方面,这两件事是密切相关的。

    然而,括号在 Z80 汇编器中的使用不一致,因此并不是真正意义上的运算符。例如:

    JP (HL)
    

    是表示将HL 加载到程序计数器的操作的常用方式。没有从内存中获取任何内容,它只是一个直接赋值——我猜会出现令人困惑的语法,因为这意味着未来将通过程序执行来读取 HL 中的内容。

    作为第二个示例,请参阅:

    OUT (C), A
    

    A 中的字节存储到端口BC。所以括号的作用是表示它们里面的东西会被读取或写入,但是括号里面的东西是一个缩写(技术上因为最初的 8080 只做 8 位端口寻址,所以 Zilog 不想混淆事情)。

    【讨论】:

      【解决方案3】:

      当然。 另一个例子(实际程序中应该有类型转换!):

      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
      

      【讨论】:

      • 如果指向的数据大于 16 位会发生什么?例如。 wchar*?
      • @hivert 还有? C 与处理器无关。解释你自己。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      • 1970-01-01
      • 2012-04-06
      相关资源
      最近更新 更多