1、微机原理与接口技术 第3章 8086寻址方式和指令系统,主讲教师:卢萍,本章目录,3.1 8086的寻址方式 3.2 指令的机器码表示方法 3.3 8086的指令系统,对一条带有操作数的指令,关注的焦点问题有哪些?,寻址方式:寻找操作数存放地址的方式,即在指令中所指出的计算操作数地址的方法。,指令执行什么操作?操作数在哪?,操作数的存放地址,操作数在主存时:关注段址/段选择符、段内偏移,操作数的类型 字节(DB)/字(DW) /双字(DD),CPU内的寄存器,主存,I/O设备端口,3.1 8086的寻址方式问题的由来,对比问题:如何得到某人的住址?,看见该人回到自己的家里。 立即得到 向该人询
2、问。 直接获得 问其他知情者。 间接获得 每个知情者可能只知道一部分,要问几个知情者。 组合方式 结论:客观上存在几种可能的渠道获得某人的住址,然后找到该人。 计算机的指令也可以通过几种方式得到操作数的存放地址,然后取到操作数。,寻址方式分类,寻址方式是根据存储部件来分类 寄存器方式(操作数在寄存器中) 存贮器方式(操作数在存贮器中) 操作数在存储器中(一般是数据段、堆栈段) 寄存器间接方式 变址方式 基址加变址方式 直接方式 操作数跟在指令后面即在代码段中,也是存储器 立即寻址方式 端口方式(操作数在I/O端口中),3.1.1 立即寻址,操作数直接包含在指令中,操作数与操作码一起存入代码段中
3、。立即数有8位和16位。 例 :MOV AL,5 ;源操作数为立即寻址指令执行后,AL=05H,8位数据05H存入AL寄存器。 例 :MOV AX,3064H ;源操作数为立即寻址指令执行后,AX=3064H,16位数据 3064H存入AX寄存器。,注意,立即数只能作源操作数,不能作目的操作数。 以A、B、C、D、E、F开头的数字出现在指令中时,必须在前面加一个数字0。 立即数可以送到寄存器、存储器中。 例:下列指令是错误的。MOV 2000H,AXMOV AL,B5H而指令MOV 2000H,1234H是对的。,例1:DEC BL,执行前 : (BL)=43H 执 行: (BL) 1 = 4
4、3 H 1 = 42H BL 执行后: (BL)=42H,使用格式: R 功 能: 寄存器R中的内容即为操作数。 说 明: 除个别指令外,R可为任意寄存器。,3.1.2 寄存器寻址,例2:ADD AX , BX,执行前 : (AX)=1234H, (BX)=5620H 执行: (AX)+(BX) = 6854H AX 结果: (AX)=6854H , (BX)=5620H,3.1.2 寄存器寻址,1.寄存器既可以作为源操作数,也可以作为目的操作数; 2.不能混用8位和16位寄存器;MOV AL, BX ; 错误 3.某些指令不支持段寄存器;ADD AX, DS ; 错误 4.寄存器寻址的指令执
5、行速度快,在编程中,应当充分利用寄存器存放经常使用的操作数。,寄存器寻址说明:,3.1.2 寄存器寻址,3.1.3 存储器寻址方式,在存储器寻址方式中,操作数是某个内存单元的内容(值),指令中给出的是内存单元的有效地址EA(即偏移地址),段地址通常在隐含的某个段寄存器中。由于内存单元的地址的给出方式不同,存储器寻址又可分为以下几种寻址方式:直接寻址、寄存器间址、寄存器相对寻址、基址变址寻址、基址变址相对寻址。,1、直接寻址方式,形式:MOV AX,nn ;nn是数值地址 MOV AX,X ; X是符号地址 在直接寻址方式中,操作数的偏移地址(有效地址EA)直接用指令加以指定(有直接地址值和标号
6、两种形式),它存放在代码段中指定操作码之后,但操作数一般存放在存储器的数据段中,所以必须先求出操作数的物理地址,然后再访问存储器才能取得操作数。段地址隐含的由DS 指定,也可以ES指定,但需在指令中指明。最后存储器地址为:DS:偏移地址 或 ES:偏移地址。,1、直接寻址方式,MOV AX,2000H将 DS:2000H单元内容送入AX MOV AL,2000H将 DS:2000H单元的内容取一个字节送ALMOV AX,ES:2000H ; 使用跨段前缀将 ES:2000H单元中的内容送入AXMOV AL,X ;X是变量名, 即符号地址X必须是数据段中用DB伪指令定义的变量 传送原则:低地址的
7、内容(字节)送寄存器的低位,高地址的内容送寄存器的高位。,使用格式: R 功 能:寄存器R中的内容为操作数的偏移地址。 说 明: 操作数在内存中; 操作数的偏移地址在指令指明的寄存器中。,寄存器间接寻址方式的寻址过程,2 寄存器间接寻址,R 可以是: 4个16位通用寄存器中的一个:BX,SI,DI,BP操作数的偏移地址在指令指明的寄存器中 3. 操作数所在的段: 若R为BP,则系统默认操作数在堆栈中,等同于 SS:R; 其它情况下,默认操作数在DS所指示的段中,等同于 DS:R。 若需要改变则要加上跨段前缀 段寄存器名:R,Notice:操作数的类型:未知,寄存器间接寻址说明(1),MOV D
8、X, BL,MOV AX, CX,例1:MOV AX, SI 执行前 (AX)=0005H(SI) =20H,执行后 (AX)=1234H(SI) =20H,问:MOV CL, SI,操作数的类型是如何确定的?,寄存器间接寻址举例,DS:(20H)=1234H,执行后(CL) = 34H,例2:MOV AH, BP 执行前 (AX)=0005H(BP) =21H,执行后 (AX)=1205H(BP) =21H,寄存器间接寻址举例,SS:(BP)=12H,在R前可加上段跨越前缀,则操作对象在前缀指定的段中。 例: MOV DS:BP, CX; 目的操作数表示操作对象在DS段中,而不是在BP默认的
9、堆栈段中。,SS,使用格式: R+V 或 R +V 或 VR 功 能:EA=R(BX, SI, DI, BP之一)中的内容+V(8b或16b) 说 明: 操作数在内存中 操作数的偏移地址是指令中指明的寄存器的内容与给出的位移量之和。,3 寄存器相对寻址,举例(1),例:MOV AX,-6BX 操作前: (DS)=2000H,(AX)=0,(BX)=16H,DS :(10H) =3789H操作EA = (BX) -6 = 16H-6 = = 10HDS:(10H)=3789HAX结果:(AX)=3789,(BX)=16H,DS:(10H)=3789H等价语句:MOV AX,BX-6MOV AX,
10、-6+BX,举例(2),例:已知栈堆状态如图所示,且(AX)=5555H,(BX)=0,(CX)= -1,执行以下语句后,各寄存器的内容为多少? MOV BP, SP PUSH AX MOV AX, 4BP MOV BX, -2BP POP CX(AX)=2222H (BX)=5555H (CX)=5555H 问题:可以将BP改为SI或者DI吗?,不能,寄存器相对寻址主要用在已知表首址,寻找其中某一项时的情况。 例:已知表首址为TAB,SI为该表指针,写出下列各语句执行结果。MOV AL,SI;MOV BL,2SI;MOV CL,3SI;MOV DX,4SI;,(AL)=41H,(BL)=43
11、H,(CL)=44H,(DX)= 4645H,应用,4. 基址变质寻址和相对基址变质寻址,自学 P62P64,3.1.4 端口寻址,操作数在端口寄存器中,指令中给出了端口的地址。根据端口地址的不同,有两种寻址方式: 1、端口直接寻址端口为8位地址00HFFH如:IN AL,80H;8位数据IN AX,80H;16位数据OUT 81H,AL 2、端口间接寻址端口为16位地址0000HFFFFH如:MOV DX,218HIN AL,DX,操作数的寻址方式汇总,3.2 指令的机器码表示方法,略,8086/8088的指令系统可以分为6组: (1)数据传送指令 (2)算术运算指令 (3)位操作指令 (4
12、)串操作指令 (5)程序控制指令 (6)处理机控制指令,怎样记住常用的指令?格式、功能、特殊规定,对标志寄存器的影响!,3.3 8086的指令系统,大多数双操作数指令,具有相同的语句格式和操作规定 格式: 标号: 操作符 OPD,OPS ;注释 指令:数据传送指令; 算术运算指令部分位操作指令; 串操作指令 操作规定: 目的操作数与源操作数应有相同的类型。 目的操作数不能是立即操作数。 操作结束后,运算结果送入目的地址,源操作数并不改变。 源操作数和目的操作数不能同时为存储器操作数。,强调第1点,(2)某些单操作数指令也有相同的语句格式和操作规定 格式:标号: 操作符 OPD ;注释 指令:算
13、术运算和位操作 操作规定: 操作对象为目的地址中的操作数,操作结束后,将结果送入目的地址。 单操作数的类型一定要明确。 操作数不能是立即操作数。,强调第2点,1. 数据传送类 一般数据传送指令:MOV、XCHG、XLAT 堆栈操作指令: PUSH、POP、PUSHF、POPF 标志传送命令: SAHF、LAHF 地址传送指令: LEA、LDS、LES 2. 算术运算类 加法指令:ADD、ADC、INC 减法指令:DEC、NEG、SUB、SBB、CMP 乘除指令:MUL、IMUL、CBW、CWD、DIV、IDIV 3. 位操作指令 逻辑运算指令:NOT、AND、TEST、OR、XOR 移位指令:
14、SHL/SAL、SHR、SAR、ROL、ROR、RCL、RCR,8086的指令系统汇总(1),4. 程序控制类无条件转移 JMP , 条件转移 JC (Z,S,P,V)转子程序 CALL,子程序返回 RET,中断返回 IRET 5. 输入/输出类 输入指令 IN 输出指令 OUT 6. 字符串处理 字符串传送、转换、比较、查找 7. 特权指令: 系统资源的分配和管理 8. 其他类标志操作:CLC,CLI,HLT,WAIT,etc.,8086的指令系统汇总(2),3.3.1 数据传送指令, 通用数据传送指令MOV 格式: MOV OPD,OPS 功能:把一个字节或字的操作数从源地址传送至目的地址
15、。,非法指令的主要现象: 两个操作数的类型不一致 无法确定是字节量还是字量操作 两个操作数不能都是存储器 不能向CS送数据;IP不能在任何语句中出现 OPS和OPD必须同时为字节或字(即类型相同),1. 数据传送类,非法指令两个操作数类型不一致,在绝大多数双操作数指令中,目的操作数和源操作数必须具有一致的数据类型,或者同为字量,或者同为字节量,否则为非法指令MOV AL, 050AH ;非法指令,修正:;mov ax,050ahMOV SI, DL ;非法指令,修正:;mov dh,0;mov si,dx,非法指令无法确定是字节还是字操作,当无法通过任一个操作数确定是操作类型时,需要利用汇编语
16、言的操作符显式指明MOV BX+SI, 255 ;非法指令,修正:;mov byte ptr bx+si,255;byte ptr 说明是字节操作;mov word ptr bx+si,255;word ptr 说明是字操作,非法指令两个操作数都是存储器,8086指令系统除串操作指令外,不允许两个操作数都是存储单元(存储器操作数) 例:将字变量BUF0中的内容传送至字变量BUF1中,采用指令:MOV buf2, buf1;非法指令,修正: ;假设buf2和buf1是两个字变量;mov ax,buf1;mov buf2,ax;假设buf2和buf1是两个字节变量;mov al,buf1;mov
17、buf2,al,非法指令段寄存器的操作有一些限制,8086指令系统中,能直接对段寄存器操作的指令只有MOV等个别传送指令,并且不灵活MOV DS, ES ;非法指令,修正:;mov ax,es;mov ds,axMOV DS, 100H ;非法指令,修正:;mov ax,100h;mov ds,axMOV CS, SI ;非法指令;指令存在,但不能执行,不能向CS送数据;IP不能在任何语句中出现。例:MOV CS , AXMOV AX,IP 立即数不能直接传递至数据段或者附加数据段寄存器中; 不能实现段寄存器之间的直接数据传送。,非法指令段寄存器的操作有一些限制,根据传送图,分析如下语句,是否
18、正确?,1. MOV DS, SEG BUF ; BUF为变量,2. MOV DS, DATA ; DATA为一段名,直接向段寄存器传送数据非法,这里的都是将立即数传给段寄存器。,3. MOV CS, AX,向代码段寄存器传送数据非法,MOV DS, BUF ; BUF为字变量,其所在的段与DS建立联系。,语法正确,执行的结果没有意义,BUF的内容 不可知。, 堆栈操作指令,进栈指令PUSH格式: PUSH OPS 功能:先使堆栈指针SP减2,然后把一个字操作数存入堆栈顶部。出栈指令POP格式: POP OPD 出栈指令把栈顶的一个字传送至指定的目的操作数,然后堆栈指针SP加2堆栈操作的单位是
19、字,进栈和出栈只对字量 字量数据从栈顶压入和弹出时,都是低地址字节送低字节,高地址字节送高字节 堆栈操作遵循先进后出原则,但可用存储器寻址方式随机存取堆栈中的数据 堆栈段是程序中不可或缺的一个内存区,常用来 临时存放数据 传递参数 保存和恢复寄存器,1. 数据传送类,格式: XCHG DST,SRC 功能:(OPD) (OPS),可作八位或十六位交换。 注意:1) dst与 src不能同时为内存单元; 2) 不能使用CS、IP作为操作数。 3) 不影响标志位例: 读下列程序段,写出AX,BX的内容.MOV AX, 1234HMOV BX, 5678HPUSH AXMOV AX, BX XCHG
20、 AX, BXPOP BX HLT,(一).通用型传送指令, 交换指令XCHG(Exchange),1. 数据传送类,例:设数据段中有两个字变量W1和W2,写将这两个数据互换的程序段。,方案一:用XCHG 指令 MOV AX,W1 XCHG AX,W2 MOV W1,AX 方案二:仅用MOV 指令 MOV AX,W1 MOV BX,W2 MOV W1,BX MOV W2,AX,方案三:用堆栈指令 PUSH W1 PUSH W2 POP W1 POP W2 若W1、W2为字节操作数,则前两种方式均可行(用8位寄存器),但不能用堆栈操作指令实现,因为堆栈操作只能是字操作。,(4)XLAT 查表指令
21、(*),格式:XLAT ; BX+AL AL 功能:将表首地址为BX,偏移地址为AL的单元的内容送到AL中。该指令通常用来实现一种代码向另一种代码的转换。,例:若十进制数字0-9的LED七段代码对照表如前所示,试用求数字5的七段代码。,TABLE DB 40H,79H,24H,30H,19HDB 12H,02H,78H,00H,18H 方法1: MOV AL,5MOV BX,OFFSET TABLEXLAT 方法2: MOV SI,5MOV BX,OFFSET TABLEMOV AL,BX+SI,2) 地址传送指令(*),取有效地址 ( load effective address) 格式:L
22、EA reg16,src 功能:按OPS的寻址方式计算EA,将EA送入指定的通用寄存器 例: LEA AX,1000H ;AX=1000HLEA BX, BUF ;等价于 mov bx,offset buf 传送指针到ES 格式:LES reg16,menR(EA), ES (EA+2)传送指针到DS 格式:LDS reg16,menR(EA), DS (EA+2),说明:OPD一定要是16位的通用寄存器,OPS一定是一个存贮器偏移地址。,1. 数据传送类,地址传送与内容传送,DATA SEGMENT BUF DB ABCD NUM DW 72, -5 ;偏移地址为04H DATA ENDS
23、LEA SI, NUM ;地址传送:SI0004H;等同于 LEA SI, 0004h MOV CX,SI ;内容传送:CX48H MOV DI, OFFSET NUM ;等同于MOV DI, 0004h;利用操作符OFFSET获取变量的有效地址 MOV DX,DI ;内容传送:DX48H,例:LEA与MOV OFFSET功能不完全相同MOV BX,OFFSET ARRMOV SI,OFFSET PLUSMOV POIN,OFFSET MINUSLEA DI, 4SI其中 ARR, PLUS, MINUS均为变量,传送偏移地址指令, LEA BX,ARR, LEA SI,PLUS, LEA P
24、OIN,MINUS, MOV DI, OFFSET 4SI,LEA的OPD必须为寄存器 因为OFFSET后面必须为变量或者标号, 读标志指令LAHF(load ah from flags)LAHF把标志寄存器低8位中的5个标志位传送到AH中的指定位,如下图所示:,OF,DF,IF,TF,SF,ZF,AF,PF,CF,AH,LAHF指令的功能,FLAG,3) 标志传送指令(*),1. 数据传送类,设置标志指令SAHFSAHF的功能与LAHF的功能正好相反,用图来示意,只要将上图中5个箭头方向反一下即可。,OF,DF,IF,TF,SF,ZF,AF,PF,CF,AH,SAHF指令的功能,FLAG,执
25、行的操作:(SP)-1标志寄存器高8位(SP)-2标志寄存器低8位(SP)(SP)-2 从栈顶弹出标志寄存器指令POPF执行的操作:标志寄存器低8位(SP)标志寄存器高8位(SP)+1(SP)(SP)+2PUSHF和POPF指令用于保护和恢复标志寄存器内容。,把标志寄存器推入栈顶指令PUSHF,例如:PUSH AXPUSH CXPUSHF ;保护标志寄存器内容;这段程序要用到AX,CX以及标志位POPF ;恢复标志寄存器内容POP CXPOP AX,. . .,传送指令中,除SAHF和POPF这两条指令外,其余所有指令均不影响标志位。,3. 算术运算指令,运算的数据类型:有符号二进制数、无符号
26、二进制数、无符号压缩BCD码、无符号非压缩BCD码。 除CBW、CWD外,所有指令均影响标志位。 指令类型: 加法:ADD、ADC、INC 减法:SUB、SBB、DEC、NEG、CMP 乘法:MUL、IMUL(*) 除法:DIV、IDIV(*) 符号扩展:CBW、CWD(*) 十进制调整:DAA、DAS、AAA、AAS、AAM、AAD(*) 他们执行字或字节的加法和减法运算,除INC和DEC不影响CF标志外,其他按定义影响全部状态标志位,算术运算指令, 加法运算,ADD dest,src ;加法:destdestsrc;ADD指令使目的操作数加上源操作数,和的结果送到目的操作数;注意:影响标志
27、AF、OF、PF、SF、ZF,CF。 ADC dest,src;加法:destdestsrcCF;ADC指令除完成ADD加法运算外,还要加上进位CF,结果送到目的操作数;注意:影响标志AF、OF、PF、SF、ZF,CF。 INC reg/mem ;增量(加1):reg/memreg/mem1;注意:INC指令影响标志AF、OF、PF、SF、ZF,; 但不影响进位标志CF。,算术运算指令,不带借位的减法 格式:SUB DST,SRC ; DST DST-SRC 例: SUB BX,CXSUB WORD PTR DI,1000H 注意:影响标志AF、OF、PF、SF、ZF,CF。 带借位的减法 格
28、式: SBB DST,SRC; DST DST SRCCF 例: SBB AX,2030H;SBB DX, BX+20H 注意:影响标志AF、OF、PF、SF、ZF,CF。,算术运算指令, 减法运算,减量指令 格式: DEC DST ; DST DST 1 注意:影响标志AF、OF、PF、SF、ZF,不影响CF。求负(补)指令(negate) 格式: NEG DST ; 对DST求补,0 -DST,(二)减法指令,算术运算指令, 减法运算,执行如下程序段后,(AX)=?MOV AX, 20HNEG AX,(AX)= 0FFE0 H,该指令完成的操作是计算出负数的补码。, 减法运算,比较指令CM
29、PCMP dest,src ;做减法运算:destsrc;CMP指令将目的操作数减去源操作数,但差值不回送目的操作数比较指令通过减法运算影响状态标志,用于比较两个操作数的大小关系,cmp ax,bx cmp al,100,例:CMP AX,-2JGE LMOV DX,AX,算术运算指令,有符号数和无符号数的区别: 数的表示范围不一样 比较大小的标准不一样 例:对于8位16进制数,比较80H和0A8H的大小. 判断运算结果是否正确的标准也不一样例: 对有符号数, 加、减法运算结果只有OF0时才是正确的;对于无符号数,只有CF0时,运算结果才是正确的. 符号扩展不一样,有符号数的补码最高位向左延伸
30、,得到的仍是该数的补码。, 算术运算指令乘法和除法,乘法指令分无符号和有符号乘法指令 MUL reg/mem ;无符号乘法 IMUL reg/mem ;有符号乘法功能:字节乘法: (AL)*(OPS)AX字乘法: (AX)*(OPS)DX,AX除法指令分无符号和有符号除法指令 DIV reg/mem ;无符号除法 IDIV reg/mem ;有符号除法功能:字节除法:(AX)/(OPS)AL(商) 、AH(余数)字除法: (DX、AX)/(OPS)AX(商)、DX(余数),例: MOV AL, 0FFHMOV BL, 0FFHMUL BL结果 AX = ? (AX) = 255*255 = 6
31、5205(0FE01H),CF=OF=1如果是IMUL BL呢?(AX)=-1*(-1)=1,CF=OF=0,无符号乘法举例说明,例:写出计算4001H4的程序段。MOV AX,4001H CWD 符号位扩展到DX,MOV CX,4IDIV CX (DX,AX)/(CX)结果:(AX)=1000H , (DX)=1问题:该题能否用字节除? 如果将被除数改为4001H,程序段为:MOV AX,4001HCWDMOV CX,4IDIV CX 运算的结果为:(AX)0F000H,(DX)0FFFFH 假如被除数为-4001H,除数为-4,相除后的余数也为0FFFFH。,因为商是4位十六进制数,一个字
32、节放不下。,有符号除指令举例,4、符号扩展指令(*),符号扩展是指用一个操作数的符号位(最高位)形成另一个操作数,后一个操作数的高位是全0(正数)或全1(负数) 符号扩展虽然使数据位数加长,但数据大小并没有改变,扩展的高部分仅是低部分的符号扩展 符号扩展指令有两条,用来将字节转换为字,字转换为双字CBW ;AL符号扩展成AXCWD ;AX符号扩展成DX,符号扩展例题,mov al,64h ;AL64H ,表示10进制数100(真值) cbw ;将符号0扩展,AX0064H,仍然表示100 mov ax,0ff00h ;AX0FF00H,表示有符号10进制数-256 cwd ;将符号位“1”扩展
33、,DX.AXFFFFFF00H;仍然表示-256,5. 位操作指令,逻辑运算指令(1)逻辑乘指令AND (2)求反指令NOT(3) 测试指令TEST (4) 逻辑加指令OR(5) 按位加指令XOR (6)位操作指令的特点 移位指令(1) 算术、逻辑移位指令(2) 循环移位指令,4. 位操作指令逻辑运算指令,(1) 逻辑乘(与)指令 格式:AND OPD, OPS (and) 功能: (OPD) (OPS) OPD例 AND AX, 0FH执行前:(AX) = 0FBBAH执行后:(AX) = 0AH 用途 该指令主要用来将目的操作数中清除与源操作数置0的对应位,因此可用来将存贮器或寄存器中不需
34、要的部分去掉。将需要部分分离出来。,例:将BL中BCD码的低4位转换成ASCII码.,mov bh,bl ; 保存原BCD码 and bl, 0fh ; 取出低4位 add bl, 30h ; +0 , 转换成对应的ASCII码 mov dl, bl ; 输出该ASCII码 mov ah,02 int 21h,逻辑运算指令,(2) 求反指令 格式:NOT OPD (not) 功能:(OPD) OPD (3) 测试指令1TEST指令 格式:TEST OPD,OPS (test) 功能:(OPD)(OPS) 根据结果设置标志位检测与源操作数中为1的位相对应的目的操作数中的那几位是否为0(或为1),
35、根据测试结果置ZF位,后面往往跟着转移指令,根据测试结果确定转移方向。,例,例:要测试AX中第12位是否为0,为0转L,则要使用如下指令:15 12 0TEST AX, 1000HJZ L 如果要同时测试第15位和第7位是否同时为0,为0转L15 7TEST AX, 8080HJZ L,0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0,1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0,逻辑运算指令测试指令TEST,逻辑运算指令,(4) 逻辑加(或)指令OR 格式:OR OPD, OPS (or) 功能:(OPD) (OPS) OPD例 OR AX, 55H执行前:(
36、AX) = 0AAAAH执行后:(AX) = 0AAFFH该语句主要用于:在目的操作数中置位与源操作数为1的对应位,其余位不变。,逻辑运算指令,(5) 按位加指令异或 格式:XOR OPD, OPS (exclusive or) 功能:(OPD) (OPS) OPD运算法则:01=1,10=1,11=0,00=0 例: XOR AX, 0AAAAH执行前:(AX)=0FFFFH1111 1111 1111 11111010 1010 1010 10100101 0101 0101 0101结果: (AX)=5555H 作用:主要用来将目的操作数中与源操作数置1的对应位取反。操作数自身异或,结果
37、为0,CF=0,自身相或、相与结果不变;自身按位加结果为0,“XOR AX, AX”之后(AX) = 0; (2) 如果要将目的操作数中某些位清0,用AND,称之为屏蔽 (3) 如果要将目的操作数中某些位置1,用OR (4) 用来测试目的操作数中某一位或某几位是否为0或1,而结果不变,TEST,BTTEST与CMP的区别:前者是测试一位或几位,后者测试整个字节字双字是否相等 (5)与数值表达式逻辑运算的区别,逻辑操作指令的特点,4. 位操作指令移位指令,将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作 移位指令的第一个操作数是指定的被移位的操作数,可以是寄存器或存储单元;
38、后一个操作数表示移位位数: 该操作数为1,表示移动一位 该操作数为CL,CL寄存器值表示移位位数 (移位位数大于1只能CL表示) 按照移入的位设置进位标志CF,根据移位后的结果影响SF、ZF、PF, 逻辑左移指令SHL,SHL reg/mem,1/CL;reg/mem左移1或CL位;最低位补0,最高位进入CF, 逻辑右移指令SHR,SHR reg/mem,1/CL;reg/mem右移1/CL位;最高位补0,最低位进入CF,例: 将AL中的BCD码转换成二进制数,如 12 BCD - 12 ( =1*10+2)0001 0010 - 0000 1010 mov bl, al and bl,0fh
39、 ; 取BCD数的个位(在bl) mov cl, 4 ; 移位次数只能放cl shr al, cl ; 取BCD数的十位(在al) mov cl,10 ;乘数10可放其他寄存器 mul cl ; al(十位)*cl(10)-ax add al,bl ; 加个位,例: 将AL中的二进制数转换成2位压缩BCD码,如 12 - 12 BCD ( 12/10的商,12/10的余数) sub ah,ah ; ah清0,使ax放被除数 mov cl, 10 ; 计算十位数 div cl ; 商在al,余数在ah mov cl,4 shl al, cl ; 移到高4位 add al,ah ;加个位数, 算术
40、左移指令SAL,SAL reg/mem,1/CL ;与SHL是同一条指令, 算术右移指令SAR,SAR reg/mem,1/CL;reg/mem右移1/CL位;最高位不变,最低位进入CF,例:将AL寄存器中的无符号数乘以10,xor ah,ah ;实现AH0,同时使CF0 shl ax,1 ;AX2AL mov bx,ax ;BXAX2AL shl ax,1 ;AX4AL shl ax,1 ;AX8AL add ax,bx ;AX8AL2AL10AL,逻辑左移一位相当于无符号数乘以2逻辑右移一位相当于无符号数除以2, 循环移位指令,循环移位指令类似移位指令,但要将从一端移出的位返回到另一端形成
41、循环。分为: ROL reg/mem,1/CL ;不带进位循环左移 ROR reg/mem,1/CL ;不带进位循环右移 RCL reg/mem,1/CL ;带进位循环左移 RCR reg/mem,1/CL ;带进位循环右移 循环移位指令的操作数形式与移位指令相同,按指令功能设置进位标志CF,但不影响SF、ZF、PF、AF标志,循环移位指令,循环左移指令 格式:ROL OPD, n (rotate left) 功能:将目的操作数的最高位与最低位连接起来,组成一个环,将环中的所有位一起向左移动n所规定的次数。CF的内容为最后移入位的值。例:ROL DX, 4 执行前:(DX)=0FABCH结果:
42、(DX)=0ABCFH CF=1,循环右移指令 格式:ROR OPD,n (rotate right) 功能:该指令的移动方式完全同ROL,只是向右移动。带进位位的循环左移指令 格式:RCL OPD,n (rotate left through carry) 功能:将目的操作数连同CF标志一起向左循环移动所规定的次数。带进位的循环右移指令 格式:RCR OPD,n (rotate right through carry) 功能:该指令的移动方式完全同RCL,只是向右移动。,循环移位指令,移位例题,问题:请阅读下列程序段,说明程序功能MOV CX,4 NEXT:SAL AX,1RCL DX,1D
43、EC CXJNE NEXT,1. 试用不同指令将(AX)置0。你能想出几种?,试一试:,MOV AX, 0 SUB AX, AX AND AX, 0 XOR AX SHL AX, 16,2. 试用不同的指令,将AX的高、低字节内容互换。,XCHG AH, AL ROL AX, 8 ROR AX, 8,6. 输入/输出指令,从信息流向看,在8086中, 输入是指将外部设备数据寄存器(端口)中的数据送至累加器AL/AX中,由IN指令完成。 输出是指将AL/AX中的数据送至外设数据寄存器的过程,由OUT指令完成。,I/O端口支持直接寻址和间接寻址方式。直接寻址:使用一字节立即数寻址,端口寻址范围 0
44、0HFFH 共256个。间接寻址:使用DX寄存器间接给出I/O端口地址,可寻址的范围是 0000HFFFFH 共64K个。,I/O端口的寻址方法,CPU通过I/O指令对I/O接口进行访问。,I/O指令,结果:完成I/O端口和AX(16b)、Ah(8b)、AL(8b)之间的数据传送。可使用直接寻址(单字节地址指令)和间接寻址(双字节地址指令)方式。,累加器I/O指令IN和OUT,其指令格式为:IN AL, PORT ;输入 OUT PORT, AL ;输出注意:PORT- 是一个8位的字节地址,范围:00HFFH, 最多可访问256个端口。 例如:IN AL, 60H ;从端口60H读数据到AL
45、MOV DI, AL ; 将数据从AL - 存储器MOV AL, SI ; 从内存取数据到ALOUT 61H, AL ;数据从AL到端口61H,单字节地址指令,MOV DX, PORTIN AL, DX ;8位传送MOV DX, PORTOUT DX,AL ;8位传送注意: PORT-为16位的两字节地址。范围:0000HFFFFH,则最多可寻址216=64K个端口。端口间址寄存器:DX 例如:MOV DX, 300H ; 300H为扩展板8255A的PA端口IN AL, DX ; 从端口300H读数据到ALMOV DI, AL ; 将数据从AL - 存储器,双字节地址指令,7. 标志操作指令
46、(*),1) 标志位操作指令 CLC ;复位进位标志:CF0 STC ;置位进位标志:CF1 CMC ;求反进位标志:CFCF CLD ;复位方向标志:DF0 STD ;置位方向标志:DF1 CLI ;复位中断标志:IF0 STI ;置位中断标志:IF1 2) 标志寄存器低字节与AH的传送指令LAHF,SAHF 3) 标志寄存器出入堆栈指令PUSHF,POPF,8. 串操作指令(*),串:顺序放在内存中的一组相同类型的数据。 串操作:对串中的元素进行相同的操作。 串操作的寻址方式:源操作数指针DS:SI(DS可超越)目的操作数指针ES:DI 每次串操作后: 串操作指令自动修改SI和DI字节1,
47、字2。DF标志决定。 可完成两个存储单元之间的传送和比较操作(也仅是串指令可以),串指令使用的一般方法,设置源串地址,设置目标串地址,设置串长度,设置操作方向DF,串指令,MOV SI, 源串首地址 (或LEA SI, 源串),MOV DI, 目的串首地址 (或LEA DI, 目的串),MOV CX, 串长度,CLD(或STD),串指令,重复前缀 有的串操作指令前面可加上重复前缀REP。当使用REP前缀时,该指令重复执行,重复执行次数由CX决定(带有REP前缀的串操作指令每执行一次,CX自动减1)。 重复前缀包括: REP CX0 时重复执行 REPE/REPZ CX0ZF=1时重复执行 REPNE/REPNZ CX0ZF=0时重复执行,字符串操作指令,