软件工程师手册/语言词典/DEC PDP-11
注意:所有汇编语言示例代码都取决于开发环境汇编程序和操作系统。
以下是 维基百科词条。
CISC
在 Unix 上,程序执行将从第一个字开始。Unix 的“a.out”格式(汇编程序输出)有一个头,头的第一个字,八进制 407,是一个绕过头部的其余部分的分支。到第五版 Unix,头实际上没有加载到执行映像中,因此八进制 407 不必执行;然而,“魔数” 0407(八进制)仍然是 a.out 格式的一部分,即使该格式移动到其他计算机体系结构。
有八个 16 位寄存器,通过指令中寻址模式的三个位进行寻址。寄存器 7 是程序计数器,寄存器 6 是堆栈指针。寄存器 0 到 5 是通用寄存器。堆栈向下增长。
寻址模式包括后增量和前减量。一个流行的神话假设这些是 C 中增量和减量运算符的来源,但实际上这些是从 B 继承来的,B 在 PDP-11 存在之前就已经实现了。
PC 被寻址为一个普通寄存器,以及后增量寻址模式的包含,导致你可以将一个字面值加载到一个寄存器中(或者将其发送到内存,因为那样会发生)。通过在内存中将指令后面的字面值。
mov (PC)+, R5 177265
将把八进制 177265 放入寄存器 5 中。在汇编程序中(这里使用 Unix 汇编程序语法),你可以将其缩写为
mov $177265, R5
在 Unix 汇编程序中,一个冒号紧跟在每个标签之后。
foo: mov -(PC), -(PC) / copy this instruction to the previous / location and branch there br foo / branch to foo
当然,在上面的例子中,跳转到 foo 不必执行,因为前一条指令本身就是一个(糟糕的)循环。
指令字段从低位侧开始,以三位为界,因此很容易记住一些指令和寻址模式,以便从前面板开关进行二进制编程。例如,
mov -(PC), -(PC)
的机器语言是八进制 01x7x7,我忘记 x 是什么了,但它表示寻址模式,前减量,每个 7 表示 PC,01 是 move 的操作码(表示复制)。然而,这些字段边界对于分支指令并不适用。
至少有一个汇编程序(DEC?)允许用分号分隔的注释一直持续到行尾。在 Unix 汇编程序中,使用字符“/”代替。 [1]
处理器状态字(PSW)在特定内存映射位置(-2,我相信)进行寻址。中断向量位于低内存中。中断将返回地址压入堆栈,以及其他内容,因为中断的格式与子程序调用的格式不同,因为有一个与正常返回(从子程序)指令不同的返回中断指令。
有分支,它们跳转到短的相对地址,以及跳转指令,它们可以跳转到使用任何寻址模式的任何地址。只有分支可以是条件的,在这种情况下,它们将取决于前一个比较或算术指令设置的条件代码。我不记得是否有一个“永远分支”。有一个“等待”,它将在下一个中断到来之前等待,还有一个“停止”,它将在内核模式下或在没有保护的机器上执行时将控制权交给控制台。
cmp r0, (r1) / compare the contents of register R0 to / what R1 points to in memory (two-byte word) bne foo / branch not equal, to foo
设备在高地址进行内存映射。你可以使用中断或轮询来知道它们何时就绪。有几个级别的中断(或总线请求)。
在光栅图形成为de rigeur之前,有一台名为 GT40 的图形计算机。它有一个计算处理器,即 PDP-11,以及一个协处理器来执行矢量图形。图形处理器有自己的跳转指令,并将被放置在一个循环中以保持屏幕刷新。有很棒的登月舱和太空战争程序。
当然,Unix 上的用户程序使用系统调用进行 I/O,系统调用是陷阱指令。
stdout = 1 .data msg: <Hello, world.\n> .code sys write; stdout; msg; 14. / is the length / don't bother checking for error or a write of less than / the full buffer. sys exit; 0 / exit with an OK status
我不确定退出状态是否遵循上面的“sys exit”,或者是否在 r0 中。
clr r0 sys exit
由于系统调用的参数通常在内存中的陷阱指令之后,参数通常应该是可变的,并且如果你在可执行代码中混合了变量,你无法编写可重入代码,所以 Unix 提供了“sys indir”调用,该调用可以指向数据空间中的系统调用,Unix 将解释它就像它是在内联执行一样。
<允许多少层地址间接寻址?显示示例代码。>
一层间接寻址,由指令决定。你可以通过指令后面的字面值进行索引。
<描述文件、库和部件通常是如何划分和排列的。它们在各种形式中是否有典型的文件扩展名?>
在 Unix 上,汇编语言通常使用 .s 扩展名(表示“源代码”)。汇编的结果称为 a.out,除非你告诉汇编程序使用其他名称,在这种情况下,惯例是使用 .o 后缀(表示“对象”)。通常,链接器“ld”(表示“加载器”)将在多个 .o 文件上运行以生成新的 a.out,然后你可以通过键入其名称来执行它。
<列出此汇编语言中特别有用的命令的代码和描述。>
在 Unix 和 DEC 汇编器中,都存在临时标签。与其为每个需要的标签都起一个名字,你只需使用一个数字,并在本地访问它。
1: cmp r3, r4 / hit size limit yet? bge 2f mov (r0)+, (r1)+ inc r3 br 1b 2:
在 Unix 汇编器中,2f 代表 2 个前向 (下一个 "2:"),1b 代表 1 个后向,以此类推。
跳转可以跳到比分支更远的地方,但会占用两个字,因此如果可能,分支更可取。汇编器提供了一种方式,如果分支能够到达就编码分支,否则就编码跳转。你可以有条件地编写它,在这种情况下,汇编器会根据需要输出一个围绕跳转的分支(当然,会反转条件)。
jle foo / jump to foo if less or equal jbr bar / jump or branch to bar
PDP-11 是最早的微型计算机之一。它被广泛用于各种用途,从分时系统到嵌入式控制,以及一些桌面应用。PDP-11 本身不是一种语言,但 PDP-11 汇编是汇编的一种变体。这台早期机器的架构影响了后来的微处理器,因为它影响了机器原生代码的设计,也影响了更高层次的语言。
后递增寻址也应用到了摩托罗拉 6800 中。
你唯一想学习 PDP-11 汇编语言的原因是,你已经获得了一台可用的 PDP-11 机器,并且想要编写或修改在其上运行的程序。这台机器,PDP-11,以及所有运行它的原生机器都已过时。
<你可以在哪里获取此汇编语言的汇编器、交叉汇编器和模拟器?>
<列出网络上的其他参考资料。请说明参考资料适合哪些级别的读者。(初学者/中级/高级)
代码集在网络上的位置?>
PDP-11 程序员手册,数字设备公司
- ↑ 关于 UNIX 第 6 版的莱昂斯评注,第 2 章 - Unix 汇编器