PDP-11 汇编程序:"single operand instructions" 是如何工作的
PDP-11 assembler: how do "single operand instructions" work
我正在尝试了解 PDP-11 组件。为此,我正在阅读 this 文档。
PDP-11有几套指令类型。一种是单操作数指令,另一种是双操作数指令。
双操作数指令例如:
MOV @(R0)+,R1
...(如果我理解正确的话)从 R0 指向的内存中获取数据,然后递增 R0,然后将从内存中获取的数据存储到 R1 中。
但是单操作数指令呢?
例如:
INC @(R0)+
会发生什么?会不会:
- 取回R0指向的值
- 增加R0
- 增加值
- 将结果存入R0指向的新地址?
- 再增加R0?
或者是跳过了2还是跳过了5?
This manual 包含 §3.3.3 中 INC -(R0)
的示例,阐明 increment/decrement 发生一次 before/after 指令的主要操作:
3.3.3 Autodecrement Mode
...
Autodecrement Mode Examples
Symbolic: INC -(R0)
, Octal code: 005240
, Instruction Name: Increment
Operation: The contents of R0
are decremented by two and
used as the address of the operand. The operand is
increased by one.
Symbolic: INCB -(R0)
, Octal code: 105240
, Instruction Name: Increment
Operation: The contents of R0
are decremented by one and
used as the address of the operand. The operand is
increased by one.
我使用我最喜欢的 PDP-11 已经 35 年了,但我记得:
MOV @(R0)+,R1
由于 MOV 是一个字指令而不是字节,所有 increments/decrements 都是 2 因为它们是字边界并且必须保持字边界完整性。 MOVB指令,字节边界递增1,字节边界保持不变。
@() 是双重间接,因此数据不是 R0 的值指向的位置,而是 (R0) 指向的位置。在源操作数之后的增量使其成为 POST-increment 因此它在移动数据后将 R0 增加 2。
命令
MOV -@(R0),R2 [语法可以是@-()]
pre-decrements 乘以 2,然后从更新后的 R0 指向的位置获取值,然后使用该值作为指针,指向从何处获取数据以移动到 R2。
对于理解是单操作数还是双操作数命令没有区别,因为所有模式都适用于每个操作数。唯一的例外是你可能不想将数据存储到程序中,例如 MOV R0,(PC)+ 但你可以这样做......我们过去一直这样节省内存,但通常它是来自源操作数(见下文)。
希望这对您有所帮助,尽管问了几年了。
--
我们通过在指令中嵌入变量值并按照确切的顺序执行如下两行代码来节省 64K 字节计算机的内存,
MOV @(PC)+,VAR ......不确定确切的语法
ABC: .WORD 0
..... 不确定该语法是否能用 space 表示一个词
它将变量 ABC 嵌入到 MOV 指令的操作数中...double-check 我记得,但我记得是这样的。它之所以有效,是因为在解码 MOV 时,PC 已经指向偏移值所在的下一个字,然后在完成后取出并跳 2 到下一条指令。
我正在尝试了解 PDP-11 组件。为此,我正在阅读 this 文档。
PDP-11有几套指令类型。一种是单操作数指令,另一种是双操作数指令。 双操作数指令例如:
MOV @(R0)+,R1
...(如果我理解正确的话)从 R0 指向的内存中获取数据,然后递增 R0,然后将从内存中获取的数据存储到 R1 中。
但是单操作数指令呢? 例如:
INC @(R0)+
会发生什么?会不会:
- 取回R0指向的值
- 增加R0
- 增加值
- 将结果存入R0指向的新地址?
- 再增加R0?
或者是跳过了2还是跳过了5?
This manual 包含 §3.3.3 中 INC -(R0)
的示例,阐明 increment/decrement 发生一次 before/after 指令的主要操作:
3.3.3 Autodecrement Mode
...
Autodecrement Mode Examples
Symbolic:
INC -(R0)
, Octal code:005240
, Instruction Name: IncrementOperation: The contents of
R0
are decremented by two and used as the address of the operand. The operand is increased by one.Symbolic:
INCB -(R0)
, Octal code:105240
, Instruction Name: IncrementOperation: The contents of
R0
are decremented by one and used as the address of the operand. The operand is increased by one.
我使用我最喜欢的 PDP-11 已经 35 年了,但我记得:
MOV @(R0)+,R1
由于 MOV 是一个字指令而不是字节,所有 increments/decrements 都是 2 因为它们是字边界并且必须保持字边界完整性。 MOVB指令,字节边界递增1,字节边界保持不变。
@() 是双重间接,因此数据不是 R0 的值指向的位置,而是 (R0) 指向的位置。在源操作数之后的增量使其成为 POST-increment 因此它在移动数据后将 R0 增加 2。 命令
MOV -@(R0),R2 [语法可以是@-()]
pre-decrements 乘以 2,然后从更新后的 R0 指向的位置获取值,然后使用该值作为指针,指向从何处获取数据以移动到 R2。
对于理解是单操作数还是双操作数命令没有区别,因为所有模式都适用于每个操作数。唯一的例外是你可能不想将数据存储到程序中,例如 MOV R0,(PC)+ 但你可以这样做......我们过去一直这样节省内存,但通常它是来自源操作数(见下文)。
希望这对您有所帮助,尽管问了几年了。
--
我们通过在指令中嵌入变量值并按照确切的顺序执行如下两行代码来节省 64K 字节计算机的内存,
MOV @(PC)+,VAR ......不确定确切的语法
ABC: .WORD 0
..... 不确定该语法是否能用 space 表示一个词
它将变量 ABC 嵌入到 MOV 指令的操作数中...double-check 我记得,但我记得是这样的。它之所以有效,是因为在解码 MOV 时,PC 已经指向偏移值所在的下一个字,然后在完成后取出并跳 2 到下一条指令。