【问题标题】:Store variable with specific length in memory在内存中存储具有特定长度的变量
【发布时间】:2014-12-20 19:32:15
【问题描述】:

我阅读了有关 C#、Java 等语言的虚拟机的信息……但我无法理解处理器如何知道它应该写入多少数据的细节之一。让我们假设以下语法:

mov [A], 'A';

A 是虚拟寄存器,'A' 只是 8 位长度的符号。 [A] 表示寄存器中的地址是内存中将存储我们的变量的地址。假设我们的寄存器是 32 位长度的。处理器如何知道我们只需要在内存中存储前 1 个字节而其他 3 个无关紧要?我们不能只加载完整的 32 位内存,因为我们会覆盖某些内容。

我能想到的唯一想法是创建指令专用指令,如 mov byte、move word 等……但我认为这不是最好的解决方案。

我的问题可能不是“特定于处理器”,我想知道一般规则是什么。

【问题讨论】:

  • 指令中确实编码了运算大小。语法取决于架构,它可能是不同的助记符或某种修饰符/后缀,或运算符。
  • “其他 3”是什么意思?寄存器A 的大小与其内容 或移动操作的语义无关。正如您自己所说,[A] 的意思是“使用地址存储在A 中的内存”。
  • Others 3 表示我们将前 8 位中的 char 和其他位放入寄存器中,这些位与我们无关,不应存储在内存中。 @Jester - 你能提供一些简单的例子吗?

标签: assembly interpreter vm-implementation


【解决方案1】:

操作大小确实编码在指令中。语法取决于架构,它可能是不同的助记符或某种修饰符/后缀,或运算符。

一些例子:

  • x86 英特尔语法:mov byte ptr [x], ymov dword ptr [x], y
  • x86 at&t 语法:movb $y, x vs movl $y, x
  • mips:sb $t0, ($t1)sw $t0, ($t1)
  • sparc:stb %g0, [%o0]st %g0, [%o0]
  • 手臂:strb r0, [r1]str r0, [r1]
  • 68k:move.b #0, (A0)move.l #0, (A0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 2018-04-11
    相关资源
    最近更新 更多