1、微机原理与接口技术李宝平计算机学院通信工程系80 x86指令系统指令系统 80 x86指令系统指令系统 指令指令 控制计算机完成指定操作的命令控制计算机完成指定操作的命令机器指令机器指令指令的二进制代码形式。例如:指令的二进制代码形式。例如:CD21H汇编指令汇编指令助记符形式的指令。例如:助记符形式的指令。例如:INT 21H指令系统指令系统CPU所有指令及其使用规则的集合所有指令及其使用规则的集合80 x86指令系统指令系统 参见 附录1 8086/8088 指令系统 P458(1)数据传送类;)数据传送类;(2)算术运算类;)算术运算类;(3)逻辑运算和移位;)逻辑运算和移位;(4)串操
2、作;)串操作;(5)控制转移类;)控制转移类;(6)处理器控制。)处理器控制。80 x86指令系统指令系统 说明要执行的是说明要执行的是什么操作什么操作操作对象,可以有操作对象,可以有0个、个、1个或个或2个个目的目的源源80 x86指令系统指令系统 指令举例:ADD AX,SI+6MOV AX , BX操作码 操作数INC BXHLT80 x86指令系统指令系统 80 x86指令系统指令系统 MOV AX,0FA00H;正确正确MOV 8000H,DX;错误错误操作数操作数数据(立即数)数据(立即数)地址地址: 寄存器寄存器(名称名称)、存储器单元(地址)、存储器单元(地址) I/O接口的端
3、口(地址)接口的端口(地址)80 x86指令系统指令系统 放在放在8个个通用寄存器通用寄存器或或4个个段寄存器段寄存器中的操作数中的操作数1 6 位位B XB HB L1 6 位位C XC HC L1 6 位位D XD HD L表示参加运算的数存放在指令给出的寄存器中,可以是表示参加运算的数存放在指令给出的寄存器中,可以是16位或位或8位。位。80 x86指令系统指令系统 只能存放字操作数只能存放字操作数段寄存器存放段寄存器存放当前操作数的当前操作数的段基地址段基地址可可作为源或目的操作数作为源或目的操作数(但但CS不作为目的操作数不作为目的操作数), 不允许将不允许将立即数传送到段寄存器立即
4、数传送到段寄存器, 可通过某个通用寄存器传递改变可通过某个通用寄存器传递改变SIDIBPSPCSDSESSS80 x86指令系统指令系统 存储器操作数存储器操作数字节字节字字双字双字124类型类型存储单元个数存储单元个数一般不允许一般不允许两个两个操作数同时为存储器操作数操作数同时为存储器操作数Flags 标志寄存器: 仅有个别指令可用它作为操作数 IP 不能用指令指针寄存器: 它作为操作数, 顺序执行时它自动加1,跳转执行时自动会跳转表示当前参加运算的数存放在存储器的某表示当前参加运算的数存放在存储器的某1/2/4个单元中个单元中80 x86指令系统指令系统 存储单元的存储单元的物理地址物理
5、地址 = 段基地址段基地址16 + 偏移地址偏移地址若指令中没有指明所涉及的段寄存器,CPU就采用默认的段寄存器来确定操作数所在的段。表表3.3 段寄存器使用的一些基本约定段寄存器使用的一些基本约定80 x86指令系统指令系统 存储器操作数的存储器操作数的偏移地址偏移地址(也称(也称有效地址有效地址EA)要要用用“EA”方括方括号括起来号括起来, 它它可以通过不同的寻址方式由指令给出可以通过不同的寻址方式由指令给出; 存储器操作数的存储器操作数的段基地址段基地址(也称也称段段头地址头地址)一般省去,按隐含规一般省去,按隐含规则确定它们,也可直接给出进行段超越。则确定它们,也可直接给出进行段超越
6、。例如例如 若若(BX)=2000H, (SI)=0A00H, (DI)=2A00H, 则以下指令的结果是一样的:则以下指令的结果是一样的:MOV AL, 2A00H ;隐含段头为隐含段头为DS,直接寻址,直接寻址MOV AL, BX+0A00H ;隐含段头为隐含段头为DS ,寄存器相对寻址,寄存器相对寻址MOV AL, BXSI ;隐含段头为隐含段头为DS,基址,基址-变址寻址变址寻址MOV AL, DI ;隐含段头为隐含段头为DS,寄存器间接寻址,寄存器间接寻址但但 MOV AL, ES:2A00H ; 段超越,段头为段超越,段头为ES,与前,与前4条不同条不同存储单元的存储单元的物理地址
7、物理地址 = 段基地址段基地址16 + 偏移地址偏移地址注意:注意:存储器数据表示形式:存储器数据表示形式: 地址值或寄存器地址值或寄存器80 x86指令系统指令系统 I/O接口操作数接口操作数字节字节字字12类型类型 存储单元个数存储单元个数一般不允许一般不允许两个两个操作数同时为操作数同时为I/O接口接口操作数操作数I/O接口地址为接口地址为16位位,一般采用,一般采用DX寄存器间接寻址给出;有时寄存器间接寻址给出;有时I/O接口地址仅用接口地址仅用8位位,这时可采用直接寻址。,这时可采用直接寻址。例如:IN AL,DX; 括号习惯都省去写为 IN AL,DX OUT 80H,AL;括号习
8、惯都省去写为 OUT 80H,AL注意:注意:不要理解为:MOV AL, DX 和MOV 80H,AL ,它们完全不同。表示当前参加运算的数存放在表示当前参加运算的数存放在I/O接口的某接口的某1/2个端口中个端口中80 x86指令系统指令系统 取指令取指令取操作数取操作数执行指令执行指令传送结果传送结果单位用时钟周期数单位用时钟周期数T表示表示常用指令执行时间常用指令执行时间 P458P458计算偏移地址计算偏移地址EAEA所需时间所需时间结论:结论: 1)尽量使用寄存器作为操作数)尽量使用寄存器作为操作数 2)若有可能,用移位代替乘除法)若有可能,用移位代替乘除法 3)尽量使用简单的寻址方
9、式)尽量使用简单的寻址方式执行执行80 x86指令系统指令系统 80 x86指令系统指令系统 l 操作数操作数(为一常数为一常数)直接直接由指令给出由指令给出 (此操作数称为此操作数称为立即数立即数)l 立即寻址只能用于源操作数立即寻址只能用于源操作数l 例:例: MOV AX, 1C8FH MOV BYTE PTR2A00H, 8FH 错误例:错误例: MOV 2A00H, AX ; 错误!错误! 80 x86指令系统指令系统 立即数立即数操作码操作码低低8位位高高8位位存储器存储器MOV操作码操作码02H31HAHAL代码段代码段立即寻址指令在存立即寻址指令在存储器中的存放形式储器中的存放
10、形式AX指令操作例:指令操作例:MOV AX,3102H ; AX 3102H 执行后,执行后,(AH) = 31H,(AL) = 02H用途:用途:直接给出操作数据,立即数存放在内存的代码段中80 x86指令系统指令系统 l 操作数放在某个寄存器中操作数放在某个寄存器中l 源操作数与目的操作数字长要相同源操作数与目的操作数字长要相同l 寄存器寻址与段地址无关寄存器寻址与段地址无关l 例:例: MOV AX, BX MOV 3F00H, AX MOV CL, AL 错误例:错误例: MOV AX, BL ; 字长不同字长不同 MOV ES: AX, DX ; 寄存器与段无关寄存器与段无关80
11、x86指令系统指令系统 AXSI2233H2233H指令操作例:指令操作例:MOV SI,AX ; SI (AX) 指令执行前:(AX)=2233H 指令执行后:(AX)=2233H,(SI)=2233H用途:用途:操作数存放在寄存器中,根据寄存器名称寻找寄存器里面的数据。80 x86指令系统指令系统 l 指令指令中直接给出中直接给出存储器操作数的存储器操作数的16位位偏移地址偏移地址 或或I/O接口接口仅仅8位端口地址位端口地址 存储器偏移地址也称为存储器偏移地址也称为有效地址有效地址(EA, Effective Address)l存储器存储器默认默认的段寄存器为的段寄存器为DS, 但也可以
12、显式地指定其他段寄存器但也可以显式地指定其他段寄存器称为称为段超越段超越前缀前缀l存储器偏移地址也可用存储器偏移地址也可用符号地址符号地址来表示,如来表示,如ADDR、VARl 例:例: MOV AX , 2A00H; 段头隐含为段头隐含为DS MOV DX , ES: 2A00H;段超越;段超越 MOV SI , TABLE_PTR; 段头隐含为段头隐含为DS还有:还有: IN AL,90H;括号可以省去;括号可以省去 OUT 85H,AL;括号可以省去;括号可以省去80 x86指令系统指令系统 例:例:MOV AX,3102H ;AL (3102H) , AH (3103H)如果(DS)=
13、2000H, (23102H) = CDH, (23103H) = ABH则操作数的物理地址为: 20000H+3102H = 23102H指令执行后:(AX) = ABCDHMOV操作码操作码02H31HAHAL23102HCDHABH存储器存储器代码段数据段.23103H用途:用途:用于操作数存放在存储器单元中 或I/O接口地址仅为8位的的端口中80 x86指令系统指令系统 EA = (BX)(BP)(SI)(DI)80 x86指令系统指令系统 44H33H60001200DSSI6000061200 61200HAX存储器存储器数据段 +) 120044H33H用途:用途:操作数存放在存
14、储器或I/O接口地址为16位的的寻址80 x86指令系统指令系统 l EA=间址寄存器的内容间址寄存器的内容 + 8/16位的位移量位的位移量寄存器相对寻址寄存器相对寻址常用于存取表格或一维数组中的常用于存取表格或一维数组中的元素元素把把表格的起始地址作为位移量表格的起始地址作为位移量,元素的下元素的下标值放在间址寄存器中标值放在间址寄存器中(或反之)(或反之)EA = (BX)(BP)(SI)(DI)+ 8位16位位移量 80 x86指令系统指令系统 80 x86指令系统指令系统 操作码操作码00 偏移量低2A 偏移量高DS 60000BX 1000 + DATA 2A0063A0063A0
15、0HAHALAX代码段数据段.66H55HMOV AX,DATABX用途:用途:操作数存放在存储器地址指定的单元中80 x86指令系统指令系统 l 若操作数的偏移地址:若操作数的偏移地址: 由由基址寄存器基址寄存器( (BXBX或或BPBP) )给出给出 基址寻址方式基址寻址方式 由由变址寄存器变址寄存器( (SISI或或DIDI) )给出给出 变址寻址方式变址寻址方式l 由一个基址寄存器由一个基址寄存器的内容和一个变址寄存器的内容和一个变址寄存器的内的内容相加而形成操作数的偏移地址容相加而形成操作数的偏移地址,称为称为基址基址-变址寻变址寻址址。EA = (BX)(BP)+ (SI)(DI)
16、l 同一组内的寄存器不能同时出现同一组内的寄存器不能同时出现。基址寄存器基址寄存器变址寄存器变址寄存器80 x86指令系统指令系统 用途:用途:操作数存放在存储器地址指定的单元中80 x86指令系统指令系统 83000操作码操作码DS 80000BX 2000 + SI 100083000HAHALAX代码段数据段.YYXX指令操作例:指令操作例:MOV AX,BXSI假定:假定:(DS)=8000H, (BX)=2000H, SI=1000H则物理地址则物理地址 = 80000H + 2000H + 1000H = 83000H= 80000H + 2000H + 1000H = 83000
17、H指令执行后指令执行后: (: (AL)AL)=83000H83000H ( (AH)AH)=83001H83001H 80 x86指令系统指令系统 l 在基址在基址-变址寻址的基础上再加上一个相对位变址寻址的基础上再加上一个相对位移量移量l 注意事项同注意事项同基址基址-变址寻址变址寻址EA = (BX)(BP)+ (SI)(DI)+ 8位16位位移量 l 例:例:MOV AX,BASE SI BXMOV AX,BX+BASE SIMOV AX,BX+SI+BASEMOV AX,BX BASE SIMOV AX,BX+SI BASE基址基址变址变址用途:用途:操作数存放在存储器地址指定的单元
18、中80 x86指令系统指令系统 指令指令操作例:操作例:MOV AX,DATADIBX若(DS)=8000H, (BX)=2000H, (DI)=1000H, DATA=200H则指令执行后(AH)=83021H, (AL)=83020H8320083200HAHALAX+ DATA 0200操作码操作码代码段数据段.YYXXDS 80000BX 2000DI 100080 x86指令系统指令系统 使用相对的基址使用相对的基址-变址寻址方式可以很方便地访变址寻址方式可以很方便地访问二维数组问二维数组。基址寄存器基址寄存器数组首地址数组首地址变址寄存器变址寄存器数组元素数组元素行行址址位移量位移
19、量数组元素数组元素列列址址(偏移地址)(偏移地址)二维数组例:内存图示(按行存储)二维数组例:内存图示(按行存储)(行位移地址)(行位移地址)(行内元素下标)(行内元素下标)1 8 32 5 24 0 9A = 80 x86指令系统指令系统 80 x86指令系统指令系统 l 指令操作数是隐含的,在指令中未显式地指明。指令操作数是隐含的,在指令中未显式地指明。l 例:例:MUL BL 指令隐含了被乘数指令隐含了被乘数AL及乘积及乘积AXl 类似的指令还有:类似的指令还有:XLAT、DIV、CBW、MOVS等等(AL)()(BL)AX用途:用途:操作数存放在寄存器或存储器地址指定的单 元中80 x
20、86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 JMP NEAR PTR PROGIA; (IP)(IP)当前当前+16位位移量位位移量 段内直接寻址JMP NEAR PTR PROGIAOPOP00H00H12H12H.OPOP03H03HPROGIA=3172AHPROGIA=3172AH(IP)IP)当前当前 = = 3052AH3052AH1616位的位移量位的位移量3172AH-3052AH3172AH-3052AH存储器存储器跳转跳转80 x86指令系统指令系
21、统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 OPOP34H34H12H12H00H00H50H50H.存储器存储器2000:1000H2000:1000HJMP FAR CCCJMP FAR CCCCCC:CCC:5000:1234H5000:1234H.2000H2000H段段5000H5000H段段80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 l指令由(指令由( )和()和( )构成)构成l如何取得操作数如何取得操作数称为(称为( )操作
22、码操作码 操作数操作数寻址方式寻址方式80 x86指令系统指令系统 l寻址方式可分寻址方式可分8种种立即寻址立即寻址直接寻址直接寻址 - 针对针对M、I/O寄存器相对寻址寄存器相对寻址 - 针对针对M寄存器寻址寄存器寻址 - 针对针对R基址基址-变址寻址变址寻址 - 针对针对M基址基址-变址相对寻址变址相对寻址- 针对针对M寄存器间接寻址寄存器间接寻址 - 针对针对M、I/O隐含寻址隐含寻址 - 针对针对R、M80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80
23、x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 l应用举例:将1000H开始的100个存储单元 全部填充为ASCII码2AH(*)。程序段如下( (例例001)001) MOV DI,1000H MOV CX,64H MOV AL,2AH;*AGAIN:MOV SI,AL INC SI DEC CX JNZ AGAIN HLT80 x86指令系统指令系统 上程序段存放在代码段代码段中,设(CS)=109EH,则各条指令存放地址如下: CS : IP CS : IP 指令指令109E : 0100 M
24、OV DI,1000H109E : 0103 MOV CX,64H109E : 0106 MOV AL,2AH109E : 0108 MOV DI,AL109E : 010A INC DI109E : 010B DEC CX109E : 010C JNZ 0108109E : 010E HLT109E : 011080 x86指令系统指令系统 写入2AH(*)后,数据段中相应存储单元的内容改变如下:DS:1000DS:1000 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2ADS:1010DS:1010 2A 2A 2A 2A 2A 2A 2A 2
25、A 2A 2A 2A 2A 2A 2A 2A 2ADS:1020DS:1020 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2ADS:1030DS:1030 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2ADS:1040DS:1040 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2ADS:1050DS:1050 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2A 2ADS:1060DS:1060 2A 2A 2A 2A8
26、0 x86指令系统指令系统 80 x86指令系统指令系统 什么是堆栈?什么是堆栈? 按按“后进先出后进先出(LIFO)(LIFO)”方式工作的存储方式工作的存储区域。堆栈区域。堆栈以字为单位以字为单位进行压入弹出操作。进行压入弹出操作。为什么要设置堆栈?为什么要设置堆栈?为什么要按为什么要按 “后进先出后进先出”方式工作?方式工作?参见下图参见下图80 x86指令系统指令系统 主程序IP继续执行主程序执行子程序转子程序压栈弹出返回主程序主程序IPIP(下)继续执行主程序转子程序1返回主程序IP执行子程序 2转子程序2返回子程序1IP(下)执行子程序1继续执行子程序1(a)(b)子程序调用示意图
27、(a) 主程序调子程序; (b) 子程序嵌套示意图压栈弹出IP(下)80 x86指令系统指令系统 SPSS堆栈段堆栈段进栈方向退栈方向栈底栈底栈顶栈顶80 x86指令系统指令系统 80 x86指令系统指令系统 设(AX)=1020H,执行示意图如图所示低地址存储区(SS段)执行前(AX)=1020(SP)存储区(SS段)进栈方向执行后2010(AL)(AH)PUSH AX指令执行示意图指令执行示意图(SP)-2(SP)高地址低地址高地址(SP)- -180 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 POP BX 的执行示意图如下图所示低地址存储区(SS
28、段)出栈方向执行前2010POP BX指令执行示意图指令执行示意图(SP)存储区(SS段)执行后(BX)=1020(SP)(SP)+1(SP)+2BX2010高地址低地址高地址80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 注意:注意:转换表长度最大为转换表长度最大为256256个表项个表项( (字节字节) )。80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 下面
29、两条指令等效: LEA BX,BUFFER MOV BX, OFFSET BUFFER其中OFFSET BUFFER表示存储器单元BUFFER的偏移地址。二者都可用于取存储器单元的偏移地址,但LEA指令可以取动态的地址,OFFSET只能取静态的地址。80 x86指令系统指令系统 4.标志传送指令共有四条:(1)(1)读标志指令读标志指令LAHF (例例006) LAHF把标志寄存器低8位中的5个标志位传送到AH中的指定位,如下图所示:1D3D5D7D6D4D2D0DOF DF IF TF SF ZFAFPFCFAHLAHF指令的功能FLAG80 x86指令系统指令系统 (2)(2)设置标志指令
30、设置标志指令SAHF SAHF的功能与LAHF的功能正好相反,用图来示意,只要将上图中5个箭头方向反一下即可。1D3D5D7D6D4D2D0DOF DF IF TF SF ZFAFPFCFAHSAHF指令的功能FLAG80 x86指令系统指令系统 80 x86指令系统指令系统 . . .80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 无符号数无符号数和和有符号数有符号数均不溢出均不溢出二进制相加 无符号数加 有符号数加 0000 1000 8 +8+0001 1110 + 30 + (+30) 0010 0110 38 +
31、38 结果38 CF=0 OF=0无符号数范围0255 带符号数范围-12812780 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 56H2CHBEH47HBUFFER1BUFFER2ACHF8H9EH30H被加数加数数据段多字节加法多字节加法示意图示意图 .80 x86指令系统指令系统 80 x86指令系统指令系统 ADD/ADC指令指令对条件标志位对条件标志位(CF/OF/ZF/SF)的影响:的影响:CF位表示无符号数相加的溢出。位
32、表示无符号数相加的溢出。OF位表示带符号数相加的溢出。位表示带符号数相加的溢出。1 结果为负结果为负0 否则否则SF=1 结果为结果为00 否则否则ZF=1 和的最高有效位有向高位的进位和的最高有效位有向高位的进位0 否则否则CF=1 两个操作数符号相同,而结果符号与之相反两个操作数符号相同,而结果符号与之相反0 否则否则OF=80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 例:例:x、y、z均为均为32位数,分别存放在地址为位数,分别存放在地址为X, X+2;Y,Y+2; Z,Z+2的 存 储 单 元 中 , 用 指 令
33、 序 列 实 现的 存 储 单 元 中 , 用 指 令 序 列 实 现wx+y+24-z,结果放在,结果放在W, W+2单元中。单元中。(例例007) MOV AX, X MOV DX, X+2 ADD AX, Y ADC DX, Y+2 ; x+y ADD AX, 24 ADC DX, 0 ; x+y+24 SUB AX, Z SBB DX, Z+2 ; x+y+24-z MOV W, AX MOV W+2, DX ; 结果存入结果存入W, W+2单元单元80 x86指令系统指令系统 注:注:该指令与该指令与INC一样,它不影响一样,它不影响CF标志,但对标志,但对AF/OF/PF/SF/Z
34、F会产生影响。会产生影响。80 x86指令系统指令系统 80 x86指令系统指令系统 SUB/SBB指令指令对标志位对标志位(CF/OF/ZF/SF)的影响:的影响: CF=1表示无符号数减法溢出。表示无符号数减法溢出。 OF=1表示带符号数减法溢出。表示带符号数减法溢出。NEG指令指令对对CF/OF的影响:的影响: CF:操作数为:操作数为0时,求补的结果使时,求补的结果使CF=0,否则,否则CF=1。 OF:字节运算对:字节运算对-128求补或字运算对求补或字运算对-32768求补时求补时OF=1, 否则否则OF=0。1 被减数的最高有效位有向高位的被减数的最高有效位有向高位的借位借位0
35、否则否则CF=1 两个操作数符号相反,而结果的符号与减数相同两个操作数符号相反,而结果的符号与减数相同0 否则否则OF=80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 思考思考: 程序的结果? (AL、BL、CL中数据的大小顺序)80 x86指令系统指令系统 80 x86指令系统指令系统 注意:注意:MUL/IMUL指令中 AL(AX)为隐含的乘数寄存器; AX(DX,AX)为隐含的乘积寄存器; SRC不能为立即数; 除CF和OF外,对其它标志位无定义。80 x86指令系统指令系统 MUL/IMUL乘法指令对乘法指令对CF/OF的影响:的影响:00 乘
36、积的高一半为零乘积的高一半为零11 否则否则MUL指令指令: CF/OF =00 乘积的高一半是低一半的符号扩展乘积的高一半是低一半的符号扩展11 否则否则 IMUL指令指令: CF/OF =例:例:(AL) = A5H(-5B),(BL) = 11H(例(例009) (1) IMUL BL ; (AX) (AL)(BL) ; A511 -5B11=-060B F9F5 ; (AX) = F9F5H CF=OF=1 (2) MUL BL ; (AX) (AL)(BL) ; A511= 0AF5 ; (AX) = 0AF5H CF=OF=1 80 x86指令系统指令系统 80 x86指令系统指令
37、系统 80 x86指令系统指令系统 80 x86指令系统指令系统 关于除法操作中的字长扩展问题关于除法操作中的字长扩展问题80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 这个1代表了16,而实际上仅应为10,即多进了6。 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 06H02H09H01HSTRING1STRING208H05H06H03H被加数加数数据段85629163SUM结果.非压缩非压缩BCD码码3改为改为0SIDIBXCXCXCX80 x
38、86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 若AL的低4位9AF=1,则: AL(AL)-6, 且AF1 若AL的高4位9CF=1,则: AL(AL)-60H,且CF1 注意:注意: AAS、DAS对标志位的影响与AAA、DAA相同。 AAS、 DAS指令要求紧跟在减法指令SUB或SBB之后。80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统
39、 1.1.逻辑运算指令逻辑运算指令( (与与/ /或或/ /异或异或/ /非非) ) 运算规则:按位操作,无进运算规则:按位操作,无进/ /借位借位 对标志位的影响对标志位的影响( (除除NOTNOT指令外指令外) ): CF OF SF ZF PF AF 0 0 * * * 无定义无定义 根据运算结果设置根据运算结果设置 注意注意: 非指令非指令NOT对标志无影响对标志无影响80 x86指令系统指令系统 80 x86指令系统指令系统 (1) 逻辑”与” AND对两个操作数进行按位逻辑“与”操作。格式:AND dest, src用途:保留操作数的某几位,清零其他位。例1:保留AL中低4位,高4
40、位清0。 AND AL, 0FH例2:AL中有字符az, 将其转换成大写。80 x86指令系统指令系统 例3:测试AL的bit7,bit5,bit2是否都是1。AND AL, 10100100BCMP AL, 10100100B JZ YES ; if match, go to YES ; if not matchYES: ; goes here if all 1 80 x86指令系统指令系统 格式:OR dest, src用途:对操作数的某几位置1; 对两操作数进行组合。(2) 逻辑”或” OR80 x86指令系统指令系统 例2:例3:把AL的第的第5位置为位置为1 OR AL, 00100
41、000B80 x86指令系统指令系统 格式NOT mem/reg(3) 逻辑“非”(取反) NOT80 x86指令系统指令系统 (4) 逻辑”异或” XOR 80 x86指令系统指令系统 (5) 测试指令TEST例例01580 x86指令系统指令系统 表4-4 移位操作类指令2.移位指令80 x86指令系统指令系统 CMSARCMSHR0CMSAL0CMSHL0CRCRCRCLCRORCROLC 进 位 标 志 ; M 最 高 位 (符 号 位 )80 x86指令系统指令系统 2.移位指令CL ;移位位数1时1 ;移位位数=1时80 x86指令系统指令系统 最低位最高位CF0(a)算术/逻辑左
42、移 SAL/SHL最低位最高位CF(b)算术右移 SAR最低位最高位CF(c)逻辑右移 SHR0非循环非循环移位指令移位指令功能示意图功能示意图80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 最低位最高位CF(a) ROL最低位最高位CF(c) RCL最低位最高位CF(b) ROR最低位最高位CF(d) RCR循环移位指令功能示意图循环移位指令功能示意图80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 1000H3000H1234567832H31H34H33H 36H35H38H
43、37H 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 REP CX0 时重复执行REPE/REPZ CX0ZF=1时重复执行REPNE/REPNZ CX0ZF=0时重复执行80 x86指令系统指令系统 表 4 5 串操作指令80 x86指令系统指令系统 串指令使用的一般方法:设置源串地址设置源串地址设置目标串地址设置目标串地址设置串长度设置串长度设置操作方向设置操作方向DF串指令串指令MOV SI, 源串首地址源串首地址(或(或LEA SI, 源串源串)MOV DI, 目的串首地址目的串首地址(或(或LEA DI, 目的串目的串)MOV CX, 串长
44、度串长度CLD(或(或STD)串指令串指令注意: DS与ES一般在完整程序的开始处设置, 在此串指令的程序段中不必重复设置80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 指令执行的操作为:CMPSBCMPSB: CMPSWCMPSW: 比较的结果只反映在标志位上,串本身无变化。本指令可用来检查两个串是否相等。格式:格式:CMPS OPRD1,OPRD2 CMPSB CMPSW80 x86指令系统指令系统 JZ STOP DEC SI MOV AL,SI MOV BX,SISTOP:HLT LEA SI,MEM1LEA DI,MEM2MOV CX,200
45、CLD REPE CMPSB 80 x86指令系统指令系统 执行的操作:执行的操作: 对字节:对字节:ALES:DI DIDI 对字:对字: AXES:DI1DI DI DI搜索指令执行的仍是比较搜索指令执行的仍是比较(减法减法)操作操作,结果只影响结果只影响标志位。标志位。要搜索的关键字放在要搜索的关键字放在AL(字节字节)或或AX(字字)中。中。格式:格式:SCAS OPRD SCASB SCASW80 x86指令系统指令系统 进行连续扫描比较:若前缀为REPZ,则表示比较结果相等且(ZF=1)且串未结束(CX0),则继续比较。若前缀为REPNZ,则表示比较结果不相等(ZF=0)且串未结束
46、(CX0)就继续比较。80 x86指令系统指令系统 例:例:在在ES段的偏移段的偏移1000H开始处存有开始处存有10个个ASCII码。搜码。搜索索E,若找到则记下搜索次数及存放地址,并在屏幕上,若找到则记下搜索次数及存放地址,并在屏幕上显示显示Y;若未找到则显示;若未找到则显示N。(例例016)1000H414243444546ABCDF. . .ES段E80 x86指令系统指令系统 MOV DI, 1000H ;(DI)串偏移地址串偏移地址 MOV CX, 0AH ;(CX)串长度串长度 MOV AL, E ;搜索关键字;搜索关键字=E CLD ;从低地址到高地址进行搜索;从低地址到高地址
47、进行搜索 REPNZ SCASB ;若未找到;若未找到, 继续搜索继续搜索 JZ FOUND ;找到;找到, 转至转至FOUND MOV DL, N ;串中无;串中无E,(DL)N JMP DONE ;转至;转至DONEFOUND:DEC DI ;指针回退;指针回退 MOV ADDR, DI ;ADDRE的地址的地址 SUB DI, 1000H MOV NUM, DI ;NUM搜索次数搜索次数 MOV DL, Y ;(DL)YDONE: MOV AH, 2 INT 21H ;显示字符;显示字符 HLT 80 x86指令系统指令系统 格式: LODS OPRD LODSB LODSW80 x86
48、指令系统指令系统 格式:格式:STOS OPRD STOSB STOSW80 x86指令系统指令系统 80 x86指令系统指令系统 例例2 2:把1000H开始的100个存储单元填入 ASCII码2AH(*)。(例021) MOV DI,1000H MOV CX,64H MOV AL,2AHAGAIN:MOV DI,AL INC DI DEC CX JNZ AGAIN HLT请对比80 x86指令系统指令系统 80 x86指令系统指令系统 表4-6 控制转移类指令80 x86指令系统指令系统 续表(2)80 x86指令系统指令系统 续表(3)80 x86指令系统指令系统 续表(4)80 x86
49、指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 JMP LableLabel代代码码段段位移量位移量近地址标号近地址标号CS : IP=80 x86指令系统指令系统 80 x86指令系统指令系统 JMP BX代代码码段段数数据据段段BX=1200XXHXXHIP指令码指令码CS : IP80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 远地址标号远地址标号JMPLabel代代码码段段1代代码码段段2XXHXXHXXHXXHIPCSCS : IP=80 x86指令系统指令系统 80 x86指令系统
50、指令系统 XXHXXHXXHXXHBXIPCSJMP指令码指令码代代码码段段1代代码码段段2数数据据段段CS : IP80 x86指令系统指令系统 40001212+) 41212DSSI0010004A 4121241213412144121510004A00IPCS段间间接转移操作示意图段间间接转移操作示意图1111111111101100JMP DWORD PTR SI的机器码的机器码DS:SI80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令系统指令系统 80 x86指令