文章目录@[toc]第一~三章 概述第四~六章 基本程序结构第七章 更灵活的访存方法第八章 数据处理的两个基本问题第九章 转移指令的原理第十章 call和ret指令第十一章 标志寄存器第十二章 中断第十三章 中断程序设计 + 宏第十四~十六章 端口、外中断、
第一~三章 概述
1.机器语言、汇编语言、高级语言的概念
机器语言:直接用二进制代码的机器指令表示的语言
汇编语言:用指令助记符、符号地址、标号等符 号书写程序的语言
高级语言:一种类似于人类语言的语言
2.汇编语言特点
占用空间少、执行速度快、直接控制硬 件能力强,但不容易掌握、开发周期较长且 可移植性差。
3.汇编语言工作过程
4.8086寄存器组
8086CPU有14个寄存器 :
AX、BX、CX、DX、SI、DI、SP、BP、
IP、CS、SS、DS、ES、PSW(FLAGS)
(1)通用寄存器:AX、BX、CX、DX
AX:累加寄存器,通常用于运算,在乘除指令中指定用来存放操作数,另外,所有的I/O指令都使用这一寄存器与外界设备传输数据。
BX:基址寄存器,常用于地址索引。
CX:计数寄存器,常用于计数;常用于保存计算值,如位移指令,循环(loop)和串处理指令中作隐含的计数器。
DX:数据寄存器,常用于数据传递。
(2)段寄存器:CS、DS、SS、ES
当8086CPU要访问内存时,由这4个段寄 存器提供内存单元的段地址。
汇编指令不区分大小写
5.三大总线
地址总线: CPU是通过地址总线来指定存 储单元的。
总线的宽度决定了物理寻址的范围。
一个CPU有N根地址总线,CPU最多可以寻找 2^N个内存单元
数据总线 :数据总线的宽度决定了CPU和外界进行一次数 据传送的位数。
控制总线 :不同控制线的集合,控制总线的宽度决定了 CPU对外部器件的控制能力
6.物理地址 = 段地址×16+偏移地址
CPU可以用不同的段地址和偏移 地址形成同一个物理地址
7.8086PC工作过程
(1)从CS:IP指向内存单元读取指令,读取 的指令进入指令缓冲器;
(2)IP = IP + 所读取指令的长度,从而 指向下一条指令;
(3)执行指令。 转到步骤 (1),重复这 个过程。
8086CPU 加电启动或复位后( 即 CPU刚开 始工作时)CS和IP被设置为CS=FFFFH, IP=0000H,即FFFF0H单元中的指令是 8086PC机开机后执行的第一条指令。
8.从80386开始,Intel的CPU具有3种运行模式:实模式、 保护模式和虚拟8086模式
9.存储器中数据的组织方式
大端方式 :高位字节排放在内存的低地址端,低位字节存放在高地址端。
小端方式 :低位字节存放在内存的低地址端,高位字节存放在高地址端
10.mov指令的格式: mov 寄存器名,内存单元地址
执行指令时,8086CPU自动取DS中的数据 为内存单元的段地址
11.
12.mov指令的几种形式:
mov 寄存器,数据
mov 寄存器,寄存器
mov 寄存器,内存单元
mov 内存单元,寄存器
mov 段寄存器,寄存器
13.8086CPU提供入栈和出栈指令:
PUSH (入栈)
POP (出栈)
如:
push ax
pop ax
8086CPU的入栈和出栈操作以**字**为单位进行。
14.任意时刻,SS:SP指向栈顶元素
15.push指令的执行过程
push ax
(1)SP=SP–2;
(2)将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶
16.pop指令的执行过程
pop ax
(1)将SS:SP指向的内存单元处的数据送入ax中;
(2)SP = SP+2
17.8086CPU不保证对栈的操作不会超界
18.push和pop指令是可以在寄存器和内存 之间传送数据的。
19.push、pop 实质上是一种内存传送指令,可以在寄存器和内存之间传送数据。不过,push和pop指令访问的内存单元的地址是由SS:SP指出的同时,push和pop指令还要改变 SP ,栈顶sp的变化范围为:0~FFFFH。
20.对于数据段,将它的段地址放在 DS中。对于代码段,将它的段地址放在 CS中,将段中第一条指令的偏移地址放在IP中。对于栈段,将它的段地址放在SS中,将栈顶单元的偏移地置放在 SP 中。
第四~六章 基本程序结构
1.一个汇编语言程序从写出到最终执行的简要过程:编写 –〉编译 –〉连接 –〉执行
2.
3.汇编程序从写出到执行的过程
4.用R命令可以看各个寄存器的设置情况
用U命令查看一下其他指令
用T命令单步执行程序中的每一条指令,并观察每条指令的执行结果,到了 int 21,我们要用P命令执行
使用Q命令退出Debug,将返回到command中,因为Debug是由command加载运行的
5.要完整地描述一个内存单元,需要两种信息:
(1)内存单元的地址;
(2)内存单元的长度(类型)
6.mov ax,[bx]
功能:bx 中存放的数据作为一个偏移地址,段地址 默认在ds 中,将ds:[bx]处的数据送入ax中。
即: (ax)=(ds *16 +(bx));
7.mov [bx],ax
功能:bx中存放的数据作为一个偏移地址,段地址默认在ds中,将ax中的数据送入内存ds:[bx]处。
即:(ds *16 +(bx)) = (ax)
8.CPU 执行loop指令的时候,要进行两步操作:
① (cx)=(cx)-1;
② 判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行。
9.通常,我们可以用loop指令来实现循环功能,cx 中存放循环次数
10.我们在Debug中写过类似的指令:
mov ax,[0]
表示将ds:0处的数据送入al中。
但是在汇编源程序中,指令“mov ax,[0]”被编译器当作指令“mov ax,0”处理
11.显式地指明内存单元的段地址的“ds:”、“cs:”、“ss:”或“es:”,在汇编语言中称为段前缀
12.一般,DOS方式下,DOS和其他合法的程序一般都不会使用0:200~0:2FF( 0:200h~0:2FFh)的256 个字节的空间。所以,我们使用这段空间是安全的.
13.end的作用:end 除了通知编译器程序结束外,还可以通知编译器程序的入口在什么地方。
14.end start:说明了程序的入口,可执行文件中的程序被加载入内存后,CPU的CS:IP被设置指向这个入口,从而开始执行程序中的第一条指令
15.inc bx 表示bx自加一,比add bx,1要快不少
第七章 更灵活的访存方法
1.大、小写字母的ASCII码值相差**20H**
2.通过and和or指令,进行大小写转换
3.[bx+ idata]:也可表示一个内存单元,偏移地址为(bx)+ idata
用[bx+idata]的方式进行数组处理如下:
4.SI和DI是8086CPU中和bx功能相近的寄存器,SI和DI不能分成两个8位寄存器来使用。
5.更灵活的方式:[bx+si]、[bx+di]、[bx+si+idata]
6.一般来说, 在需要暂存数据的时候,我们都应该使用**栈**。
7.在8086CPU中,只有4个寄存器(bx、 bp、si、di) 可以用在“[…]”中来进行内存单元的寻址。
可以单个出现,或只能以四种组合出现:bx和si、bx和di、bp和si、bp和di
8.只要在[…]中使用寄存器bp,而指令中没有显性的给出段地址,段地址就默认在ss中。比如:
mov ax,[bp+ si+idata]
含义: (ax)=((sS)*16+(bp)+(si)+ idata)
第八章 数据处理的两个基本问题
1.8086CPU的指令,可以处理Byte、word两种长度的数据
(1)寄存器指明
mov al,ds:[0]
(2)用操作符X ptr指明
(X =word/byte)
add word ptr [bx],2
mov byte ptr ds:[0],1
push [1 000H]
(3)其他方法(如堆栈默认以字为单位)
3.div 是除法指令,使用div 做除法的时候要注意以下问题。
(1)除数:有8位和16位俩种,在一个reg或内存单元中
(2)被除数:默认放在AX 或 DX和AX中,如果除数为8位,被除数则为16位,默认放在AX中;如果除数位16位,被除数则位32位,存放在DX和AX中,DX存放高16位,AX存放低16位。
(3)结果,若除数为8为,则AL存放商,AH存放余数。若除数为16位,AX存放商,DX存放余数。
例子如下
4.db 和 dw 定义字节型数据和字型数据。dd是用来定义dword(double word,双字)型数据的,占俩个字。
5.dup是一一个操作符,在汇编语言中同db、dw、dd等一样,由编译器识别处理,和db、dw、dd等伪指令配合使的,用来进行数据的重复。
第九章 转移指令的原理
1.offset的功能是取得标号的偏移地址,伪操作符
2.jmp为无条件转移指令,可以只修改IP也可以同时修改CS和IP。
jmp指令要给出两种信息:
(1)转移的目的地址
(2)转移的距离(段间转移、段内短转移、段内近转移)
3.jmp near ptr标号实现段内近转移。
指令jmp near ptr标号”的功能为: (IP)=(IP)+ 16位位移。
4.jmp far ptr标号:
(CS)=标号所在段的段地址;
(IP)=标号所在段中的偏移地址。
far ptr指明了指令用标号的段地址和偏移地址修改CS和IP。
5.jmp short 标号(转移到标号处执行指令)
这种实现的是段内短转移,它对IP的修改范围为-128 ~ 127,也就是说它向前最多转移128个字节,向后转移最多127个字节。jmp指令中的“short”符号说明指令是短转移。jmp指令中的“标号”是代码段中的标号,指明了指令要转移的目的地,转移指令结束后,CS:IP应该指向标号处的指令。
6.转移地址在内存中的jmp指令有两种格式。
(1)jmp word ptr 内存单元地址(段内转移)
功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址。
(2)jmp dword ptr 内存单元地址(段间转移)
功能:从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,低地址处是目标的偏移地址。
(CS)=(内存单元地址+2)
(IP)=(内存单元地址)
7.jcxz指令是一个有条件转移指令,所有的条件住哪一指令都是短转移。 IP的修改范围都为:-128 ~ 127。
指令格式:jcxz 标号(如果(CX) = 0,转移到标号处执行)
其功能的解释相当于:if((CX) == 0) jmp short 标号。
8.loop 指令为循环指令,所有的循环指令都是短转移。IP修改的范围为:-128 ~ 127.
指令格式:loop 标号((CX) = (CX) – 1, 如果(CX) != 0,转移到标号处执行)
9.“jmp 2000:0100”,是在Debug中使用的汇编指令,汇编编译器并不认识,如果在源程序中使用,编译时也会报错。
第十章 call和ret指令
1.Ret指令用栈中的数据,修改IP的内容,从而实现近转移;
(1) (IP)=((SS)x16+(sp))
(2) (sp)=(sp)+2
2.Retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移;
(1) (IP)=((SS)x16+(sp))
(2) (sp)=(sp)+2
(3) (CS)=((SS)x16+(sp))
(4) (sp)=(sp)+ 2
3.CPU执行call指令,进行两步操作:
(1)将当前的IP或CS和IP压入栈中;
(2)转移。
call指令不能实现短转移,除此之外,call指令实现转移的方法和jmp指令的原理相同.
4.call标号
(将当前的IP压栈后,转到标号处执行)
(1)(sp) = (sp)- 2
((SS)x16+(sp)) = (IP)
(2) (IP) = (IP) + 16位位移
16位位移=“标号”处的地址 一 call指令后的第一个字节的地址;
16位位移的范围为-32768~32767, 用补码表示;
16位位移由编译程序在编译时算出。
5.CPU执行指令“call 标号”时,相当于进行:
push IP
jmp near ptr 标号
6.指令“call far ptr标号”实现的是段间转移。
call far ptr标号:
(1) (sp) = (sp)- 2
((ss) X16+(sp)) = (CS)
(sp) = (sp)- 2
((ss) X16+(sp)) = (IP)
(2)(CS)=标号所在的段地址
(IP)=标号所在的偏移地址
7.call 16位寄存器
功能:
(sp) = (sp)- 2
((ss)*16+(sp)) = (IP)
(IP) = (16位寄存器)
8.转移地址在内存中
(1)call word ptr 内存单元地址
push IP
jmp word ptr 内存单元地址
(2) call dword ptr内存单元地址
push CS
push IP
jmp dword ptr 内存单元地址
9.call和ret来实现子程序
10.伪指令PROC
过程定义伪指令格式:
子程序名 PROC 属性
…
子程序名 ENDP
说明:属性分为NEAR属性和FAR属性。默认为NEAR.
11.主程序和子程序在同一个代码段使用NEAR属性。否则,使用FAR属性。
Call指令执行时,系统根据子程序名的属性决定保存断点的段地址和偏移地址。
12.mul指令
格式:
mul reg
mul 内存单元
相乘的两个数:要么都是8位,要么都是16位。
8位:AL中和8位寄存器或内存字节单元中;
16位:AX中和16位寄存器或内存字单元中。
结果:如果是8位乘法,结果默认放在AX中;如果是16位乘法,结果高位默认在DX中存放,低位在AX中放。
13.内存单元可以用不同的寻址方式给出,比如:
mul byte ptr ds:[0]
含义为:
(ax)=(al)x((ds)x16+0);
mul word ptr [bx+si+ 8]
含义为:
(ax)=(al)x((ds)x16 +(bx)+ (si)+ 8)结果的低16位;
(dx)=(al)x((ds)x16+(bx)+(si)+ 8)结果的高16位;
14.xchg指令
指令格式: XCHG OPRD1, OPRD2
目的 源
功能:将一个字节或一个字的源操作数和目的操作数相交换。
交换指令可以在寄存器之间,寄存器与存储器之间进行。
15.XCHG指令不允许的情况有以下四种:
(1)不能同时都为内存操作数
(2)任何一个操作数都不能为段寄存器
(3)任何一个操作数不能为立即数
(4)两个操作数的长度必须相等
16.
17.
第十一章 标志寄存器
1.
2.
3.ZF标志
flag的第6位是ZF,零标志位。
它记录相关指令执行后,结果为0,ZF=1;结果不为0,ZF =0
示例如下
mov ax, 1 mov aX, 1
sub ax, 1 and ax,0
指令执行后,结果为0,则ZF = 1。
mov ax,2 mov aX,I
sub ax, 1 or aX, 1
指令执行后,结果为1,则ZF = 0。
4.PF标志
flag的第2位是PF,奇偶标志位。
它记录指令执行后,结果的所有二进制位中1的个数:
为偶数,PF=1;
为奇数,PF=0。
示例如下
指令:mov al,1
add al,10
执行后,PF=0;
指令:mov al,1
or al,10
执行后,PF=1 ;
5.SF标志
flag的第7位是SF。符号标志位。
它记录指令执行后,结果为负,SF=1;结果为正,SF=0。
6.CF标志
flag的第0位是CF,进位标志位。
一般,在进行无符号数运算的时候,它记录运算结果的最高有效位向更高位的进位值,或从更高位的借位值。
示例如下
mov al,98H
add al,al
执行后: (al)=30H, CF= 1
7.OF标志
溢出:在进行有符号数运算的时候,如结果超过了机器所能表示的范围称为溢出。
注意CF和OF的区别:
CF是对无符号数运算有意义的标志位;
而OF是对有符号数运算有意义的标志位。
示例如下
mov al, 0F0H
add al, 88H
执行后:
CF=1,OF=1。
对于无符号数运算,0F0H+ 88H有进位,CF=1 ;
对于有符号数运算,0F0H+ 88H发生溢出,OF=1。
8.adc指令
adc是带进位加法指令,它利用了CF位上记录的进位值。
格式:adc操作对象1 ,操作对象2
功能:操作对象1=操作对象1 +操作对象2+ CF
示例如下
mov ax,2
mov bx,1
sub bx,ax
adc ax,1
执行后,(ax)=4。
9.adc指令和add指令相配合可以对更大的数据进行加法运算。
10.sbb指令
sbb是带借位减法指令,它利用了CF位上记录的借位值。
格式:sbb操作对象1 ,操作对象2
功能:操作对象1=操作对象1-操作对象2-CF
11.cmp指令
cmp是比较指令,功能相当于减法指令只是不保存结果。
cmp指令执行后,将对标志寄存器产生影响。
格式:cmp操作对象1 ,操作对象2
功能:计算操作对象1-操作对象2
12.
13.cmp ah,bh
(1)如果SF=1,而OF=0
OF=0,说明没有溢出,逻辑上真正结果的正负=实际结果的正负;
因SF=1,实际结果为负,所以逻辑上真正的结果为负,所以(ah) <(bh)。
(2)如果SF=1,而OF= 1因为溢出导致了实际结果为负,那么逻辑上真正的结果必然为正。
SF=1,OF = 1,说明了(ah)>(bh)。.
(3)如果SF=0,而OF= 1,因为溢出导致了实际结果为正,那么逻辑上真正的结果必然为负。
这样,SF=0,OF=1,说明了(ah)<(bh)。
(4) 如果SF=0,而OF=0(ah)≥(bh)。
14.
15.DF标志
flag的第10位是DF,方向标志位。
在串处理指令中,控制每次操作后si, di的增减。
DF = 0:每次操作后si,di递增;
DF = 1:每次操作后si,di递减。
16.串传送指令
格式1 :movsb
功能:(以字节为单位传送)
(1) ((es)X16 + (di)) = ((ds) X 16 + (si))
(2)如果DF=0则:(si)=(si)+1
(di)=(di)+1
如果DF=0则:(si)=(si)-1
(di)=(di)-1
格式2:movsw
功能:(以字为单位传送)
将ds:si指向的内存字单元中word送入es:di中,然后根据标志寄存器DF位的值,将si和di递增2或递减2。
17.一般,movsb和movsw都和rep配合使用。
rep movs b
用汇编语法来描述rep movsb的功能就是:
S:movsb
loop S
rep movsw
用汇编语法来描述rep movsw的功能就是:
S: movsw
loop S
18.对DF位进行设置:
cld指令:将标志寄存器的DF位置0
std指令:将标志寄存器的DF位置1
19.pushf :将标志寄存器的值压栈;
popf :从栈中弹出数据,送入标志寄存器中。
第十二章 中断
1.中断源分为软件中断和硬件中断,软件中断又称为内中断,硬件中断称为外部中断。
2.软件中断
(1)由中断指令int n引起。n指出中断类型
(2)由CPU的某些错误引起:除法错中断(类型号0)、溢出中断( 类型号4)
(3)为调试程序DEBUG设置的中断:单步中断(类型号1)、断点中断(类型号3)
3.CPU用8位的中断类型码通过中断向量表找到相应的中断处理程序的入口地址。
4.
5.80 86CPU的中断过程:
(1)取得中断类型码;
(2)标志寄存器的值入栈
(3)设置标志寄存器的第8位TF和第9位IF的值为0
(4) CS的内容入栈;
(5) IP的内容入栈;
(6)从内存地址为中断类型码x4和中断类型码x4+2的两个字单元中读取中断处理程序的入口地址设置IP和CS。
6.中断处理程序的编写方法:
(1)保存用到的寄存器。
(2)处理中断。
(3)恢复用到的寄存器。
(4)用iret指令返回。
iret指令的功能用汇编语法描述为:
pop IP
pop CS
7.编译处理0号中断
8.Debug利用单步中断来实现T命令的功能,也就是说,用T命令执行一条指令后,CPU响应单步中断,执行Debug设置好的处理程序,才能在屏幕上显示寄存器的状态,并等待命令的输入。
9.有几种特殊情况CPU不能响应中断: .
(1) 当执行到STI指令时,CPU不会马上响应中断。STI指令是开中断指令,要求在开放中断后再执行后续的一条指令后才能响应中断;
(2)IRET指令是中断子程序返回指令,它也要求再执行一条后续指令后才能响应中断。这样做的目的是保护系统能够正常运行;
(3)当执行MOV SS,AX指令,即向SS段寄存器传送数据时,即使发生了中断,CPU也不会响应;直到本条执行完后,接着再执行一条指令才响应中断。
第十三章 中断程序设计 + 宏
1.软件中断子程序的编写
(1)保存现场;
(2) STI开中断指令 ;如允许中断嵌套,则开中断
(3)处理中断;
(4) CLI关中断指令;
(5)恢复现场;
(6) IRET指令,返回被中断的程序
2.屏幕及光标控制INT 10H
(1)光标大小设置
格式: AH=01H
CH=光标开始行
CL=光标结束行
INT 10H
(2)设置光标位置
格式: AH=02H
DH=行号
DL=列号
BH=页号
INT10H
(3)读光标位置
格式: AH=03H
BH=页号
INT 10H
返回值:DH=行号,DL=列号,CX=光标大小
3.宏是源程序中一段有独立功能的程序代码。宏也可以称为宏指令、宏操作。
宏的使用需要经过三个步骤:宏定义、宏调用和宏展开。
4.
5.宏与子程序都是编写结构化程序的重要手段,两者各有特色。
●相同之处:宏和子程序都可以定义为一段功能程序,可以被其他程序调用。
●不同之处:
(1)宏指令利用哑元和实元进行参数传递。宏调用时用实元取代哑元,避免了子程序因参数传递带来的麻烦。使宏汇编的使用增加了灵活性。
(2)实元还可以是指令的操作码或操作码的一部分,在编译汇编的过程中指令可以改变。
(3)宏调用的工作方式和子程序调用的工作方式是完全不同的。
第十四~十六章 端口、外中断、
1.CPU可以直接读写3个地方的数据:(1) CPU内部的寄存器;(2)内存单元;(3)端口。
2.端口的读写指令只有两条:In、Out
3.注意:在in和out指令中,只能使用ax或al来存放从端口中读入的数据或要发送到端口中的数据。
访问8位端口时用al,访问16位端口时用ax。
4.shl逻辑左移指令,功能为:
(1)将一个寄存器或内存单元中的.数据向左移位;
(2)将最后移出的一位写入CF中;
(3)最低位用0补充。
5.shr逻辑右移指令,sh|刚好相反:
(1)将一个寄存器或内存单元中的数据向右移位;
(2)将最后移出的一-位写入CF中;
(3)最高位用0补充。
6.内中断所弓|发的中断过程:
(1)取中断类型码n;
(2)标志寄存器入栈,|F=0,,TF=0;
(3) CS、IP入栈;
(4) (IP)=(nx4), (CS)=(nx4 +2)
由此转去执行中断处理程序。
7.PC机键盘的处理过程
按下一个键时,开关接通,产生一个扫描码(通码),松开按下的键时,也产生一个扫描码(断码)。扫描码说明了松开的键在键盘上的位置。扫描码被送入主板中60H端口的寄存器中。
8.断码=通码+80H
9.键盘输入的处理过程:
(1)键盘产生扫描码;
(2)扫描码送入60h端口;
(3)引发9号中断;
(4) CPU执行int 9中断例程处理键盘输入。
10.数据传送指令
比如:mov、push、 pop、pushf、 popf、 xchg等都是数据传送指令,这些指令实现寄存器和内存、寄存器和寄存器之间的单个数据传送。
11.算术运算指令
比如:add、sub、 adC、sbb、 inC、 deC、 cmp、imul、idiv、 aaa等都是算术运算指令,
这些指令实现寄存器和内存中的数据的算数运算。
它们的执行结果影响标志寄存器的: sf、 zf、of、cf、pf、af位。
12.逻辑指令
比如:
and、or、not、xor、test、shl、 shr、sal、sar、rol、 ror、rcl、 rcr 等都是逻辑指令。
除了not指令外,它们的执行结果都影响标志寄存器的相关标志位。
13.转移指令
可以修改IP或同时修改CS和IP的指令统称为转移指令。转移指令分为以下几类:
(1)无条件转移指令,比如: jmp;
(2)条件转移指令,
比如: jCXZ、 je、jb、ja、, jnb、 jna等;
(3)循环指令,比如: loop;
(4)过程,比如: call、 ret、retf;
(5) 中断,比如int、iret。
14.处理机控制指令
这些指令对标志寄存器或其他处理机状态进行设置,
比如:cld、std、cli、 sti、 nop、clc、 cmC、stc、hlt、wait、esc、lock等都是处理机控制指令。
15.串处理指令
对内存中的批量数据进行处理
比如: movsb、 m0vSW、cmps、sCaS、 lods、stos等。
)键盘产生扫描码;
(2)扫描码送入60h端口;
(3)引发9号中断;
(4) CPU执行int 9中断例程处理键盘输入。
10.数据传送指令
比如:mov、push、 pop、pushf、 popf、 xchg等都是数据传送指令,这些指令实现寄存器和内存、寄存器和寄存器之间的单个数据传送。
11.算术运算指令
比如:add、sub、 adC、sbb、 inC、 deC、 cmp、imul、idiv、 aaa等都是算术运算指令,
这些指令实现寄存器和内存中的数据的算数运算。
它们的执行结果影响标志寄存器的: sf、 zf、of、cf、pf、af位。
12.逻辑指令
比如:
and、or、not、xor、test、shl、 shr、sal、sar、rol、 ror、rcl、 rcr 等都是逻辑指令。
除了not指令外,它们的执行结果都影响标志寄存器的相关标志位。
13.转移指令
可以修改IP或同时修改CS和IP的指令统称为转移指令。转移指令分为以下几类:
(1)无条件转移指令,比如: jmp;
(2)条件转移指令,
比如: jCXZ、 je、jb、ja、, jnb、 jna等;
(3)循环指令,比如: loop;
(4)过程,比如: call、 ret、retf;
(5) 中断,比如int、iret。
14.处理机控制指令
这些指令对标志寄存器或其他处理机状态进行设置,
比如:cld、std、cli、 sti、 nop、clc、 cmC、stc、hlt、wait、esc、lock等都是处理机控制指令。
15.串处理指令
对内存中的批量数据进行处理
比如: movsb、 m0vSW、cmps、sCaS、 lods、stos等。
若要使用这些指令方便地进行批量数据的处理,则需要和rep、repe、 re pne等前缀指令配合使用。