计组(四)指令系统

文章目录


一、CPU的结构

在这里插入图片描述

1.寄存器

在这里插入图片描述在这里插入图片描述

(1)数据寄存器

  • 【问:AX和AH、AL的关系是什么?】
    16位的寄存器在需要时,可分为两个8位寄存器来用。如:
    mov AX,3344h
    结果AX是3344h,则AH是AX的高8位,AL是AX的低8位,即AH为33h,AL为44h。

(2)指针寄存器

SP是堆栈指针寄存器,由它和堆栈段寄存器SS一起来确定堆栈在内存中的位置。
BP是基数指针寄存器,通常用于存放基地址,以使8086的寻址更加灵活。

(3)变址寄存器

都用于指令的变址寻址:
SI是源变址寄存器,SI通常指向源操作数。
DI是目的变址寄存器,DI通常指向目的操作数。

(4)控制寄存器

IP:指针寄存器

IP用来控制CPU的指令执行顺序。它和代码寄存器CS一起可以确定当前所要取的指令的内存地址。
CPU执行程序的地址总是为:CS×16+IP。IP 具有 CPU 每从内存取出一个字节,IP 自动加 1,指向下一个字节的特性。

当CS不变、IP单独改变时,会发生段内程序转移。
当CS和IP同时改变时,会产生段间的程序转移。

PSW:程序状态字(状态寄存器或标志寄存器)

PSW用来存放8086CPU在工作过程中的状态。
PSW各位标志如图4.8所示。

标志位含义:

  • 状态标志寄存器是一个 16 位的寄存器,×位不用,空着的各位留做后用。
  • C—进位标志位。做加法时出现进位或做减法时出现借位,该标志位置 1;否则清 0。位移和循环指令也影响进位标志。
  • P—奇偶标志位。当结果的低 8 位中 1 的个数为偶数时,则该标志位置 1;否则清 0。
  • A—半加标志位。在加法时,当位 3 需向位 4 进位,或在减法时位 3 需向位 4 借位时,该标志位置 1;否则清 0。该标志位通常用于对 BCD 算述运算结果的调整。
  • Z—零标志位。运算结果所有各位均为 0 时,该标志位置 1;否则清 0。
  • S—符号标志位。当运算结果的最高位为 1,该标志位置 1;否则清 0。
  • T—陷阱标志位(单步标志位)。当该位置 1 时,将使 8086 进行单步指令工作方式。在每条指令执行结束时,CPU 总是去测试 T 标志位是否为 1。如果为 1,那么在本指令执行后将产生陷中断,从而执行陷阱中断处理程序。该标志通常用于程序的调试。例如,在系统调试软件 EBUG 中的 T 命令,就是利用它来进行程序的单步跟踪的。
  • I—中断允许标志位。如果该位置 1,则处理器有可能响应可屏蔽中断请求(还要看其他条件);否则就一定不能响应可屏蔽中断请求。
  • D—方向标志位。该标志只用于串操作指令,当该位置 1 时,串操作指令为自动减量指令,即从高地址到低地址处理字符串;否则串操作指令为自动增量指令。
  • O—溢出标志位。在算术运算中,带符号的数的运算结果超出所规定的带符号数所能表达的范围时,该标志位置 1;否则清 0。

(5)段寄存器SEG

段寄存器SEG:

  • 代码段寄存器CS
  • 数据段寄存器DS
  • 堆栈段寄存器SS
  • 附加段寄存器ES。

段寄存器是沟通寄存器和存储器之间的桥梁。(原因:三、0.总结)

存储器寻址

  • 【为什么使用存储器寻址?】
    8086CPU具有1MB的内存空间,可是内部寄存器都只有16位,很显然,不采取特殊措
    施,是不能寻址1MB存储空间的。为此引入了段的概念。每个内存段具有64KB的存储空间 2 16 = 64 K B 2^{16}=64KB 216=64KB)。物理地址=段寄存器的内容×16+偏移地址,这样产生了20位的地址,即 2 20 = 1 M B 2^{20}=1MB 220=1MB

  • 【怎么使用存储器来读程序?】
    程序存储在代码段CS中:程序地址=CS×16+IP。

  • 【不同的功能】
    这些段寄存器的内容与有效的地址偏移量一起可确定内存的物理地址。通常CS规定并控制程序区,DS和ES控制数据区,SS控制堆栈区。

在这里插入图片描述

2.运算器

  • 算术逻辑单元ALU
  • 单总线
  • 暂存器T和S

3.控制器

  • AR:单向地址寄存器

  • DR:双向数据寄存器

  • PC:程序计数器,用于存放下一条要执行指令的内存地址。

  • IR:指令寄存器,存放正在执行的指令。

  • PSW:程序状态字,存放指令执行结果状态及一些特定的标志。通常,包括进位标志CF、溢出标志OF、零标志ZF、符号标志SF、中断标志IF等。

  • 时序部件:用于产生所需时序信号。

  • 控制命令产生部件:在指令的执行过程中,控制命令产生部件能够根据指令操作码,产生相应的内部及外部控制信号,在这些控制信号的控制下,完成指令的功能。

  • 对外部中断INT、直接存储器存取DMA

4.总线(图中的粗线)

  • AB:数据总线
  • CB:控制总线
  • DB:数据总线
  • IB:内部总线

二、指令

1.指令信息

在这里插入图片描述
只有指令操作码是必有的,其他信息的有无因指令而异。

2.操作数的指令格式

(1)零地址指令

只有操作码(OP),没有地址码
在这里插入图片描述
这种指令用于两种情况:
一是有的指令不需要操作数,当然也就不需要操作数地址。例如,空操作指令、仃机指令等。
另一种情况是指令所需操作数的地址是默认的,不需要由指令给出。

(2)一地址指令

地址指令中指令包含一个操作数地址。该地址指令执行前存放着操作数,指令执行
后存放执行的结果。
在这里插入图片描述

例如:
INC AX:加 1 指令,实现将寄存器 AX 的内容加 1
SAL AL:算术左移指令,实现寄存器 AL 的内容算术左移一次

(3)二地址指令

其中 A1、A2 用于表示两个操作数的地址。其功能为:(A1)OP(A2)→ A1。
在这里插入图片描述
通常, A1 称为目的操作数的地址,它用于存放指令执行的结果。将 A2 称为源操作数的地址.
例如:
MOV DX,A2:传送指令,实现将内存地址单元 A2 的内容传送到 DX 中

(4)三地址指令

A1为存放指令执行结果的地址。其功能为:(A2)OP(A3)→A1。
在这里插入图片描述
例如:
ADD AX,BX,CX:加法指令,实现 BX+CX→AX

(5)多地址指令

同理

3.操作码

(1)(操作码是固定长度编码)定长操作码变长指令码

定长操作码:
用固定长度的指令操作码来表述不同的指令

变长指令码:
指令编码的其他字段用于表示操作数的地址,不同的指令有不同的寻址方式,它们所需要的操作数个数也不一样。因此,指令码的长度随指令的不同而不同。比如,即零地址、一地址、二地址及更多地址的指令,构成指令的长度就不同。

(2)(扩展编码方式)定长指令码变长操作码

  • 【什么是扩展编码?】
    在这里插入图片描述
    扩展编码是扩展前缀码,扩展的是op操作码
    如图所示,二地址指令的操作码op的前缀码是1111,而1111就是扩展三地址指令操作码op剩下的。

  • 【扩展编码的顺序?】
    扩展编码要从地址多的指令开始。因为扩展码就是扩展前缀码,地址多的指令的操作码op就少,那么肯定将其作为前缀。(123和12345,123是12345的前缀)

  • 【扩展编码的数目?】
    在这里插入图片描述
    问:比如我们定义指令字长18位,每个地址字段均为4位,有三地址指令和一地址指令。那么三地址指令最多有几条?
    答:指令字长18位,三地址指令有三个地址字段占3*4=12位,则op操作码剩下18-12=6位。6位二进制有 2 6 = 64 2^6=64 26=64种组合,因为你还需要一地址指令,所以必须得留下一条以上的组合,则最多有63中三地址指令。
    问:如果三地址指令有60条,那么最多有多少条一地址指令?
    答:一地址指令是扩展三地址指令剩下的组合,将其作为前缀码。现在剩下了64-60=4种,以此为前缀,那么有 4 × 2 4 + 4 = 1024 4\times 2^{4+4}=1024 4×24+4=1024种。(一地址指令中op共6+4+4=14位,前缀占6位,前缀有4种情况,剩下8位自由组合有 2 4 + 4 = 256 2^{4+4}=256 24+4=256种,结果是 4 × 256 = 1024 4\times 256=1024 4×256=1024种。题中不需要更低的地址,所以我们不需要留存组合作为次级地址的扩展前缀。)
    问:若有零地址?
    答:同一地址指令分析。

计算题1

某计算机指令字长16位,有括零地址、一地址、二地址和三地址指令,用扩展操作码技术。若每个地址字段均为4位。若要构成 L(L<16)条三地址指令,K 条二地址指令,M 条一地址指令,则可构成的零地址指令条数为:
解: { [ ( 2 4 - L ) × 2 4 - K ] × 2 4 - M } × 2 4 {[(2^4-L)×2^4-K]×2^4-M}×2^4 24L×24K×24M×24

计算题2

某计算机指令字长16位,有单地址和双地址指令两类,用扩展操作码技术。若每个地址字段均为6位,且双地址指令有12条,则单地址指令最多有256条。
在这里插入图片描述
解: ( 2 4 − 12 ) × 2 6 = 256 (2^4-12)\times 2^6=256 (2412)×26=256

计算题3

某指令系统的指令字长固定为 16 位,指令分为无操作数、一个操作数和二个操作数三类,每个操作数的地址码字段为 6 位。若二个操作数指令有 K 条,无操作数指令有 L条,问一个操作数指令最多可有多少条?
解:
单地址指令最多为 ( 24 - K ) × 2 6 - ┍ L / 64 ┑ (24-K)×2^6-┍L/64┑ (24K×26L/64取上取整
(┍L/64┑是留给无操作数指令足够的剩余前缀)

(3)霍夫曼编码

原理:

https://blog.csdn.net/sandalphon4869/article/details/90577575

(4)例题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、操作数寻址方式

0.总结

在这里插入图片描述
费曼理解:寻址就是寻找一个数的地址,知道了地址我们就能得到对应地址中存储的数值。类似于C语言的指针。

依据数据给除的方式,这些寻址分成了三类:

  • 立即寻址:就是不用寻找地址,这个数直接给出来了。
  • 寄存器寻址:相当于立即寻址的包装,数据放在了寄存器中。
  • 内存寻址:带[ ]的都是这种。
    • 数据存放都在存储器,物理地址就是上面的物理地址=段寄存器的内容×16+偏移地址。所以内存寻址都是一个段寄存器的内容×16+偏移地址,区别就是这个偏移地址的表示方式。
    • 直接寻址→寄存器间接寻址、寄存器相对寻址→基址变址寻址、基址变址相对寻址
    • 操作数的偏移地址存放在SI、DI、BX、BP这4个寄存器(变址寄存器和基址寄存器)中之一。
    • SI、DI、BX对应数据段寄存器DS,BP对应堆栈段寄存器SS。

这三类的例子:
在这里插入图片描述

1.立即寻址

指令的地址字段是操作数本身,即操作数在寄存器中。

目的操作数是通用寄存器,不可以是控制寄存器和段寄存器。

在这里插入图片描述

  • 图例:MOV AX,2000H,那么AX=2000H(其中AH=20H,AL=00H)

2.直接寻址

操作数一般在数据段区域中,它的地址为数据段寄存器DS加上这16位的段内偏移地址

地址:
所以操作数的地址由DS加上指令中直接给出的16位偏移得到(DS 的内容 × 16(即十六进制左移 1位),变为 20 位,再在其低端 16 位上加上偏移地址 2000H)。

结果:
获得地址指向的内容,而不是地址本身,类似指针。

PS:如果采用段超越前缀,则操作数也可含在其他段中。如:MOV AX,ES:[2000H]

在这里插入图片描述

  • 图例:MOV AX,[2000H],(DS) = 3000H,AX?
    则物理地址=30000H+8054H=32000H,32000H里的内容为3050H,执行结果为(AX) = 3050H

  • 问:DS=3000H是什么?怎么得来的?
    DS数据段寄存器中的内容。执行指令①MOV DX,4000H和②MOV DS,DX得到。

3.寄存器寻址

操作数在寄存器中,所以直接传递寄存器的地址。
寄存器可以是通用寄存器(可以是16位寄存器,也可以是8位寄存器),也可以是段寄存器。
PS:但有时不能同时存在,见MOV指令。
在这里插入图片描述

4.寄存器间接寻址

在寄存器间接寻址方式中,操作数存放在存贮器中,操作数的16位段内偏移地址放在SI、DI、BP、BX这4个寄存器(变址寄存器和基址寄存器)中之一。

由于上述4个寄存器所默认的段寄存器不同,这样又可以分成两种情况:
① 若以SI、DI、BX进行间接寻址,则操作数默认存放在数据段DS中。
② 若以基数指针寄存器BP间接寻址,则操作数默认存放在堆栈区域SS中。
在这里插入图片描述

  • 图例1:MOV AX,[SI],其中(DS)=2000H,(SI)=1000H,则AX?
    操作数的地址为:DS×16+SI=20000H+1000H=21000H。即从 21000H 单元取一字节放 AL,从 21001H 单元取一字节放 AH。
  • 图例2:MOV AX,[BP],其中(SS)=3000H,(SI)=2000H,则AX?
    操作数的地址为:DS×16+SI=30000H+2000H=32000H。即从 32000H 单元取一字节放 AL,从 32001H 单元取一字节放 AH。
  • 段超越: MOV AX, ES:[SI]
    该指令中 ES 为段超越前缀,指令功能就是从 ES×16+SI 形成的物理地址及其下一个
    地址中取一个字放入 AX 中。
    在指令中,默认段寄存器是可以缺省的,而段超越的前缀是不能缺省,必须明确指定。

5.寄存器相对寻址

在寄存器相对寻址方式中,操作数存放在存贮器中。

地址:
操作数的地址是由段寄存器内容加上SI、DI、BX、BP之一的内容,再加上由指令中所指出的8位或16位相对地址偏移量而得到的。

分类:
在一般情况下,若用SI、DI或BX进行相对寻址时,以数据段寄存器DS作为地址基准,而用BP寻址时,则以堆栈段寄存器SS作为地址基准。
在这里插入图片描述

  • 图例:MOV AX,DISP[SI],其中(DI)=3000H,(SI)=2000H,(DISP)=1000H,则AX?
    地址=30000H+2000H+1000H=33000H,即从 33000H 单元取一字节放 AL,从 33001H 单元取一字节放 AH。
  • 写法:也写作 MOV AX,[SI+1000H] 或者 MOV AX,1000H[SI]

6.基址、变址寻址

在8086/8088中,通常把BX和BP作为基址寄存器,而把SI、DI作为变址寄存器。将这两种寄存器联合起来进行的寻址就称为基址、变址寻址。

地址:
操作数的地址应该是段寄存器内容加上基址寄存器内容(BX或BP内容),再加上变址寄存器内容(SI或DI内容)而得到的。

分类:
若用BX作为基地址,则操作数应放在数据段DS区域中;若用BP作为基地址,则操作数应放在堆
栈段SS区域中。
在这里插入图片描述

  • 图例:MOV AX,[BX][SI],其中(DS)=3000H,(SI)=1000H,(BX)=2000H,那么AX?
    地址=30000H+1000H+2000H=33000H,即从 33000H 单元取一字节放 AL,从 33001H 单元取一字节放 AH。

7.基址、变址、相对寻址

基址、变址、相对寻址方式实际上是第6种寻址方
式的扩充。即操作数的地址是由基址、变址方式得到
的地址再加上由指令指明的8位或16位的相对偏移地址
而得到的。
在这里插入图片描述

  • 图例:MOV AX,DISP[BX][SI],其中(DS)=3000H,(BX)=2000H,(SI)=1000H,(DISP)=200H。那么AX?
    地址=30000H+2000H+1000H+200H=33200H,即从 33200H 单元取一字节放 AL,从 33201H 单元取一字节放 AH。

8.隐含寻址

在有些指令的指令码中,不仅包含有操作码信息,而且还隐含了操作数地址的信息。例如乘法指令MUL的指令码中只需指明一个乘数的地址,另一个乘数和积的地址是隐含固定的。
这种将操作数的地址隐含在指令操作码中的寻址方式称为隐含寻址。

例:
MUL BL ; AL×BL →AX
DIV BL ; AX÷BL →AL
CLC ; 0 → CF

9.题

现有(BX)=0100H,(SI)=0002H,(0100H)=12H,(0101H)=34H,(0102H)=56H,(0103H)=78H,(1200H)=2AH,(1201)=4CH,(1202H)=B7H,(1203H)=65H,
试说明下列指令执行后 AX 的值。(不考虑DS)
(1)MOV AX,1200H
(2)MOV AX,BX
(3)MOV AX,[1200H]
(4)MOV AX,[BX]
(5)MOV AX,1100H[BX]
(6)MOV AX,[BX][SI]
(7)MOV AX,1100H[BX][SI]
解:
⑴AX=1200H,立即寻址
⑵AX=0100H,寄存器寻址
⑶AX=4C2AH,直接寻址(别忘了AL和AH一共才是AX)
⑷AX=3412H,寄存器间接寻址
⑸AX=4C2AH,寄存器相对寻址
⑹AX=7856H,基址变址寻址
⑺AX=65B7H,基址变址相对寻址

四、指令

这些指令的操作数格式符合上面的 二、2.操作数的指令格式

1.传送指令

(1)MOV指令

在这里插入图片描述

  • 目的操作数和源操作数的位置
    在这里插入图片描述

  • 作用:
    一种是得到一个数:如MOV AX,[SI],得到存储器中的某个地址的数据内容,再送给AX。
    另一种是改变存储器中的某个地址的数据内容:如MOV [SI],AX,改变存储器中的某个地址的数据内容,赋AX值。

  • 禁止的情况

    • 目的操作数不能为立即数:相当于常数,你不能给4赋3的值吧。
    • 目的操作数不能为CS、IP:CS、IP都有特殊的用途
    • 内存单元之间不能直接传递:必须通过通用寄存器
    • 立即数不能直接送到段寄存器中:必须通过通用寄存器
    • 段寄存器之间不能直接传递:必须通过通用寄存器
      在这里插入图片描述

(2)交换指令

在这里插入图片描述
在这里插入图片描述

(3)地址传送指令

8086 有 3 条地址传送指令。
在这里插入图片描述

  • (1)LEA 指令
    该指令把源操作数 OPRD2 的地址偏移量传送至目的地址 OPRD1 中。
    源操作数必须是一个内存操作数,目的操作数地址必须是一个 16 位的通用寄存器
    这条指令通常用来建立串指令操作所需的寄存器指针。
    例如:
    LEA BX,BUFR;是把变量 BUFR 的地址偏移量送到 BX 中。

  • (2)LDS 指令
    该指令完成一个地址指针的传送。地址指针包括段地址和地址偏移量。
    指令执行时,将段地址送入 DS,地址偏移量送入一个 16 位的通用寄存器
    这条指令通常用来建立串指令操作所需的寄存器指针。
    例如:
    LDS SI,[BX];该指令是利用 DS×16+BX 的内容所构成内存地址,把由此地址开始的顺序 4 个单元的头两个单元的内容送 SI,后两个单元的内容送入 DS。

  • (3)LES 指令
    这条指令除将地址指针的段地址送入 ES 外,其他操作与 LDS 的相固。
    例如:
    LES SI,[BX+CONT];该指令是利用 DS×16+BX+CONT 所构成内存地址,把由此地址开始的顺序 4 个单元中开始两个单元的内容送 SI,后两个单元的内容送入 ES。

  • 【LEA与MOV的区别】
    LEA是地址传递偏移量,MOV是获得内容。
    在这里插入图片描述

(4)堆栈操作指令

在这里插入图片描述

堆栈操作指令中的操作数可以是

  • 段寄存器(除CS)的内容
  • 16 位的通用寄存器(标志寄存器有专门的出入栈指令)
  • 内存的 16 位字

操作数:
在这里插入图片描述
PUSH 1000H(错误:立即数不行)
PUSH AL(错误:必须是16 位的通用寄存器,8位的不行)
PUSH AX(正确,16 位的通用寄存器)
PUSH [BX](正确:内存中的16位字)
PUSH CS对,POP CS不对

程序分析

  • PUSH
    MOV AX,8000H
    MOV SS,AX
    MOV SP,2000H
    MOV DX,3E4AH
    PUSH DX
    PUSH AX
    堆栈是内存中的一个特定区域,由 SS 的内容和 SP 的内容来决定 。所以栈底(不存东西)地址是80000H+2000H=82000H
    在这里插入图片描述
    PUSH DX的分析:
    ① SP-1→SP
    ② DH→(SP);3E
    ③ SP-1→SP
    ④ DL→(SP);4A

  • POP
    弹出堆栈的过程与此刚好相反,例如 POP AX:
    ①(SP)→AL
    ② SP+1→SP
    ③(SP)→AH
    ④ SP+1→SP

(5)字节、字转换指令

  • CBW
    有一条指令能将 AL 的符号位(bit7)扩展到整个 AH 中,它就是 CBW 指令,即将字节转换成一个字。
    例如:
    MOV AL,4FH
    CBW
    在执行完 CBW 之后,AX=004FH(4FH的符号位是0)。

  • CWD
    另一条指令是将 AX 的符号位(bit15)扩展到整个 DX,它就是 CWD 指令,即将字转换成双字。
    例如:
    MOV AX,834EH
    CWD
    执行完 CWD 之后,DX=FFFFH(834EH的符号位是1),DXAX=FFFF834EH

2.算术指令

(1)加法指令

  • ADD
    格式:
    ADD OPRD1,OPRD2
    这条指令完成两个操作数相加,结果送至目的操作数 OPRD1,即OPRD1←OPRD1+OPRD2
    例如:ADD AL,30

  • INC
    格式:INC OPRD
    这条指令对指定的操作数进行加 1 操作,在循环程序中常用于修改地址指针和循环次数等。
    例如:INC AL

(2)减法指令

  • SUB
    格式:SUB OPRD1,OPRD2
    该指令实现两个操作数的相减,即从 OPRD1 中减去 OPRD2,其结果放于 OPRD1 中。
    例:SUB CX,BX

  • DEC
    格式:DEC OPRD
    该指令实现对操作数的减 1 操作,所用的操作数可是寄存器,也可是内存单元。
    例如:DEC BX

  • CMP
    格式:CMP OPRD1,OPRD2
    该指令为比较指令,完成 OPRD1-OPRD2 的操作。是与减法指令 SUB 的主要不同点是相减后不回送结果,即执行比较指令前后,两个操作数的内容是不改变的。
    例如:CMP AL,100

(3)乘法指令

  • MUL BL(8位)
    被乘数隐含在 AL 中,乘数为 8 位寄存器或存储单元的内容,乘积一定放在 AX 中。
    例如:
    MOV AL,100
    MOV BL,5
    MUL BL

  • MUL CX(16位)
    被乘数隐含在 AX 中,乘数为 16 位寄存器或两顺序存储单元构成的 16 位字,乘积放在 DXAX 连在一起构成的 32 位寄存器中。
    例如:
    MOV AX,100
    MOV CX,5
    MUL CX

(4)除法指令

  • DIV BL(8位)
    被除数隐含在 AX 中,除数可以是 8 位寄存器或存储单元的 8 位无符号数,指令执行结果商在 AL 中,余数在 AH 中。例
    例如:
    MOV AX,1000
    MOV BL,190
    DIV BL
    则在 AL 中有商为 5,而 AH 中有余数 50。

  • DIV BX(16位)
    被除数放在 DX、AX 连到一起的 32 位寄存器中(隐含),除数为 16 位寄存器的内容或两连续存储单元构成的 16 位字;商在 AX 中,余数在 DX 中。
    例如:
    MOV AX,1000
    CWD
    MOV BX,300
    DIV BX
    则执行结果 AX=3,DX=100。(因为被除数是DXAX,所以需要CWD将1000扩展到DXAX为0000H 0008H,即1000D)

3.逻辑运算指令

(1)NOT指令

(2)AND指令

(3)TEST指令

(4)OR指令

(5)XOR指令

4.移位指令

5.串操作指令

6.程序控制指令

常用:

  • 不比较:
    JMP:无条件转移指令
  • 循环:LOOP
  • 和0比较
    • JZ/JE:结果等于0
    • JNZ/JNE:结果不为0
  • 正负
    • JS:结果为负
    • JNS:结果为正
  • 大小
    • JC:小于
    • JNC:等于等于

(1)无条件转移、子程序调用和返回指令

  • 无条件转移指令 JMP
    格式:JMP OPRD ;OPRD 是转移的目的地址
  • 调用和返回指令CALL

(2)条件转移指令

在这里插入图片描述

(3)循环控制指令

  • LOOP OPRD
    每执行一次 CX 减 1,CX≠0 循环

7.处理器控制指令

在这里插入图片描述

(1)标志位操作指令

(2)外部同步指令

  • 暂停指令 HLT
  • 空操作指令 NOP
  • 等待指令 WAIT
  • 封锁总线指令 LOCK
  • 处理器交权指令 ESC

8.输入/输出指令

这类指令是专门用于对接口进入输入/输出操作的,其一般格式为:

  • IN ACC,PORT
  • OUT PORT,ACC

字节传送只能用 AL,而字传只能用 AX。

(1)直接寻址

输出/输出指令中直接给出接口地址,且接口地址由一个字节表示。(由于指令中只能用一个字节表示接口地址,故在此种寻址方式下,可寻址的接口地址空间只有 256 个,即由 00H 到 FFH)
如:
IN AL,35H
OUT 44H,AX

(2)寄存器间接寻址

接口地址由 16 位寄存器 DX 的内容来决定。(由于 DX 是一个 16 位的寄存器,其内容可以从 0000H 到 FFFFH,故其接口的地址范围为 64KB。)
例如:
MOV DX,03F8H
IN AL,DX
表示由接口地址 03F8H(DX 的内容作为接口地址)读一个字节到 AL。

9.位操作指令

五、汇编语言

1.语局格式

每个语句由 1~4 个部分组成,其格式是:[标号] 指令助记符 [操作数] [;注解]
其中用方括号括起来的部分,可以有,也可以没有。

(1)标号

这是给指令某一存储单元地址所起的名字,名称可由下列字符组成:
字母:A~Z 或 a~z
数字:0~9
特殊字符:?,· ,@ ,- ,$
数字不能作名称的第一个字符,而圆点仅能用作第一个字符。标号最长为 31 字符。

冒号:

  • 当名称后跟冒号时,表示是标号。它代表该行指令的起始地址,其他指令可以引用该标号,作转移的符号地址。
  • 当名称后不带冒号时,有可能是标号,也可能是变量。伪指令前的名称不加冒号。
  • 当标号用于段间调用时,后面也不能跟冒号,例如:
    • 段内调用 OUTPUT:IN AL,DX
    • 段间调用 OUTPUT IN AL,DX

(2)指令助记符

它表示不同操作的指令,可以是 8086(88)的指令助记符,也可以是伪指令。
如果指令带有前缀(如 LOCK,REP,REPE/REPE,REPNE/REPNZ),则指令前缀和指令助记符
要用空格分开。

(3)操作数

操作数是指令执行的对象。

操作数的个数

当操作数超过 1 个时,操作数之间应用逗号分开。

例如:
RET ;无操作数
COUNT: INC SI ;一个操作数
MOV CX,DI ;两个操作数
如果是伪指令,则可能有多个操作数,例如:
COST DB 3,4,5,6,7 ;5 个操作数

操作数可以是shenm

操作数可以是常数、寄存器名、标号、变量,也可以是表达式,例如:
MOV AX,[BP+4] ;第二个操作数为表达式

(4)注解

该项可有可无,是为源程序所加的注解,用于提高程序的可读性。

在注解前面要加分号,它可位于操作数之后,也可位于一行的开头。

2.常数

汇编语言语句中出现的常数可以有 7 种:

  1. 二进制数
    二进制数字后跟字母 B,如 0 1 0 0 0 0 0 1 B。
  2. 八进制数
    八进制数字后跟字母 Q 或 O,如 202Q 或 202O。
  3. 十进制数
    十进制数字后跟 D 或不跟字母,如 85D 或 85。
  4. 十六进制数
    十六进制数字后跟 H,如 56H,0FFH。注意,当数字的第一个字符是 A~F 时,在字
    符前添加一个数字 0,以示和变量的区别。
  5. 十进制浮点数
    浮点十进制数的一个例子是 25E-2。
  6. 十六进制实数
    十六进制实数后跟 R,数字的位数必须是 8,16 或 20。在第一位是 0 的情况下,数字
    的位数可以是 9,17 或 21,如 0FFFFFFFFR。
    以上第 5 项和第 6 项中,两种数字格式只允许在 MASM 中使用。
  7. 字符和字符串
    字符和字符串要求用单引号括起来,如‘BD’。

3.

六、汇编程序题

题1

试编程序,统计由 40000H 开始的 16KB 个单元中所存放的字符“A”的个数,并将结果存放在 DX 中。

START: MOV  DI,4000H
		MOV  DS,DI
		MOV  SI,0000H
		MOV  CX,4000H;16KB=2^4·2^10=2^14=0100 0000 0000 0000=4000H
		MOV  DX,0000H
GOON:  	MOV  AL,[SI] 
		CMP  AL,‘A’
		JNE   NEXT
		INC   DX
NEXT:  INC  SI
		DEC  CX 
		JNZ  GOON
		HLT   

题2

若接口 02E0H 的 BIT2 和 BIT5 同时为 1,表示外设接口 02E7H 有一个准备好的8 位数据,当 CPU 从该接口读走数据后,02E0H 接口的 BIT2 和 BIT5 就不再同时为 1;只有当又有一个准备好的数据时,它们会再次同时 1。试编程序,从上述接口读入 32 个数据,顺序放在 A0100H 单元开始的各单元中。

START: MOV  DI,0A000H
		MOV  DS,DI
		MOV  SI,0100H
		MOV  CX,32
		MOV  DX,02E0H
GOON: 	IN    AL,DX
		AND  AL,24H
		CMP  AL,24H
		JNE   GOON
		MOV  DX,02E7H
		IN    AL,DX
		MOV  [SI],AL
		INC   SI
		LOOP  GOON
		HLT

题3

试编程序将内存从 40000H 到 4BFFFH 的每个单元中均写入 55H,并再逐个单元读出比较,看写入的与读出的是否一致。若全对,则将 AL 置 7EH;只要有错,则将 AL置 81H。

解:

START: MOV  DI,4000H
		MOV  DS,DI
		MOV  SI,0000H
		MOV  CX,0C000H
NEXT0:	MOV  AL,55H
		MOV  [SI],AL
		INC   SI
		LOOP  NEXT0
		MOV  SI,0000H
		MOV  CX,0C000H
NEXT3:	MOV  AL,[SI]
		CMP  AL,55H
		JNE   NEXT5
		INC   SI
		DEC  CX
		JNZ  NEXT3
		MOV  AL,7EH
		HLT
NEXT5:	MOV  AL,81H
		HLT


START: MOV  DI,4000H
		MOV  ES,DI
		MOV  DI,0000H
		MOV  CX,0C000H
NEXT0:	MOV  AL,55H
        CLD
        REP  SCASB
        JCXZ  NEXT7
		MOV  AL,7EH
		HLT
NEXT7:	MOV  AL,81H
		HLT
  • 19
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值