目录
功能:将源地址里保存的数据传送到目的地址中保存,传送类指令一般常用助记符 MOV 表示。
用户在编程中能够指定的源端和目的端:
主机与外设之间交换信息:

输入/输出(I/O)类指令实现主机和各外围设备之间的信息传输,输入和输出都以主机为参考点。
外围设备通过 I/O 接口与系统总线连接,数据的发送/接收者是 I/O 接口中的寄存器,主机对外围设备的访问就是对有关接口寄存器的访问。
主机用输出指令或传送指令,将具体设备的控制命令按约定的代码格式送往接口中的 控制寄存器,向外设发出命令。外设的状态信息以某种格式放在接口的 状态寄存器 中,主机用输入指令或传送指令从状态寄存器中取出有关信息进行查询、分析,以确定主机下一步的工作。主机与外设之间传输的数据存放于 数据寄存器。
系统总线与 I/O 接口的连接方式:

先给出端口地址(你要用哪个寄存器),再给出控制信号(你是要读还是要写)。
得到端口地址后,我们通过 译码器 来选择相应的寄存器:

译码器的输出端与一个三态门相连,成为寄存器的控制端。当且仅当控制端有效时,才能从寄存器中读出数据。比如 A = 0,B = 0,C = 1,从第二个寄存器中读出数据。
I/O 设备的编址方法:
① 单独编址
早期方法是为每台设备分配一个设备码,I/O 指令中指明设备码和寄存器;常用方法是为每个寄存器(I/O 端口)分配独立的端口地址,I/O 指令中给出端口地址。
例如,存储空间容量为 64K:
单独编址的特点:
计算机不能根据地址码本身区分存储单元和 I/O 端口,即 I/O 接口寄存器。

因此在处理器的指令集中,需要有专门的 I/O 指令(非数据传送指令)来完成端口的读写操作,又称为 显式 I/O 指令。
- IN R, n1 ; 输入指令,将n1单元内容送入R中
- OUT n2, R ; 输出指令,将R内容送入n2单元中
处理器通过对操作码 IN 和 OUT 的译码来判断出是 I/O 指令。对于主存,我们使用操作码 MOV 来完成输入/输出操作。

逻辑电路如图所示:

② 统一编址
I/O 端口地址占 CPU 提供的全部地址空间的其中一部分。
比如,可将地址空间的低端部分分配给主存单元,高端部分分配给 I/O 端口,以示区分。
采用统一编址,计算机可根据地址码本身区分是存储单元地址还是 I/O 端口地址,无需其它控制,对存储单元或 I/O 端口的读写不会发生混乱。
统一编址时,将设备接口中的寄存器视为一个存储单元,采用 一般数据传送指令 实现 I/O 操作,又称为 隐式 I/O 指令。
在指令集中,无需专门的输入/输出指令,采用一般数据传送指令即可进行端口的读写操作:
- ; 数据寄存器地址为FF00H
- ; 命令寄存器地址为FF01H
- ; 状态寄存器地址为FF02H
-
- MOV [FF01H], R0 ; 将R0中内容送入命令寄存器中
- MOV R1, [FF02H] ; 将状态寄存器中内容送入R1中
- MOV R2, [FF00H] ; 将数据寄存器中内容送入R2中
- MOV [FFOOH], R3 ; 将R3中内容送入数据寄存器中
处理器无需专门的信号来区分是访问存储器还是访问 I/O 端口,译码电路对地址码的译码即可区分出是读写存储器单元还是读写 I/O 端口。
① 算术运算指令
加(ADD)、减(SUB)、乘(MUL)、除(DIV)、求补(NEG)、加1(INC)、减1(DEC)、…
② 逻辑运算指令
与(AND)、或(OR)、非(COM)、异或(EOR)、…
实现对代码位的设置、测试、清除、修改等。
运算结束后大部分会自动设置相应状态标志。
① 转移指令
② 转子指令与返回指令
子程序就是我们常说的函数,每个子程序的最后一条指令都是返回指令。以 C 语言为例,对于有返回值的函数,我们会在最后写上 return ... 进行返回;对于没有返回值的函数,在最后也会隐藏一条 return ; 进行返回。
在高级语言中,函数名就是子程序的入口地址,我们假设这里的 Add 是一个函数名。取完 Add 指令,PC + n,PC 指向下一条指令,再把 PC 压入堆栈中。在 Add 执行结束后,再把 PC 弹出来。
③ 软中断指令

早期主要用于程序调试,现在常用于系统功能调用。
和转子指令与返回指令的区别:软中断指令具有随机性,比如我们可以随机设置程序断点。
④ 控制指令
CPU内部结构:
