微机原理第3章8086寻址方式及指令系统-课件_第1页
微机原理第3章8086寻址方式及指令系统-课件_第2页
微机原理第3章8086寻址方式及指令系统-课件_第3页
微机原理第3章8086寻址方式及指令系统-课件_第4页
微机原理第3章8086寻址方式及指令系统-课件_第5页
已阅读5页,还剩154页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第3章 8086/8088寻址与指令系统基本概念微机工作过程中其内部信息有两类:一类是控制信息(指令);一类是被加工处理的信息(数据)。 指令:微机中的控制信息就是使计算机进行某种操作的命令,这些命令就称为指令。 指令系统:一台计算机所能执行的全部指令的集合称为指令系统。不同的计算机其指令系统是不同的。基本概念汇编语言指令或符号指令:用字母和其它一些符号组成的“助记符”与操作数等表示的指令称为汇编语言指令或符号指令。 例如:MOV AX, BX ; AXBX 其二进制代码(机器代码)为89D8H,就是 1000 1001 1101 1000 B 不易理解,不易记忆。汇编程序与汇编过程:把符号指

2、令变成机器代码的过程叫汇编,完成汇编任务的程序叫汇编程序。3.1 8086/8088寻址方式指令格式: 标号: 操作码 , 操作数 ; 注释标号:内存码段中存放该指令的第一个字节的地址操作码:操作的性质。操作数:操作的对象,可以是操作数本身或存放操作数的内存(I/O端口)地址。注释:查看程序用,不参加编译运行。寻址方式:寻找操作数所在地址的方式计算机中操作数可以存放在以下几个地方:指令代码中,存放常量;MOV AX, 2070H寄存器中:MOV AX, BX内存中: MOV AX, 2000HI/O端口中: IN AL, 40H一、 立即数寻址操作数直接放在指令中,紧跟在操作码的后面,与操作码

3、一起放在存储器的码段区域中。MOV AX, 2030H B8 20304004H4003H4002H4001H4000H30H20HB8H4004H4003H4002H4001H4000H20H30HB8H内存地址内存内容错误!高字节 高地址低字节 低地址AXAHAL20H30H例:MOV AX, 1234H二、 寄存器寻址操作数放在CPU内部的寄存器中,可以是8位或16位寄存器,注意源操作数和目的操作数的位数应一致。MOV AX, BX;将 BX中的内容传送到AX中去MOV AL, BH;将 BH中的内容传送到AL中去MOV AL, BX错误! 不匹配三、 直接寻址操作数存放在内存中,在指令

4、中给出存放操作数的偏移地址,如果不加说明,默认的段基址是数据段。MOV AX, 0020H;将 数据段偏移地址为0020H的地址中的内容传送到AX中去,相当于: MOV AX, DS:0020H12H34H56H码段堆栈段数据段0000H0001H0020H0021H0022HDS:0000H偏移地址内存内容MOV AX, 0020HAXAHAL3412AX: 3412H也可以传送内存中其他段的数据,在相应的偏移地址前加段超越符 “:”。MOV AX, SS:0020H;将堆栈段偏移地址为0020H的地址中的内容传送到AX中去MOV ES:0100H, BX如果不加段超越,默认为约定段的偏移地

5、址直接寻址四、 寄存器间接寻址操作数存放在内存中,但其偏移地址存放寄存器中。在指令中只给出这个寄存器。MOV AX, BXBX中存放操作数的偏移地址其中,作为间址的寄存器只能有4个:BX, SI, DI, BP,其他寄存器无此功能。用BP寻址,段基址默认为堆栈段SS,其余3个的段基址默认为数据段DS,同时指令允许段超越。12H34H56H码段堆栈段数据段0000H0001H0020H0021H0022HDS:0000H偏移地址内存内容MOV AX, BXAXAHAL3412AX: 3412HMOV BX, 0020HMOV AX, ES:BX;传送的操作数在附加段ES中,偏移地址存放在BX中。

6、MOV BP, BX;将BX中的内容传送到堆栈段中,其目的地的偏移地址存放在BP中。MOV DI, 2000H;将立即数2000H传送到数据段中,其目的地址的偏移地址存放在DI中。寄存器间接寻址五、 寄存器相对寻址操作数存放在内存中,但其偏移地址需要计算。偏移地址寄存器内容指令中给定的位移量MOV AX, SI+0200H;欲传送的操作数在数据段中,其偏移地址是SI寄存器中的内容加上0200H同样,作为变址的寄存器只能有4个:BX, SI, DI, BP,其他寄存器无此功能。用BP寻址,段基址默认为堆栈段SS,其余3个的段基址默认为数据段DS,同时指令允许段超越。MOV AX, 0200HBX

7、变址寻址可以有多种格式:MOV AX, BX+0200HMOV AX, 0200H+BX例如:DS:3000H, BX: 1000H 数据所在的地址:高位: 31201H 低位: 31200H例:MOV AX ,BP+1223H 假设:(SS)=5000H, (BP)=3678HAXAHAL55AA操作码12H23HM代码段堆栈段55HAAH5489B50000536781223SS50000+5489B3678BP1223寄存器相对寻址六、 基址加变址寻址操作数存放在内存中,但其偏移地址是由两部分相加而成: 基址寄存器内容变址寄存器内容MOV AX, BXSI;欲传送的操作数在数据段中,其偏

8、移地址是BX寄存器中的内容加上SI寄存器中的内容基址寄存器只有2个:BX,默认的段基址为DS;BP,默认的段基址为SS。 2个变址寄存器:DI、SI例:MOV AX ,BX+ DI 假设:(DS)=5000H, (BX)=1223H , (DI)=54HAXAHAL55AAM数据段55HAAH512775000051223DS50000+512771223BX0054DI指令中必须是基址寄存器与变址寄存器的组合,不允许同时出现两个基址寄存器或2个变址寄存器的组合。MOV AX, BXBP错误! 不允许MOV AX, SIDI七、 基址-变址-相对寻址操作数存放在内存中,但其偏移地址是由三部分相

9、加而成: 基址寄存器内容变址寄存器内容位移量MOV AX, BX+SI+0200H;欲传送的操作数在数据段中,其偏移地址是BX寄存器中的内容加上SI寄存器中的内容加上0200H基址寄存器只有2个:BX,默认的段基址为DS;BP,默认的段基址为SS。变址寄存器只有2个:SI和DI。允许段超越。MOV AX, BX+SI+0200HMOV AX, 0200HBX+SIMOV AX, 0200HBXSIMOV AX, 0200HBXBPMOV AX, 0200HSIDI必须是基址(BX或BP)加变址(DI或SI)MOV AX, 0200HBP+SI;欲取的数据在堆栈段错误格式例: MOV AX, B

10、X+SI+1030H 或 MOV AX, 1030BXSI 若 BX=2100H,SI=1400H,偏移量1030H, DS=1200H,基址-变址-相对寻址存储器寻址时的约定存储器操作类型默认段寄存器允许超越的段寄存器偏移地址寄存器取指令代码CS无IP堆栈操作SS无SP源串数据访问DSCS、ES、SSSI目的串数据访问ES无DI通用数据访问DSCS、ES、SSSI、DI、BX以BP、SP间接寻址的指令SSCS、DS、ESBP、SP程序只能在CS段、堆栈操作数只能在SS段、目的串操作数只能在ES;其他操作虽然也有默认段,但允许段超越。 12H34H56H78H9AHBCHDEHF0H21000

11、H21001H21002H21003H21004H21005H21006H21007H10H20H30H40H50H60H70H80H23000H23001H23002H23003H23004H23005H23006H23007H1AH2AH3AH4AH5AH6AH7AH8AH31000H31001H31002H31003H31004H31005H31006H31007H1BH2BH3BH4BH5BH6BH7BH8BH33000H33001H33002H33003H33004H33005H33006H33007HDS: 2000H SS:3000H BX:1000H BP:3000H SI:

12、3004HMOV AX, 3000HMOV AX, BXMOV AX, 3000HMOV AX, BXMOV AX, BPMOV AX, BPMOV AX, SIMOV SI, 0002HMOV AX, BXSIMOV AX, BP+02HMOV AL, BX+06HMOV AX, BX+SI+4HAX: 3000HAX: 1000HAX: 2010HAX: 3412HAX: 3000HAX: 2B1BHAX: 6050HSI: 0002HAX: 7856HAX: 4B3BHAL: DEHAX: F0DEH3.2 8086/8088指令系统92种指令,按照功能分为6大类数据传送类指令算术运算类

13、指令逻辑运算与移位指令 串操作指令控制转移类指令 处理器控制指令3.2 8086/8088指令系统一、数据传送指令通用数据传送指令 MOV OPRD1, OPRD2;所有的MOV传送指令都不能改变标志CS,IP不能作为目的操作数 MOV CS, AX 两个段寄存器间不能直接传送 MOV SS, DS立即数不能直接传送给段寄存器 MOV DS,2000H内存单元间不能直接传送 MOV SI, 2000H立即数不能作为目的操作数 MOV 1000H, AXMOV BL, AXMOV 100, CXMOV SI, AXMOV CS, AXMOV SI, DIMOV BX, 2DIMOV AX, CS

14、MOV SS, 2400HMOV AX,BP+4错误,不匹配错误,立即数不能赋值正确错误,CS不能赋值错误,内存间不能直接传送正确正确错误,段寄存器不能赋立即数正确通用数据传送指令传送方向123456 堆栈操作指令 PUSH src, POP dest堆栈是按先进后出的原则组织的一段内存区域,一般作临时存储器用(仓库)。其指针SP为16位的寄存器,始终指向栈顶(货物堆放的位置)。堆栈的空间大小是用户指定的。SS: 2000H ; 堆栈段的段基址 ;表示堆栈从20000H处开始20000H假设用户定义堆栈为100个字节,则SP自动设置为0064H20064H100个字节SP:0064HMOV A

15、X, 1234HPUSH AX20000H20064H100个字节SP(1) SP-2SP12H(2) AHSP ALSPSP34H先减指针,再压数据,先高后低POP BX(1) SPBL SPBH (2) SP+2SPBLBHSP先出数据,再加指针,先低后高只能对16位数进行操作,一次压入弹出两个字节PUSH AH必须对寄存器的内容或内存单元的内容进行操作PUSH 2000H设SP为0100H,SS为2000H, PUSH BP后,栈顶的物理地址是:20100H2H=200FEH下列指令中,错误的是:PUSH DS B) POP CS C) PUSH 30HBXSID) MOV SI,ES:

16、BPB) POP CS堆栈操作MOV AX, 1000HPUSH AXMOV BX, AXPUSH BXPUSH 1000H POP 1002HPOP AXPOP BX12H34H56H78H9AHBCHDEHF0H21000H21001H21002H21003H21004H21005H21006H21007H30000H30001H30060H30061H30062H30063H30064HDS: 2000H SS:3000H SP:0064HSP:0064H100个字节10H00HBX: 1000H34H12H34H12H34H12HAX: 3412HBX:1000H交换指令XCHG OP

17、RD1, OPRD2OPRD1 OPRD2在寄存器之间,寄存器和内存之间的8位,16位数据可以相互交换。XCHG AL, AHXCHG AX, BX内存之间的数据不可相互交换 CS,IP不能参与交换段寄存器不能作为一个操作数例:XCHG BX ,BP+SI如指令执行前: (BX)=6F30H,(BP)=0200H, (SI)=0046H, (SS)=2F00H,(2F246H)=4254H,OPR2的物理地址=2F000H+0200H+0046H=2F246H则指令执行后: (BX)=4254H,(2F246H)=6F30H表格查找指令(换码指令) XLAT使累加器AL中的一个值变换为存储器表

18、格中的某一个值,一般用来实现编码码制的转换。用BX指向表的首地址,AL中的内容为表中某一项与首地址之间的位移量。在执行查表指令时,将BX与AL中的内容相加,把得到的值作为地址,然后将此地址所对应单元中的值取到AL中去。DS段表格首地址BX+ALAL11H20H33H22HBXALBX+0BX+ALBX+2BX+1AL为什么?执行该指令前,应该先建立一张表格,该表的最大容量为256字节。例: 将十进制数字0-9变换成七段显示码的译码表0100 000000111 1001140H79H40H79H24H30H19H12H02H78H00H10H0123456789AL存放表内元素位移量例: 从5

19、号端口输入十进制数,转换为7段码后输出到20号端口。40H79H24H30H19H12H02H78H00H10H01234567892000H2001H2002H2003H2004H2005H2006H2007H2008H2009HDS段MOV BX, 2000HIN AL, 5HXLATOUT 20H, AL例:向端口40H送字符35。40H79H24H30H19H12H02H78H00H10H01234567892000H2001H2002H2003H2004H2005H2006H2007H2008H2009HDS段MOV BX, 2000HMOV AL, 3XLATOUT 40H, AL

20、MOV AL, 5XLATOUT 40H, AL2 输入输出指令 IN OUTCPU存储器输入输出INOUTAX或AL只能用IN、OUT指令向外设发命令;外设只能与CPU内部寄存器AL或AX进行数据传输累加器专用指令(只与AX或AL有关,与AH无关)IN AL, 40H OUT 40H , AL IN AX, 40H OUT 40H , AX8位16位(40H) AL(41H) AHAL (40H) AH (41H)IN AL, 352H OUT 400H, AL 当外口地址大于8位(0FFH)时,用DX作间址MOV DX, 352HIN AL, DX MOV DX, 400HOUT DX,

21、AL 3 地址传送指令取有效地址指令LEA:取存储器地址的偏移地址LEA AX, 2728H ; 地址为2728H, AX为2728H功能:将存储器地址送到一个寄存器。要求源操作数必须为存储器单元地址,目的操作数必须为一个16位的通用寄存器。该指令通常用来使一个寄存器作为地址指针。LEA BX, BP+SI ; BX为 BP+SI 的值LEA reg16, memLEA 指令与MOV 指令的区别:LEA SI,BUFF指令是将标号BUFF的偏移地址送入寄存器中;MOV SI,BUFF指令是将标号BUFF所指存储单元的内容送入SI。BUFF =0123454800FEFFLEA SI,BUFF;

22、执行后:(SI)=0002HMOV SI,BUFF;执行后:(SI)=0048H段起始地址LDS 取内存中的数 LDS reg16, mem32 将指定内存中的4个字节(32位)分别装入指定的寄存器和段寄存器DS(高16位)中。30H19H79H40H24H2133H2134H2131H2130H2132HDS段例:2130H2133H这4个单元中存放着一个地址2130H 2131H 为该地址偏移量2132H 2133H 为该地址段值LDS DI, 2130H执行后:DI: 7940H DS: 3024HLES 取内存中的数 LES reg16, mem32 将指定内存中的4个字节(32位)分

23、别装入指定的寄存器和段寄存器ES (高16位)中。例:DS:1000H DI : 0400H 10420H=FFH 10421H=00H 10422H=10H 10423H=23H LEA AX, 20DIAX: 00FFH ES:2310H执行后:12H34H56H78H9AHBCHDEHF0H00H10H23000H23001H23002H23003H23004H23005H23006H23007H23008H23009H例:DS: 2000H MOV BX, 3004HMOV AL, 02HXLATLEA BX, 3000HLES SI, BX+04HLDS DI, BX+02HAL:

24、DEHBX: 3000HSI: BC9AHES: F0DEHDI: 7856HDS: BC9AH4 标志传送指令LAHF(Load AH with Flags):读取标志将标志寄存器FR中的低8位AH中OFDFIFTFSFZFAFPFCF1514131211109876543210D7D6D4D2D0AHSAHF(Set Flags with AH): 设置标志 上述指令的反向传输只提供8位标志位指令,保持对8位机指令的兼容性PUSHF: 标志寄存器入栈命令POPF:将栈内内容进入标志寄存器FR只有这个命令可以改变TF的内容。5 字位扩展指令 CBW/CWD功能:CBW将AL符号数的符号扩展到

25、AH中,CWD将AX符号数的符号扩展到DX中。扩展规则如下(对带符号数): 1. 若ALBX;CF为1,AXBX;否则AXBX。指令系统针对有符号数和无符号数的比较分别提供了不同的判断指令。用户只需在应用时根据数据类型选择不同的指令即可。乘法指令约定:两个8位数相乘,有一个乘数在AL中,另一个乘数在寄存器或内存中,乘积在AX中;两个16位数相乘,有一个乘数在AX中,另一个乘数在寄存器或内存中,乘积的高16位在DX中,低16位在AX中。乘法有有符号数和无符号数两套指令8位数8位数 16位数16位数16位数 32位数无符号数乘法指令MUL OPRD; 不出现 AL 或 AXMUL BL; AL B

26、L AXMUL CX; AX CX DX(高位),AX(低位)MUL BYTE PTR DI; AL DI AXMUL WORD PTR SI; AX SI+1SI DX(高位) , AX(低位)隐含寻址2) 有符号数乘法指令IMUL OPRD; 不出现 AL 或 AXIMUL BL; AL BL AXIMUL CX; AX CX DX(高位) , AX(低位)IMUL BYTE PTR DI; AL DI AXIMUL WORD PTR SI; AX SI+1SI DX(高位) , AX(低位)功能上与MUL相似, 要求两个乘数必须为有符号数乘法运算时,结果影响CF和OF,AF,PF,SF,

27、ZF标志位无意义。对MUL指令:当乘积的高半部分不为0,置:CF=1,OF=1;否则,CF=0, OF=0 。对IMUL指令:当乘积的高半部分是低半部分最高位的扩展,乘积的高半部分每位与低半部分最高位相同时:CF=0, OF=0;否则,CF=1, OF=1 。CF=1,OF=1表示高半部分包含有结果的有效数表示AH或DX中不是00就是FF,积的符号位扩展例:MOV AL, 0FBHMOV BH, 02HIMUL BH结果:AX=0FFF6H, 即-10, CF=0, OF=0MOV AL, 0FBHMOV BH, 02HMUL BH结果:AX=01F6H, 即502, CF=1, OF=1除法

28、指令约定:除数必须为被除数的一半字长被除数为16位,放在AX中,除数为8位,在寄存器或内存中,8位商在AL中,8位余数在AH中被除数为32位,放在DX(高位), AX(低位)中,除数为16位,在寄存器或内存中, 16位商在AX中, 16位余数DX中除法有有符号数和无符号数两套指令16位数8位数 8位数32位数16位数 16位数1)无符号数除法指令DIV OPRD; 不出现 AX 或 DX AXDIV BL; AXBL AL(商) , AH(余数)DIV CX; DX AX CXAX(商) , DX(余数)DIV BYTE PTR DI; AXDI AL(商) AH(余数)DIV WORD PT

29、R SI; DX AX SI+1SI AX(商) , DX(余数)2) 有符号数除法指令IDIV OPRD; 不出现 AX 或 DX AX功能上与DIV相似, 要求被除数,除数必须为有符号数。IDIV BL; AXBL AL(商) , AH(余数)注意:除法运算后,所有的标志位都是不确定的,没有意义;用IDIV指令时,如果是双字除以一个字,则商的范围为-32768-32767,如果是一个字除以一个字节,则商的范围为-128-127。如果超出这个范围,会作为除数为0来处理,产生0号中断8086系统规定余数的符号和被除数相同;当8位数除以8位数,16位数除以16位数时,必须对被除数进行扩展。无符号

30、数被除数扩展:将AH或DX清0。有符号数被除数扩展:对AH或DX进行符号扩展。将字节扩展成字的指令:CBW 将AL中的符号位扩展到AH中。当AL=80H时,AH=0FFH当遇到两个字节相除时,要预先执行CBW指令,扩展被除数,否则不能正确执行除法操作。 将AX中的符号位扩展到DX中。当AX=8000H时,DX=0FFFFH。将字扩展成双字的指令:CWDBCD码运算指令组合的BCD码: 一个字节中有两位BCD码 0100 0101非组合的BCD码:一个字节只用低4位表示一位BCD码,高4位为0。 0000 0100 0000 0101BCD码:用二进制形式表示的十进制码。每一位十进制数用4位二进

31、制表示,运算规则是逢十进一。十进制BCD码00000100012001030011401005010160110701118100091001BCD码运算时,先用一般的二进制运算,然后再进行BCD码调整。BCD码加法十进制调整指令1) 未组合的BCD码运算调整指令 AAA两个未组合的BCD码相加,结果在AL中,执行该指令后将结果调整为十进制,放在AX中。MOV AL, 7HADD AL, 5HAAA;AL: 0CH;AX: 0102H CF=AF=1调整原则:在调整前若AL低半部包含的数值大于9或AF=1, 则AAA完成下列操作:AL加6,AF和CF置1,,AH加1,AL的高4位清零。7+5=

32、12 用组合的BCD码表示运算过程:0000 01110000 0101 0000 1100BCD码逢十进一,16进制逢16进1,因为低4位大于9,所以在个位上加6,使其产生进位,同时AF=1,CF=1。0000 11000000 0110 0001 001016进制加法AAA指令调整为10进制结果9+9=18 用组合的BCD码表示运算过程:0000 10010000 1001 0001 0010BCD码逢十进一,16进制逢16进1,因为低4位有进位,AF1,所以在个位上加6,使其成为十进制运算结果,同时AF=1,CF=1。0001 00100000 0110 0001 100016进制加法A

33、AA指令调整为10进制结果2) 组合的BCD码运算调整指令 DAA两个组合的BCD码相加,结果在AL中,执行该指令后将结果调整为十进制,放在AL中。MOV AL, 56HADD AL, 47HDAA;AL: 9DH;AL: 03H CF=1调整原则:如果AF=1或AL的低4位大于9, 则AL加06H并置AF=1如果CF=1或AL的高4位大于9, 则AL加60H并置CF=1。如果满足上述2条, 则AL加66H, 并置AF=1,CF=1。MOV AX, 1234HMOV BX, 5678HADD AL, BLDAAMOV CL, ALMOV AL, AHADC AL, BHDAAMOV AH, A

34、LMOV AL, CL; AL : ACH; AL : 12H CF=1; CL : 12H; AL : 12H; AL : 69H; AL : 69H CF=0; AX :6912H CF=0MOV AX, 8ADD AL, 9AAA; AX: 0038H; AX: 0071H AF=1 ; AX: 0107H CF=1因为AF=1,所以AH=1,CF=1,AF=1,AL高4位清零BCD码减法调整指令与加法调整指令类似,只是分别将加06H,60H,66H改为减 06H,60H,66H。AAS: 对非组合的BCD码减法调整DAS: 对组合的BCD码减法调整必须紧跟在相对应的加减法指令后进行调整

35、。BCD码乘法十进制调整指令 AAM1) BCD码均为无符号数,故只有用MUL乘法指令才能调整;2) BCD码乘法调整指令只能对两个8位非组合的BCD码相乘的结果(AX)进行调整;MOV AL, 05HMOV BH, 06HMUL BHAAM; AX : 001EH ; AX : 0300H (AH)(AL)/0AH(AL) (AL)%0AH1) BCD码均为无符号数,故只有用DIV除法指令才能调整,并且在两个数相除前进行调整;2) BCD码除法调整指令只能对非组合的BCD码相乘结果进行调整;MOV AX, 0400HMOV BL, 02HAADDIV BLAAM; AX : 0028H BC

36、D码除法十进制调整指令 AAD(AL)(AH)*0AH+AL(AH) 00H将AX寄存器中非压缩型BCD码转换成为真正的二进制数,并存放在AL寄存器中 ; AX : 0014H ; AX : 0200H 三、逻辑运算指令1) NOT 按位取反NOT OPRDAX:73H DX: 85HMOV AX, DXNOT AXADD AX, DXINC AX0000 0000 1000 01011111 1111 0111 10101111 1111 1111 11110000 0000 0000 0000对标志位没有影响2) AND与 OR或 XOR异或AND OPRD1, OPRD2OPRD1 AN

37、D OPRD2 OPRD1这三条指令执行后,CF=0, OF=0, SF, PF, ZF发生变化。MOV AX, 2050HAND AX, 0FFHAX: 0050H PF=1, SF=0, ZF=00010 0000 0101 00000000 0000 1111 11110000 0000 0101 0000XOR : 相同出0, 相异出1AL: 00001111XOR AL, 0FFH0000 11111111 11111111 0000XOR AL, 00H0000 11110000 00000000 1111与0异或,状态不变;与1异或,状态相反。对某些位置1用OR;对某些位清零用A

38、ND;对某些位取反用XOR。例:假设BX=1110 0011B, 变量VALUE的值为:0111 1001B , 确定下列各条独立指令的结果。XOR BX, VALUEAND BX, VALUEOR BX, VALUEXOR BX, 11111111B1001 10100110 00011110 00110111 10010110 00011111 10111001 10101111 10111110 00111111 11110001 11000001 11003) TESTTEST OPRD1, OPRD2按位相与,结果只影响标志位OPRD1 AND OPRD2 影响标志TEST CX,

39、0FFFFHJZ P1; 检验CX是否为零; 若标志ZF=1,转向 P1CF=0, OF=0, SF, PF, ZF发生变化。4) 移位指令非循环移位指令(4条)SAL(Shift Arithmetic Left):算术左移(无符号数)SHL(Shift Logic Left):逻辑左移(无符号数)0CF左移一位进CF,右边补0,相当于乘2。影响标志若移位后最高位与CF不同,则OF=1,表示移位前后数据变号。若移位位数大于1,所移的位数用CL存放。MOV AL, 02HSAL AL, 1;AL: 0000 0010;AL: 0000 0100MOV AL, 02HSAL AL, 4MOV AL

40、, 02HMOV CL, 4SAL AL, CL;AL: 0000 0010;AL: 0010 0000 SAR(Shift Arithmetic Right): 算术右移CF最低位进CF, 左边重复最高位, 即操作数符号不变。一般用于有符号数的右移,符号扩展。若移位位数大于1,所移的位数用CL存放。MOV AL, -4SAR AL, 1;AL: 1111 1100 ;AL: 1111 1110-2(真值) SHR(Shift Logic Right): 逻辑右移CF最低位进CF, 左边补0。一般用于无符号数的右移。若移位位数大于1,所移的位数用CL存放。MOV AL, 8SHR AL, 1;

41、AL: 0000 1000;AL: 0000 010040MOV SI, -1MOV CL, 4SAL SI, CLAND SI, 7FFFHOR SI, 8000HNOT SI;SI: 1111 1111 1111 1111;SI: 1111 1111 1111 00001111 1111 1111 00000111 1111 1111 1111;SI: 0111 1111 1111 0000;SI: 1111 1111 1111 0000;SI:0000 0000 0000 1111试分析下面程序完成什么任务?MOV CL, 4SHL DX, CLMOV BL, AHSHL AX, CLS

42、HR BL, CLOR DL, BLAX0BL0DX0循环移位指令(4条) ROL(Rotate Left): 不带进位循环左移CF若移位后最高位与CF不同,则OF=1,表示移位前后数据变号。若移位位数大于1,所移的位数用CL存放。 ROR(Rotate Right): 不带进位循环右移CF若移位位数大于1,所移的位数用CL存放。RCL(Rotate through CF Left): 带进位循环左移CFRCR(Rotate through CF Right): 带进位循环右移CF可实现多字节的移位,将DX, AX左移1位SAL AX, 1RCL DX, 1CFAX0CFDXCF假定 DX:

43、0000 0000 10111001B, CL: 3 , CF: 1SHR DX, 1SAR DX, CLSHL DX, CLSHL DL, 1ROR DX, 1ROR DX, CLSAL DH, 1RCL DX, CLRCR DL, 1; DX: 01011100 CF : 1; DX: 00010111 CF : 0; DX: 101 1100 1000 CF : 0; DX: 0111 0010 CF : 1; DX:1000 0000 0101 1100 CF:1; DX:0010 0000 0001 0111 CF:0; DX:0000 0000 1011 1001 CF:0; DX

44、:0000 0101 1100 1100 CF:0; DX:0000 0000 1101 1100 CF:1四、串操作指令用一条指令实现对一串数据或字符的操作,字符或数据的个数在CX中,每执行一次CX自动减1,直至减到零,串操作自动停止;源操作数在DS:SI中,目的操作数在ES:DI中;源操作数和目的操作数都在内存中,是唯一一条从内存到内存的指令;DF=1,地址自动由高至低,减量进行串运算;DF=0,地址自动由低至高,增量进行串运算。串传送指令 MOVSB:每次传送一个字节;MOVSW:每次传送一个字; 将位于DS段,由SI所指出的存储单元的字节或字传送到位于ES段,由DI所指的存储单元中,再

45、根据DF修改SI和DI,从而指向下一个元素,继续传送,直到CX为0为止。 DS:SIES:DIDS:SIES:DIDS:SIES:DI MOV SI, 1000H MOV DI, 2000H MOV CX, 100 CLDKKK: MOVSB DEC CX JNZ KKK假设DS与ES段已经赋值;设置源操作数指针;设置目的操作数指针;传送的元素个数;DF=0,每传送一次,地址自动加1,继续传送;每次传送一个字节; 传送一次,CX减1; CX不为0,继续转向KKK处MOVSB: 相当于 DS:SIES:DI SI=SI+1 DI=DI+1 (DF=0)MOV SI, 1000HMOV DI, 2

46、000HMOV CX, 100CLDREP MOVSB通常,在串传送指令前加无条件重复前缀REP,程序可自动计数并判别是否传送完毕。REP MOVSB 相当于 DS:SIES:DISI=SI+1DI=DI+1CX=CX-1 CX!=0 串比较指令 CMPSB:每次比较一个字节;CMPSW:每次比较一个字; 将位于DS段由SI所指出的存储单元的字节或字和ES段由DI所指的字节或字相比较,并且在比较之后根据DF自动修改SI和DI,通过段前缀的控制,可以实现在两个字符串中寻找第一个不相等的元素或第一个相等的元素。依次比较两个字符串是一个循环过程,这个循环过程有两种退出条件,一是满足比较条件,如找到第

47、一个相等字符或找到第一个不相等的字符;二是没有满足比较条件但已比较完所有的字符。串比较操作的段前缀:REPNZ/REPNE: 不相等时继续寻找,直到寻找到第一个相等的字符或寻找完所有的字符(CX=0)。REPZ/REPE: 比较结果相等时继续寻找,直到寻找到第一个不相等的字符或寻找完所有的字符(CX=0)。CX不影响ZF判断一个微型机系统是否为初次加电,如果不是初次加电可以检测到在RAM的400H单元开始的4个字节分别设置了加电标志12, 23, 34, 45。这4个字节的加电标志是在初次加电时,由ROM区(位于0E2DH单元开始的4个字节)复制过去的。当然,ROM区中的E2DH处的加电标志是

48、永存的。假设ES指向RAM区,DS指向ROM区 MOV SI, 0E2DH MOV DI, 0400H MOV CX, 4 CLD REPZ CMPSB JZ DONE RETDONE: ;后续处理相等继续比较如果4个字节都符合,表明设置好了加电标志否则返回ZF与CX无关MOVSB MOVSWCMPSB CMPSW指令完成后指针(SI, DI) 自动增加或减少(DF);加上段前缀后,CX自动减1,并判断CX是否为0。若为0,终止循环。REPREPNZ/REPNE REPZ/REPE 取字符串指令 LODSB/LODSW (Load String)将位于DS段SI所指的存储单元的内容取到AL或A

49、X中。用LODSB时,每次取一个字节,取完后,地址自动加1或减1;用LODSW时,每次取一个字,取完后,地址自动加2或减2。该指令一般不用段前缀,否则,AL或AX中的内容会被后一次操作覆盖,最后只能得到内存中字符串的最后一个字节或字。ALLODSBDS:SIDS:SIDS:SIDS:SI存字符串指令 STOSB/STOSW (Store String)把AL或AX中的数据存放到位于ES段DI所指的存储单元中,并自动修改地址指针。该指令可加段前缀,使内存中连续的空间填满相同的数据。将从0404H开始的256个单元清零CLDLEA DI, 0404HMOV CX, 80HXOR AX, AXREP

50、 STOSW将从0700H单元开始的5个字节的内容逐一取来,放在累加器中进行处理,处理完后再送到0700H的内存区域。 CLDMOV SI, 0700HMOV DI, 0700HMOV CX, 5L1: LODSBPUSH CXPOP CXSTOSBDEC CXJNZ L1处理字符指令不用考虑指针DI,SI的变化字符串检索指令 SCASB/SCASW (Scan String)将AL或AX中的数据与位于ES段DI指针所指的内存单元的数据相比较,通过段前缀的控制,可以寻找到内存单元中的第一个与AL(或AX)不同或相同的数据。REPNZ SCASB:(AL)-ES:DI , 不为0(不相等) 时继

51、续比较,DI自动加1或减1,CX自动减1,直到相等或CX为0时退出循环。寻找第一个相同的数据REPZ SCASB:(AL)-ES:DI , 为0(相等) 时继续比较,DI自动加1或减1,CX自动减1,直到不相等或CX为0时退出循环。寻找第一个不同的数据有一字符串放在以2000H单元为始地址的内存中,从中搜索串结束符$,若有,将串长度x放入2100H单元,若没有$, 2100H单元放入0FFH。CLDMOV DI, 2000HMOV CX, 100MOV AL, $REPNE SCASBJZ DONEMOV AL, 0FFHJMP STODONE: MOV BX,100 SUB BX, CX D

52、EC BL MOV AL, BLSTO: MOV 2100H, AL不等继续比较若相等,转向DONE比较完毕CX=0,不等,设立标志计算字符串长度五、控制转移类指令所有的转移类指令均不影响标志位无条件转移指令64KB内段内转移,目标指令与转移指令在同一个代码段CS,只改变IPCS:IPCS:新IP可以超过64KB段间转移,目标指令与转移指令分别在不同的代码段,转移时需要改变CS和IP的值CS:IP新CS:IP段内直接转移:转移指令后直接给出目的指令处的地址。CS不变JMP 立即数JMP 2000H;立即数为16位或8位,是目的地的IP; IP=2000H段内间接转移:目的地指令地址存放在寄存器

53、或内存单元中,转移指令后给出的是寄存器或内存单元的地址JMP OPRD;OPRD为寄存器或内存单元地址JMP AX; AXIPJMP WORD PTR2000H; DS:2001HDS:2000HIPJMP WORD PTRSI; DS:SI+1DS:SIIP段间直接转移:转移指令后直接给出目的指令处的地址CS:IP。JMP 立即数JMP 2000H:1236H;立即数为CS:IP的形式; CS=2000H IP=1236HJMP 语句标号(子程序名)语句标号自动产生段间调用。段间间接转移:目的地指令处的地址存放在内存单元中,一般用寄存器间接寻址。JMP DWORD PTR SI; DS:SI

54、+3SI+2CS DS:SI+1SIIPDS:SICSIP设DS: 2000H, BX: 1256H, SI:528FH TABLE: 20A1H, 232F7H=80H, 232F8H=32H, 264E5H=50H, 264E6H=24HJMP BX; IP=1256HJMP TABLEBX; IP=3280HJMP BXSI; IP=2450H条件转移指令:根据标志位来判断程序是否转移。 只能转移到距当前指令-128-127字节的范围内,即一个字节的补码范围; 比较两数大小的指令,分有符号数和无符号数两套指令。127128根据5个标志位来判断,SF, ZF, PF, CF, OF 共有1

55、0个状态,分别是:JS/JNS JZ/JNZ JP/JNP JC/JNC JO/JNO为1/0转移。JS rel; rel为8位补码,在实际应用中一般为指令标号 判断无符号数大小的指令(CF和ZF):JA/JNBE JAE/JNB JB/JNAE JBE/JNA 判断有符号数大小的指令(OF, SF和ZF):JG/JNLE JGE/JNL JL/JNGE JLE/JNG JCXZ rel; 如CX中的值为0则转移,判断循环用下面程序段在什么情况下的执行结果是AL=0BEGIN: IN AL, 5FH TEST AL, 80H JZ A1 XOR AX, AX JMP STOPA1: MOV A

56、L, 0FFHSTOP: HLT当5FH口的最高位为1时当元素结果为0时,不能转向标号L1处的指令是:A) JAE L1 B) JGE L1 C) JNZ L1 D) JE L1设数据区1000H开始的区域中存放着50个字节的符号数,要求找出其中最大的一个数并存放到0FFFH单元。 MOV BX, 1000H MOV AL, BX MOV CX, 31HL1: INC BX CMP AL, BX JGE L2 MOV AL, BXL2: DEC CX JNE L1 MOV BX, 0FFFH MOV BX, AL HLT子程序调用和返回指令RET调用处子程序首地址子程序返回处返回指令CALL

57、语句标号或子程序名同样分段内调用和段间调用,一般为直接调用段内调用:子程序距调用语句不超过64KB,在同一个代码段CS内,调用时,只改变IP即可。CALL RET3010H8050HSSCSSP1. 将3010H入栈保护SP30H10HSP2. 将IP赋值8050H3. 执行子程序4. 执行RET, 堆栈内容进入IP, SP还原5. 继续运行主程序SP段间调用:子程序距调用语句可以超过64KB,不在同一个代码段,调用时,需要同时改变CS和IP。RET调用指令2000H:1500H3400H:2460HSS20H00HSP15H00H原CS原IP3400HCS2460HIP1500HIP2000

58、HCS段间调用步骤:将调用指令后的第一条指令地址的CS入栈;将调用指令后的第一条指令地址的IP入栈;将调用目的地地址的段地址赋值CS;将调用目的地地址的偏移地址赋值IP;执行CS:IP,直至遇到RET指令;将堆栈当前内容赋值IP;将堆栈当前内容赋值CS;执行CS:IP。调用返回指令:RET将当前堆栈内容返回到IP(段内调用)或IP,CS(段间调用),具体是段内调用还是段间调用由定义子程序的语句决定的。RET n:从栈顶弹出返回地址后,SP+nSP,n为偶数,即栈顶位置跳过n个字节。返回地址后SPRET 4SP+4SP4执行下列语句后,写出结果:10A3H: 2000H XOR AL, AL 2

59、002H MOV AX, CS 2004H MOV SS, AX 2006H MOV SP, 2F00H 2009H MOV DX, 2012H 200CH PUSH DX 200DH CALL 2700H 2010H ADD CX, DX 2012H HLT10A3H: 2700H POP CX 2701H RET; AL: 0; AX: 10A3H; SS: 10A3H; SP: 2F00H; DX: 2012H10A3H:2F00H20H12H20H10HCXSP;未执行CX: 2010H循环控制指令:可以用判断指令强制跳出循环,也有专用的循环控制指令(3条)。 3条指令循环范围均在-128127字节内; 循环前必须将循环次数赋值给CX; 不影响标志位1) LOOP 标号CX-1CX, 若CX不为0,转移到标号处继续循环2) LOOPZ/LOOPE 标号CX-1CX, 若CX0且ZF=1时继续循环CX为0并不影响标志位ZF,ZF是否为1是由循环指令前面的指令决定的。3) LOOPN

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论