汇编语言知识梳理 | 自用

140 阅读24分钟

前言

小记:2024年2月27日至2024年3月2日,在B站看了小甲鱼的【8086汇编入门】《零基础入门学习汇编语言》,根据小甲鱼老师的PPT课件梳理了汇编语言的知识点,以备后续复习使用。 之前学完了《计算机组成原理》和《C语言》,感觉《汇编语言》学起来相对轻松一点。由于赶时间进度,并没有全程把视频课听完,先看的PPT课件,看到不懂得才去看视频课的讲解,因为学《汇编语言》是为了学下一门《操作系统》课程(因为看【哈工大】操作系统 李治军的视频课评论里好多人再说李治军老师基于汇编代码讲解的),所以此次学习《汇编语言》主要以理解和熟悉为主,就像小甲鱼老师说的:"以后遇到的事情以后再说"。

CPU与内存(存储器)通过3种总线进行连接:地址总线,数据总线,控制总线。 汇编语言课程的核心思维:必须要从CPU角度考虑问题。

1. 寄存器(CPU工作原理)(基于8086CPU)

CPU组成:运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。

1.1 通用寄存器:

AX、BX、CX、DX 通常用来存放一般性数据。 这四个寄存器都可以分为两个独立的8位寄存器使用。 AX可以分为AH和AL; BX可以分为BH和BL; CX可以分为CH和CL; DX可以分为DH和DL。 在这里插入图片描述

AX的低8位(0位~~7位)构成了AL寄存器,高8位(8位~15位)构成了AH寄存器。

1.2 内存单元地址

物理地址:段地址×16(相当于二进制位数据左移4位)+偏移地址 = 物理地址 8086CPU采用一种在内部用两个16位地址(一个称为段地址,另一个称为偏移地址)合成的方法来形成一个20位的物理地址。 在这里插入图片描述

  • 段的概念: 内存并没有分段,段的划分来自于CPU,由于8086CPU用“(段地址×16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。 以后,在编程时可以根据需要,将若干地址连续的内存单元看作一个段,用段地址×16定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。 注意: (1)段地址×16 必然是 16的倍数,所以一个段的起始地址也一定是16的倍数; (2)偏移地址为16位,16 位地址的寻址能力为 64K,所以一个段的长度最大为64K。

1.3 段寄存器

  • 提供段地址的。 8086CPU有4个段寄存器:CS、DS、SS、ES. 代码段寄存器CS(Code Segment) 数据段寄存器DS(Data Segment) 堆栈段寄存器SS(Stack Segment) 附加段寄存器ES(Extra Segment)

CS和IP是8086CPU中最关键的寄存器,它们指示了CPU当前要读取指令的地址。 修改CS、IP的指令:转移指令:jmp 段地址:偏移地址 | jmp 某一合法寄存器 在这里插入图片描述

  • 代码段: 可以将长度为 N( N≤64KB )的一组代码,存在一组地址连续、起始地址为 16的倍数的内存单元中,这段内存是用来存放代码的,从而定义了一个代码段。 将一段内存当作代码段,仅仅是我们在编程时的一种安排,CPU 并不会由于这种安排,就自动地将我们定义得代码段中的指令当作指令来执行。 CPU 只认被 CS:IP 指向的内存单元中的内容为指令。 所以要将CS:IP指向所定义的代码段中的第一条指令的首地址。

2. 寄存器(内存访问)

2.1 DS和[address]

DS寄存器:8086CPU中有一个 DS寄存器,通常用来存放要访问的数据的段地址。 8086CPU不支持将数据直接送入段寄存器的操作,ds是一个段寄存器。(数据->通用寄存器->段寄存器) [address]表示一个偏移地址为address的内存单元。

2.2 mov、add、sub指令

  • mov 寄存器,数据 mov 寄存器,寄存器 mov 寄存器,内存单元 mov 内存单元,寄存器 mov 段寄存器,寄存器

用 mov 指令要访问内存单元,可以在mov指令中只给出单元的偏移地址,此时,段地址默认在DS寄存器中。

2.3 CPU提供的栈机制

  • 8086CPU提供入栈和出栈指令: (最基本的) PUSH(入栈) POP (出栈) push ax:将寄存器ax中的数据送入栈中; pop ax :从栈顶取出数据送入ax。 8086CPU的入栈和出栈操作都是以字为单位进行的。

  • 8086CPU中,有两个寄存器: 段寄存器SS 存放栈顶的段地址 寄存器SP 存放栈顶的偏移地址 任意时刻,SS:SP指向栈顶元素。栈空,SS:SP指向占空间最高地址单元的下一个单元。 注意栈顶超界的问题

  • 段的综述: 对于数据段,将它的段地址放在 DS中,用mov、add、sub等访问内存单元的指令时,CPU就将我们定义的数据段中的内容当作数据段来访问; 对于代码段,将它的段地址放在 CS中,将段中第一条指令的偏移地址放在IP中,这样CPU就将执行我们定义的代码段中的指令; 对于栈段,将它的段地址放在SS中,将栈顶单元的偏移地置放在 SP 中,这样CPU在需要进行栈操作的时候,比如执行 push、pop 指令等,就将我们定义的栈段当作栈空间来用。 段前缀: 这些出现在访问内存单元的指令中,用于显式地指明内存单元的段地址的“ds:”、“cs:”、“ss:”或“es:”,在汇编语言中称为段前缀

3 一个源程序从写出到执行的过程

3.1一个程序

汇编指令:有对应的机器码的指令,可以被编译为机器指令,最终为CPU所执行。 伪指令:segment和ends是一对成对使用的伪指令,segment和ends的功能是定义一个段,segment说明一个段开始,ends 说明一个段结束。 段名 segment 段名 ends 在这里插入图片描述

程序返回: 在程序的末尾添加返回的程序段。 mov ax,4c00H int 21H 在这里插入图片描述

用汇编语言编程,就要用到 :编辑器(Edit)、编译器(masm)、连接器(link)、调试工具(debug)等所有工具,而这些工具都是在操作系统之上运行的程序,所以我们的学习过程必须在操作系统的环境中进行。 操作系统是由多个功能模块组成的庞大 、复杂的软件系统。任何通用的操作系统 ,都要提供一个称为shell(外壳)的程序 ,用户(操作人员)使用这个程序来操作计算机系统工作。 DOS中有一个程序command.com ,这个程序在 DOS 中称为命令解释器,也就是DOS系统的shell。

3.2 EXE文件中的程序的加载过程

在这里插入图片描述

4 [BX]和loop指令

使用一个描述性的符号 “() ”来表示一个寄存器或一个内存单元中的内容。 约定符号idata表示常量。

4.1 [bx]:

表示一个内存单元,它的偏移地址在bx中。

  • 比如指令: mov ax,[bx],bx 中存放的数据作为一个偏移地址EA ,段地址SA 默认在ds 中,将SA:EA处的数据送入ax中。 即: (ax)=(ds *16 +(bx)); mov [bx],ax,bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将ax中的数据送入内存SA:EA处。 即:(ds *16 +(bx)) = (ax)

4.2 loop指令

指令的格式是:loop 标号,CPU 执行loop指令的时候,要进行两步操作:

  • ① (cx)=(cx)-1; ② 判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行。 通常(注意,我们说的是通常)我们用loop指令来实现循环功能,cx 中存放循环次数。

5 包含多个段的程序

5.1 Dw

“define worddw”的含义是定义字型数据。

5.2 将数据、代码、栈放入不同的段

CPU到底如何处理我们定义的段中的内容,是当作指令执行,当作数据访问,还是当作栈空间,完全是靠程序中具体的汇编指令,和汇编指令对CS:IP、SS:SP、DS等寄存器的设置来决定的。

6 更灵活定位内存地址

6.1 and和or指令

and 指令:逻辑与指令,按位进行与运算。 or 指令:逻辑或指令,按位进行或运算。

6.2 [bx+idata]

表示一个内存单元,它的偏移地址为(bx)+idata(bx中的数值加上idata)。 指令mov ax,[bx+200]也可以写成: mov ax,[200+bx] | mov ax,200[bx] | mov ax,[bx].200

6.3 SI和DI

  • SI(source index)是源变址寄存器 DI(destination index)是目的变址寄存器 SI和DI是8086CPU中和bx功能相近的寄存器,但是SI和DI不能够分成两个8 位寄存器来使用。
  • [bx+si]和[bx+di] [bx+si]表示一个内存单元,它的偏移地址为(bx)+(si)(即bx中的数值加上si中的数值)。 指令mov ax,[bx+si],也可以写成mov ax,[bx][si]
    [bx+si+idata]和[bx+di+idata] [bx+si+idata]表示一个内存单元,它的偏移地址为(bx)+(si)+idata。(即bx中的数值加上si中的数值再加上idata) 指令mov ax,[bx+si+idata]:也可以写成 mov ax,[bx+200+si]
    mov ax,[200+bx+si]
    mov ax,200[bx][si]
    mov ax,[bx].200[si]
    mov ax,[bx][si].200

7 数据处理的两个基本问题

7.1 reg和sreg

两个描述性的符号 reg来表示一个寄存器,用sreg表示一个段寄存器。 reg的集合包括:ax、bx、cx、dx、ah、al、bh、bl、ch、cl、dh、dl、sp、bp、si、di; sreg的集合包括:ds、ss、cs、es。

7.2 寄存器小结

(1)在8086CPU 中,只有这4个寄存器(bx、bp、si、di)可以用在“[…]” 中来进行内存单元的寻址。 (2)在“[…]” 中,这4个寄存器(bx、bp、si、di)可以单个出现,或只能以四种组合出现: bx和si、bx和di、bp和si、bp和di (3)只要在[…]中使用寄存器bp,而指令中没有显性的给出段地址,段地址就默认在ss中。

7.3 汇编语言中数据位置的表达

1、立即数(idata) 2、寄存器 3、段地址(SA)和偏移地址(EA)

7.4 寻址方式小结

在这里插入图片描述

7.5 指令要处理的数据有多长?

(1)通过寄存器名指明要处理的数据的尺寸。 (2)在没有寄存器名存在的情况下,用操作符X ptr指明内存单元的长度,X在汇编指令中可以为word或byte。 (3)其他方法:push指令只进行字操作。

7.6 div 指令

除法指令(division),使用div作除法的时候: 除数:8位或16位,在寄存器或内存单元中 被除数:(默认)放在AX 或 DX和AX中

  • 除数 被除数 8位 16位(AX) 16位 32位(DX+AX) 在这里插入图片描述

7.7 伪指令 dd

db和dw定义字节型数据和字型数据。 dd是用来定义dword (double word双字)型数据的。

7.8 操作符dup

dup是一个操作符,在汇编语言中同db、dw、dd 等一样,也是由编译器识别处理的符号。 它是和db、dw、dd 等数据定义伪指令配合使用的,用来进行数据的重复。

8 转移指令的原理

几类: 无条件转移指令 (如:jmp) 条件转移指令 循环指令(如:loop) 过程 中断

8.1 操作符offset

操作符offset在汇编语言中是由编译器处理的符号,它的功能是取得标号的偏移地址。

8.2 jmp指令

jmp为无条件转移,可以只修改IP,也可以同时修改CS和IP; jmp指令要给出两种信息:转移的目的地址;转移的距离(段间转移、段内短转移,段内近转移)

  1. jmp short 标号(转到标号处执行指令) 这种格式的 jmp 指令实现的是段内短转移,它对IP的修改范围为 -128~127,也就是说,它向前转移时可以最多越过128个字节,向后转移可以最多越过127个字节。
  2. jmp near ptr 标号 实现的时段内近转移。功能为:(IP)=(IP)+16位位移。 (1)16位位移=“标号”处的地址-jmp指令后的第一个字节的地址; (2)near ptr指明此处的位移为16位位移,进行的是段内近转移; (3)16位位移的范围为 -32769~32767,用补码表示; (4)16位位移由编译程序在编译时算出。
  3. jmp far ptr 标号 实现的是段间转移,又称为远转移。 功能: (CS)=标号所在段的段地址;(IP)=标号所在段中的偏移地址。far ptr指明了指令用标号的段地址和偏移地址修改CS和IP。
  4. jmp 16位寄存器 功能:IP =(16位寄存器)
  5. jmp word ptr 内存单元地址(段内转移)。 功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址。
  6. jmp dword ptr 内存单元地址(段间转移) 功能:从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处是转移的目的偏移地址。 (CS)=(内存单元地址+2) (IP)=(内存单元地址) 内存单元地址可用寻址方式的任一格式给出。
  7. jcxz指令 jcxz指令为有条件转移指令,所有的有条件转移指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。对IP的修改范围都为-128~127。 指令格式:jcxz 标号。(如果(cx)=0,则转移到标号处执行。)

8.3 loop指令

循环指令,所有的循环指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址。对IP的修改范围都为-128~127。 指令格式:loop 标号。 ((cx))=(cx)-1,如果(cx)≠0,转移到标号处执行。

9. Call 和 Ret 指令

9.1 ret 和 retf

  • ret指令用栈中的数据,修改IP的内容,从而实现近转移;(相当于进行:pop IP) (1)(IP)=((ss)*16+(sp)) (2)(sp)=(sp)+2
  • retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移;(相当于进行:pop IP;pop CS) (1)(IP)=((ss)*16+(sp)) (2)(sp)=(sp)+2 (3)(CS)=((ss)*16+(sp)) (4)(sp)=(sp)+2

9.2 call 指令

  1. call指令经常跟ret指令配合使用,因此CPU执行call指令,进行两步操作: (1)将当前的 IP 或 CS和IP 压入栈中; (2)转移(jmp)。 CPU 执行指令“call 标号”时,相当于进行: push IP jmp near ptr 标号
  2. “call far ptr 标号”实现的是段间转移。 (1) (sp) = (sp) – 2 ((ss) ×16+(sp)) = (CS) (sp) = (sp) – 2 ((ss) ×16+(sp)) = (IP) (2) (CS) = 标号所在的段地址 (IP) = 标号所在的偏移地址 CPU 执行指令 “call far ptr 标号” 时,相当于进行: push CS push IP jmp far ptr 标号

9.3 call 和 ret 的配合使用

可以利用call和ret来实现子程序的机制。 call指令后面的指令的地址将存储在栈中,所以可以在子程序的后面使用 ret 指令,用栈中的数据设置IP的值,从而转到 call 指令后面的代码处继续执行。

9.4 mul 指令

mul是乘法指令,使用 mul 做乘法的时候: (1)相乘的两个数:要么都是8位,要么都是16位。 8 位: AL中和 8位寄存器或内存字节单元中; 16 位: AX中和 16 位寄存器或内存字单元中 (2)结果 8位:AX中; 16位:DX(高位)和AX(低位)中。

10 标志寄存器(简称为flag)

8086CPU的标志寄存器有16位,其中存储的信息通常被称为程序状态字(PSW)。 8086CPU的flag寄存器的结构: 在这里插入图片描述

10.1 ZF标志

flag的第6位是ZF,零标志位。 它记录相关指令执行后, 结果为0 ,ZF = 1 结果不为0,ZF = 0

10.2 PF标志

flag的第2位是PF,奇偶标志位。 它记录指令执行后,结果的所有二进制位中1的个数: 为偶数,PF = 1; 为奇数,PF = 0。

10.3 SF标志

flag的第7位是SF,符号标志位。 它记录指令执行后, 结果为负,SF = 1; 结果为正,SF = 0。

10.4 CF标志

flag的第0位是CF,进位标志位。 一般情况下,在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的进位值,或从更高位的借位值。 对于位数为N的无符号数来说,其对应的二进制信息的最高位,即第N-1位,的最高有效位,而假想存在的第N位,就是相对于最高有效位的更高位。

10.5 OF标志

CF和OF的区别: CF是对无符号数运算有意义的标志位; 而OF是对有符号数运算有意义的标志位。 对于无符号数运算,CPU用CF位来记录是否产生了进位; 对于有符号数运算,CPU 用 OF 位来记录是否产生了溢出, 当然,还要用SF位来记录结果的符号。

10.6 adc指令

adc是带进位加法指令 ,它利用了CF位上记录的进位值。 格式: adc 操作对象1,操作对象2 功能:操作对象1=操作对象1+操作对象2+CF

10.7 sbb指令

sbb是带错位减法指令,它利用了CF位上记录的借位值。 格式:sbb 操作对象1,操作对象2 功能:操作对象1=操作对象1–操作对象2–CF

10.8 cmp指令

cmp 是比较指令,功能相当于减法指令,只是不保存结果。 cmp 指令执行后,将对标志寄存器产生影响。 其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。 格式:cmp 操作对象1,操作对象2 功能:计算操作对象1–操作对象2 但并不保存结果,仅仅根据计算结果对标志寄存器进行设置。 在这里插入图片描述

e:表示equal; ne:表示not equal; b:表示below; nb:表示not below; a:表示above; na:表示not above。

10.9 DF标志和串传送指令

flag的第10位是DF,方向标志位。 在串处理指令中,控制每次操作后si,di的增减。 DF = 0:每次操作后si,di递增; DF = 1:每次操作后si,di递减。

  • 格式1: movsb
    功能:(以字节为单位传送),将 ds:si 指向的内存单元中的字节送入 es:di中,然后根据标志寄存器DF位的值,将 si和di递增或递减。
  • 格式2:movsw 功能:(以字为单位传送)将 ds:si指向的内存字单元中word送入es:di中,然后根据标志寄存器DF位的值,将si和di递增2或递减2。
  • movsb和movsw进行的是串传送操作中的一个步骤,一般来说,movsb 和 movsw 都和rep配合使用,格式如下: rep movsb rep的作用是根据cx的值,重复执行后面的串传送指令。 由于每执行一次movsb指令si和di都会递增或递减指向后一个单元或前个单元,则rep movsb就可以循环实现(cx)个字符的传送。 由于flag的DF位决定着串传送指令执行后,si和di改变的方向,所以CPU应该提供相应的指令来对DF位进行设置,从而使程序员能够决定传送的方向。 8086CPU提供下而两条指令对DF位进行设置: cld指令:将标志寄存器的DF位置0 std指令:将标志寄存器的DF位置1

10.10 pushf 和 popf

pushf :将标志寄存器的值压栈; popf :从栈中弹出数据,送入标志寄存 器中。 pushf 和 popf,为直接访问标志寄存器提供了一种方法。

11 内中断

11.1中断向量表

CPU用 8 位的中断类型码通过中断向量表找到相应的中断处理程序的入口地址。 中断向量表就是中断向量的列表。 中断向量表在内存中保存,其中存放着 256个中断源所对应的中断处理程序的入口,如右图所示: 在这里插入图片描述

11.2 中断过程

8086CPU的中断过程: (1)(从中断信息中)取得中断类型码; (2)标志寄存器的值入栈(保护标志位); (3)设置标志寄存器的第8位TF 和第9位IF的值为0; (4)CS的内容入栈; (5)IP的内容入栈; (6)从内存地址为中断类型码*4 和中断类型码 *4+2 的两个字单元中读取中断处理程序的入口地址设置IP和CS。

11.3 中断处理程序

常规的步骤: (1)保存用到的寄存器。 (2)处理中断。 (3)恢复用到的寄存器。 (4)用 iret 指令返回。

  • iret指令的功能用汇编语法描述为: pop IP pop CS popf

11.4 单步中断

CPU在执行完一条指令之后,如果检测到标志寄存器的TF位为1,则产生单步中断,引发中断过程。 单步中断的中断类型码为1,则它所引发的中断过程如下: (1)取得中断类型码1; (2)标志寄存器入栈,TF、IF设置为0; (3) CS、IP入栈; (4)(IP)=(14),(CS)=(14+2)。

12 int 指令

int格式: int n,n为中断类型码。它的功能是引发中断过程。int 指令的最终功能和call指令相似,都是调用一段程序。

  • CPU 执行int n指令,相当于引发一个 n号中断的中断过程,执行过程如下: (1)取中断类型码n; (2)标志寄存器入栈,IF = 0,TF = 0; (3)CS、IP入栈; (4)(IP) = (n4),(CS) = (n4+2)。 从此处转去执行n号中断的中断处理程序。

13 端口

13.1 端口的读写

端口的读写指令只有两条:in 和 out分别用于从端口读取数据和往端口写入数据。 注意:在in和out 指令中,只能使用 ax 或al 来存放从端口中读入的数据或要发送到端口中的数据。访问8 位端口时用 al ,访问16 位端口时用ax 。

13.2 CMOS RAM 芯片

PC机中有一个CMOS RAM芯片,其有如下特征: (1)包含一个实时钟和一个有128个存储单元的RAM存储器。(早期的计算机为64个字节) (2)该芯片靠电池供电。因此,关机后其内部的实时钟仍可正常工作, RAM 中的信息不丢失。 (3)128 个字节的 RAM 中,内部实时钟占用 0~0dh单元来保存时间信息,其余大部分分单元用于保存系统配置信息,供系统启动时BIOS程序读取。 BIOS也提供了相关的程序,使我们可以在开机的时候配置CMOS RAM 中的系统信息。 (4)该芯片内部有两个端口,端口地址为70h和71h。CPU 通过这两个端口读写CMOS RAM。 (5)70h为地址端口,存放要访问的CMOS RAM单元的地址;71h为数据端口,存放从选定的CMOS RAM 单元中读取的数据,或要写入到其中的数据。

13.3 shl和shr指令

shl逻辑左移指令,功能为: (1)将一个寄存器或内存单元中的数据向左移位; (2)将最后移出的一位写入CF中; (3)最低位用0补充。 如果移动位数大于1时,必须将移动位数放在cl中。 可以看出,将X逻辑左移一位,相当于执行X=X*2。 shr逻辑右移指令,它和shl所进行的操作刚好相反: 将一个寄存器或内存单元中的数据向右移位; 将最后移出的一位写入CF中; 最高位用0补充。 可以看出,将X逻辑右移一位,相当于执行X=X/2。

13.4 CMOS RAM中存储的时间信息

在CMOS RAM中,存放着当前时间: 秒:00H 分:02H 时:04H 日:07H 月:08H 年:09H 这6个信息的长度长度都为1个字节。 这些数据以BCD码的方式存放: 在这里插入图片描述

可见,一个字节可表示两个BCD码。 则CMOS RAM存储时间信息的单元中,存储了用两个 BCD码表示的两位十进制数,高 4 位的BCD码表示十位,低4 位的BCD 码表示个位。 比如:00010100b表示14

14 外中断

14.1外中断信息

在PC 系统中,外中断源一共有两类: 1、可屏蔽中断 2、不可屏蔽中断
可屏蔽中断是CPU 可以不响应的外中断。CPU 是否响应可屏蔽中断,要看标志寄存器的IF 位的设置。 当CPU 检测到可屏蔽中断信息时: 如果IF=1,则CPU 在执行完当前指令后响应中断,引发中断过程; 如果IF=0,则不响应可屏蔽中断。

14.2 键盘上部分键的扫描码

在这里插入图片描述

键盘输入的处理过程: (1)键盘产生扫描码; (2)扫描码送入60h 端口; (3)一旦侦测到60h端口有动静,引发9 号中断; (4)CPU执行int 9 中断例程处理键盘输入。

15 指令系统总结

1、数据传送指令

比如:mov、push、pop、pushf、popf、xchg等都是数据传送指令,这些指令实现寄存器和内存、寄存器和寄存器之间的单个数据传送。

2、算术运算指令

比如:add、sub、adc、sbb、inc、dec、cmp、imul、idiv、aaa等都是算术运算指令,这些指令实现寄存器和内存中的数据的算数运算。 它们的执行结果影响标志寄存器的:sf、zf、of、cf、pf、af位。

3、逻辑指令

比如:and、or、not、xor、test、shl、shr、sal、sar、rol、ror、rcl、rcr 等都是逻辑指令。 除了not指令外,它们的执行结果都影响标志寄存器的相关标志位。

4、转移指令

可以修改IP ,或同时修改CS 和IP 的指令统称为转移指令。转移指令分为以下几类: (1)无条件转移指令,比如:jmp; (2)条件转移指令,比如:jcxz、je、jb、ja、jnb、jna等; (3)循环指令,比如:loop; (4)过程,比如:call、ret、retf; (5)中断,比如int、iret。

5、处理机控制指令

这些指令对标志寄存器或其他处理机状态进行设置,比如:cld、std、cli、sti、nop、clc、cmc、stc、hlt、wait、esc、lock等都是处理机控制指令。

6、串处理指令

这些指令对内存中的批量数据进行处理 比如:movsb、movsw、cmps、scas、lods、stos等。 若要使用这些指令方便地进行批量数据的处理,则需要和rep、repe、repne等前缀指令配合使用。