Download presentation
Presentation is loading. Please wait.
1
微型计算机原理及应用
2
第二章 8086/8088指令系统
3
寻址方式 /8088指令系统 数据传送指令 算术运算指令 逻辑运算和移位指令 程序控制指令 串操作指令 标志处理与CPU控制指令
4
2.1 8086/8088寻址方式 操作码 操作数… 指令格式: 操作码:计算机所要执行的操作,或指出操作类型,是一种助记符。
/8088寻址方式 指令格式: 操作码 操作数… 操作码:计算机所要执行的操作,或指出操作类型,是一种助记符。 操作数:操作的对象,可以是操作数本身或存放操作数的内存(I/O端口)地址或其它有关操作数的信息 。
5
汇编语言是一种符号语言,它用助记符来表示操作码,用符号或符号地址来表示操作数或操作数地址,它与机器指令是一一对应的。
6
寻址方式:是指令中用于说明如何寻找操作数的方法。
计算机中操作数常存放在以下几个地方: 指令代码中,存放常量;MOV AX, 2070H 寄存器中:MOV AX, BX 内存中: MOV AX, [2000H] I/O端口中(仅对IN/OUT指令): IN AL, 40H
7
8086/8088的基本寻址方式有六种: 寄存器寻址 ;操作数存放在寄存器中 立即寻址 ;操作数存放在内存代码段
立即寻址 ;操作数存放在内存代码段 直接寻址 ;操作数存放在内存 寄存器间接寻址;操作数存放在内存 变址寻址 ;操作数存放在内存 基址加变址寻址 ;操作数存放在内存
8
MOV CL, AX 一、 寄存器寻址 操作数放在CPU内部的寄存器中,可以是8位或16位寄存器,注意源操作数和目的操作数的位数应一致。
MOV AX, BX ;将 BX中的内容传送到AX中去 MOV AL, BH ;将 BH中的内容传送到AL中去 MOV CL, AX 错误! 不匹配
9
操作数直接放在指令中,紧跟在操作码的后面,与操作码一起放在存储器的代码段中(8/16位)。
二、 立即寻址 操作数直接放在指令中,紧跟在操作码的后面,与操作码一起放在存储器的代码段中(8/16位)。 MOV AX, 2030H 对应机器码: B8H 2030H 4004H 4003H 4002H 4001H 4000H …… 20H 30H B8H 4004H 4003H 4002H 4001H 4000H …… 20H 30H B8H 高字节 高地址 低字节 低地址 注意别错! AX AH AL 20H 30H 单元内容 内存偏移地址
10
MOV AX, [0020H] 三、 直接寻址 操作数存放在内存中,在指令中给出存放单元的偏移地址,如果不加说明,操作数默认在数据段。
物理地址: (DS)×16+指令中给的16位偏移地址 MOV AX, [0020H] ;将 数据段偏移地址为0020H的地址中的内容传送到AX中去,相当于: MOV AX, DS:[0020H] 注意:书写时加方括号。
11
MOV AX, [0020H] AX: 3412H 码段 堆栈段 数据段 AX AH AL 34 12 内存内容 偏移地址 DS:0000H
…… 0000H 0001H 0020H 0021H 0022H MOV AX, [0020H] …… 12H 34H 56H 码段 AX: 3412H 堆栈段 内存内容 偏移地址 DS:0000H 数据段 AX AH AL 34 12
12
MOV AL, ES:[0020H] MOV SS:[0100H], BX
也可以指向内存中其他段的数据,这时要在相应的偏移地址前加段超越符和“ :”。 MOV AL, ES:[0020H] ;将 扩展段中偏移地址为0020H单元中的内容传送到AL中去 MOV SS:[0100H], BX ;将 BX中的内容传送到堆栈段中偏移地址为0100H、0101H的单元中去
13
MOV AX, [BX] 四、 寄存器间接寻址 操作数存放在内存中,但其偏移地址存放在指令中给出的寄存器中。
其中,作为间接寻址的寄存器只能有4个:BX, SI, DI, BP,其他寄存器无此功能。
14
注意:用BP间接寻址,操作数默认在堆栈段,用其余3个寄存器时,操作数默认在数据段。
1、对DI、SI、BX间接寻址 物理地址: (DS)×16+DI/SI/BX中给的16位偏移地址 2、对BP间接寻址 物理地址: (SS)×16+BP中给的16位偏移地址
15
AX: 0078H MOV BX, 1100H 码段 MOV AX, [BX] 堆栈段 数据段 AX AH AL 00 78 内存内容
…… 0000H 0001H 1100H 1101H 1102H …… 78H 00H 56H MOV BX, H 码段 MOV AX, [BX] AX: 0078H 堆栈段 内存内容 偏移地址 DS:0000H 数据段 AX AH AL 00 78
16
例1:MOV AX, ES:[BX] ;传送的操作数在附加段中,偏移地址存放在BX中。 例2:MOV [BP], BX ;将BX中的内容传送到堆栈段中,其目的地的偏移地址存放在BP中。 例3: MOV [CX], H ;错,不能对CX间接寻址
17
偏移地址=寄存器内容+指令中给定的偏移量
五、 变址寻址 操作数在内存中,由指定的寄存器内容,加上指令中给出的8位或16位偏移量作为操作数的偏移地址,计算方法: 偏移地址=寄存器内容+指令中给定的偏移量 同样,作为变址的寄存器只能有4个:BX, SI, DI, BP,其他寄存器无此功能。
18
注意:用BP变址寻址,操作数默认在堆栈段,用其余3个寄存器时,操作数默认在数据段。
1、对DI、SI、BX变址寻址 物理地址: (DS)×16+计算出的偏移地址 2、对BP变址寻址 物理地址: (SS)×16+计算出的偏移地址
19
MOV DH, [SI+0200H] ;此时传送的操作数在数据段中,其偏移地址是SI寄存器中的内容加上0200H 变址寻址可以有多种格式:
MOV AX, [BX+0A00H] MOV AX, TAB[DI] 如:MOV AX, H+[BX] 假设DS:3000H, BX: 1000H 则操作数所在地址: 高8位: 31201H 低8位: 31200H
20
六、 基址加变址寻址 操作数存放在内存中,但其偏移地址是由三部分相加而成: 基址寄存器内容+变址寄存器内容+偏移量 基址寄存器只有2个:BX,默认的操作数在数据段;BP,默认的操作数在堆栈段。 变址寄存器只有2个:SI和DI。 偏移量同样由指令给出。
21
1、BX作为基地址 物理地址: (DS)×16+计算出的偏移地址 2、BP作为基地址 物理地址: (SS)×16+计算出的偏移地址
22
MOV AX, [BX+SI+0200H] ;欲传送的操作数在数据段中,其偏移地址是BX寄存器中的内容加上SI寄存器中的内容加上0200H
MOV AX, VAL[BX+SI] MOV AX, 0200H[BX][SI] MOV AX, 0200H[BX][BP];错误 MOV AX, 0200H[SI][DI];错误 MOV AX, COUNT[BP+SI] ;欲取的数据在堆栈段
23
DS= 2000H SS=3000H BX=1000H BP=3000H MOV AX, BX MOV AX, [3000H]
MOV AL, [BP] MOV SI, 0002H MOV CX, [BX][SI] MOV DL, [BX+06H] AX= 1000H AX= 2010H AX= 3412H AL= 1BH SI= 0002H CX= 7856H DL= DEH 21000H 21001H 21002H 21003H 21004H 21005H 21006H 21007H 12H 34H 56H 78H 9AH BCH DEH F0H 31000H 31001H 31002H 31003H 31004H 31005H 31006H 31007H 1AH 2AH 3AH 4AH 5AH 6AH 7AH 8AH 23000H 23001H 23002H 23003H 23004H 23005H 23006H 23007H 10H 20H 30H 40H 50H 60H 70H 80H 33000H 33001H 33002H 33003H 33004H 33005H 33006H 33007H 1BH 2BH 3BH 4BH 5BH 6BH 7BH 8BH
24
2.2 8086/8088指令系统 8088/8086指令系统可以分为以下六个功能组: 数据传送(Data Transter)
/8088指令系统 8088/8086指令系统可以分为以下六个功能组: 数据传送(Data Transter) 算术运算(Arithmetic) 逻辑运算(Logic) 程序控制(Program Control) 串操作(String Menipulation) 标志处理 和CPU控制(Processor Control)
25
一、数据传送指令 1. 通用数据传送指令 格式:MOV OPRD1, OPRD2 功能: (OPRD2) OPRD1 CPU内部寄存器之间数据的传送(除CS、IP) 立即数传送至CPU内部的通用寄存器组 CPU内部的寄存器(除CS、IP)与存储器(所有寻址方式)之间 能实现用立即数给存储单元赋值
26
注意: CS,IP不能作为目的操作数 MOV CS, AX 两个段寄存器间不能直接传送 MOV SS, DS 立即数不能直接传送给段寄存器 MOV DS,2000H 内存单元间不能直接传送 MOV [SI], [2000H] 立即数不能作为目的操作数 MOV 1000H, AX
27
MOV BL, AX MOV 100, CX MOV [SI], DI MOV CS, AX MOV [SI], [DI] MOV BH, 2[DI] MOV AX, CS MOV SS, 2400H MOV [BP+4], AX 错误,不匹配 错误,立即数不能赋值 正确 错误,CS不能赋值 错误,内存间不能直接传送 错误,段寄存器不能赋立即数
28
假设用户定义堆栈为100个字节,则SP自动设置为0064H
2. 堆栈指令 堆栈是按先进后出的原则组织的一段内存区域,一般作临时存储器用(仓库)。其指针SP为16位的寄存器,始终指向栈顶(货物堆放的位置)。堆栈的空间大小可用户指定。如: 20000H SS的值为 2000H 表示堆栈从20000H处开始 100个字节 假设用户定义堆栈为100个字节,则SP自动设置为0064H 20064H SP:0064H
29
堆栈的操作有两种:入栈/出栈 SP SP SP SP SP 1、格式:PUSH OPRD 20000H 功能: (OPRD)入栈
FFH (1) SP-1SP AH[SP] (2) SP-1SP AL[SP] 先减指针, 再压数据, 先高后低 例: MOV AX, 1234H PUSH AX;入栈 100个字节 2、格式:POP OPRD 功能: 栈顶内容送OPRD 弹出低字节 SP 34H 弹出高字节 (1) [SP]BL SP+1SP SP SP 12H (2) [SP]BH SP+1SP 20064H SP SP 先出数据, 再加指针,先低后高
30
注意: 只能对16位数进行操作,一次压入弹出一个字 PUSH AH;错 必须对寄存器的内容或内存单元的内容进行操作 PUSH 2000H;错 PUSH [2000H]; 对 例:设SP为0100H,SS为2000H, PUSH BX后,栈顶的物理地址是: 20100H-2H=200FEH 而执行POP BX后,栈顶的物理地址是: 20100H+2H=20102H
31
例:设DS= 2000H SS=3000H SP=0064H,执行下列程序: MOV AX, 1000H PUSH AX
9AH BCH DEH F0H 12H MOV AX, 1000H PUSH AX MOV BX, AX PUSH [BX] POP [1002H] POP BX 34H BX= 1000H 30000H 30001H …… 30060H 30061H 30062H 30063H 30064H BX=1000H SP 12H 34H SP 00H 10H SP SP
32
3. 交换指令XCHG 格式:XCHG OPRD1, OPRD2 功能:(OPRD1) (OPRD2) 完成通用寄存器之间,通用寄存器与累加器之间、与存储器之间8位,16位数据的相互交换。 例如:XCHG BL, AH XCHG AX, [BX] 内存之间的数据、累加器之间不可相互交换 CS,IP不能参与交换 段寄存器和立即数不能作为一个操作数
33
4. 累加器专用指令(只与AX或AL有关,与AH无关)
1)输入输出指令 CPU OUT IN AX或AL 输入 输出 存储器 格式:IN AL , PORT IN AX, PORT 功能:从PORT口输入数据到AL(AX)。 格式:OUT PORT , AL OUT PORT, AX 功能:将AL(AX)中的内容从PORT口输出。
34
当端口地址大于8位(0FFH)时,要用DX间接寻址 MOV DX, 352H IN AL, DX MOV DX, 400H
IN AL, 40H OUT 40H , AL 8位 IN AX, 40H OUT 40H , AX 16位 (40H) AL (41H) AH AL (40H) AH (41H) IN, OUT只能对AL, AX操作,若传送的数据为16位,则端口地址只能取偶数。 当端口地址大于8位(0FFH)时,要用DX间接寻址 MOV DX, 352H IN AL, DX MOV DX, 400H OUT DX, AL
35
2) 换码(查表)指令 XLAT 将累加器AL中的内容变换为存储器(默认数据段)表格中的某一个值,常用来实现编码码制的转换。 DS段 要求:BX指向表的首地址的偏移地址,AL中的内容为表中某一项与首地址之间的偏移量。 在执行查表指令时,CPU将BX与AL的值相加作为偏移地址,将它所对应单元中的内容取出送到AL中去。 11H …… 20H 33H 22H BX AL BX+0 BX+AL BX+2 BX+1 表格首地址 AL
36
注意:使用该指令前,应先建立一张表,该表的最大容量为256字节。(默认在数据段)
例: 将十进制数0~9转换成七段数码管的显示编码 40H 79H 24H 30H 19H 12H 02H 78H 00H 10H 1 2 3 4 5 6 7 8 9 40H 1 79H
37
例: 从5号端口输入十进制数,转换为显示编码后从20号端口输出。
DS段 MOV BX, 2000H IN AL, 5H XLAT OUT 20H, AL 2000H 2001H 2002H 2003H 2004H 2005H 2006H 2007H 2008H 2009H 40H 79H 24H 30H 19H 12H 02H 78H 00H 10H 1 2 3 4 5 6 7 8 9 如果改为: MOV BX, 2000H MOV AL, [5H];不同? XLAT OUT 20H, AL
38
例:向端口40H送字符35的显示编码。 MOV BX, 2000H MOV AL, 3 XLAT OUT 40H, AL MOV AL, 5
DS段 MOV BX, 2000H MOV AL, 3 XLAT OUT 40H, AL MOV AL, 5 OUT 40H, AL 2000H 2001H 2002H 2003H 2004H 2005H 2006H 2007H 2008H 2009H 40H 79H 24H 30H 19H 12H 02H 78H 00H 10H 1 2 3 4 5 6 7 8 9
39
5. 地址传送指令 1) 取偏移地址指令 LEA 格式:LEA OPRD1,OPRD2 功能:将源操作数的偏移地址送到目的操作数中。
要求源操作数必须为存储器操作数,目的操作数必须为一个16位的通用寄存器。 该指令通常用来使一个寄存器作为地址指针。 LEA BX, TAB ; 将TAB标号所指位置的偏移地址送 BX MOV AL, [BX] ; 以BX为地址指针取一个数据
40
LDS DI, [2130H] 2) LDS 将指定内存中的4个字节(32位)分别装入指定的寄存器和段寄存器DS中。
例:数据段2130H~2133H单元中存放一个地址 [2130H] [2131H] 为该地址的偏移地址 30H 19H …… 79H 40H 24H 2133H 2134H 2131H 2130H 2132H DS段 [2132H] [2133H] 为该地址的段地址 LDS DI, [2130H] 执行后:DI= 7940H DS= 3024H
41
3) LES 将指定内存中的4个字节(32位)分别装入指定的寄存器和段寄存器ES中。 例:DS=1000H DI = 0400H [10400H]=FFH [10401H]=00H [10402H]=AAH [10403H]=00H LEA SI, [DI] ; SI= 0400H LES AX, [DI] ; AX= 00FFH ES=00AAH
42
1)LAHF(Load AH with Flags):读取标志
6. 标志寄存器传送指令 1)LAHF(Load AH with Flags):读取标志 标志寄存器PSW中的低8位AH 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 OF DF IF TF SF ZF AF PF CF AH D7 D6 D4 D2 D0 2)SAHF(Set Flags with AH): 设置标志 AH标志寄存器中的低8位
43
3)PUSHF: 标志寄存器入栈命令 4)POPF:将栈顶内容送标志寄存器PSW 注意:这个命令将改变PSW的内容。
44
二、算术运算指令 8086/8088提供加、减、乘、除四种基本算术操作。这些操作都可用于字节或字的运算,也可以用于带符号数与无符号数的运算。 带符号数用补码表示。 同时8086/8088也提供了各种校正操作,故可以进行十进制算术运算。
45
参与加、减运算的操作数可如图所示。
46
1、加法指令 1) 不带进位的加法 格式:ADD OPRD1, OPRD2 功能:(OPRD1) + (OPRD2)OPRD1 结果影响标志位 ADD [BX+DI], 2000H;存储器与立即数相加 ADD DX, 50H[BX+SI];通用寄存器与存 储单元内容相加 ADD [BX+DI], [2000H];错
47
MOV AL, 49H ADD AL, 0D7H 结果:CF=1, OF=0, ZF=0, SF=0, PF=0, AF=1 设 BX=C588H, 执行 ADD BH, BL后? CF=1, OF=1, ZF=0, SF=0, PF=1, AF=0
48
2) 带进位的加法 格式:ADC OPRD1, OPRD2 功能:(OPRD1) + (OPRD2)+CFOPRD1 结果影响标志位 该指令主要用于多字节数相加
49
CLC SI MOV SI, 2000H MOV AX, [SI] ADD AX, [3000H] MOV [SI], AX
例:两个四字节无符号数相加,这两个数分别放在数据段以2000H和3000H开始的存储单元内,高位在高地址,低位在低地址,要求运算结果放在2000H开始的单元内。 CLC MOV SI, H SI 2000H 2001H 2002H 2003H 40H 79H 24H 30H MOV AX, [SI] ADD AX, [3000H] MOV [SI], AX MOV AX, [SI+2] ADC AX, [3000H+2] MOV [SI+2], AX 3000H 3001H 3002H 3003H 40H B9H A4H 30H
50
3) 增量指令 格式:INC OPRD 功能:(OPRD) +1OPRD 不影响CF, 影响AF, OF, PF, SF和ZF MOV AL, 0FFH ; ZF=1 INC AL INC [BX]
51
2、 减法指令 1) 不带借位的减法 格式:SUB OPRD1, OPRD2 功能: (OPRD1) -( OPRD2) OPRD1 结果影响标志位 SUB BX, DX; 通用寄存器之间 SUB AL, [BX+SI]; 累加器和存储器之间 SUB [BX+DI], [2000H];错
52
-E 2 D7 6 D 7 2 MOV CX, 5049H SUB CX, 0E2D7H 结果:CF=1, OF=0, ZF=0, SF=0, PF=1, AF=1
53
2) 带借位的减法 格式:SBB OPRD1, OPRD2 功能: (OPRD1)-(OPRD2)-CFOPRD1 结果影响标志位 该指令主要用于多字节数相减 LEA BX, BUFF SUB AL, [BX] SBB AH, [BX+1]
54
3) 减量指令 格式:DEC OPRD 功能:(OPRD) - 1OPRD 不影响CF, 影响AF, OF, PF, SF和ZF MOV CX, 1 DEC CX ; ZF=1
55
4) 求补指令 格式:NEG OPRD; 对操作数取补码后送回 功能:0 – (OPRD) OPRD NEG AL NEG COUNT 指令影响标志位AF,CF,OF,PF,SF和ZF, 此指令执行时, 只有当操作数为0时, CF为0, 否则CF总为1。 若操作数为80H或8000H,执行求补指令后,结果没有变化,但OF置1。
56
5) 比较指令 格式:CMP OPRD1, OPRD2 功能:(OPRD1) - (OPRD2) 不送回结果,只影响标志位 CMP AX, 2000H; 将AX内容与2000H相比较 CMP AX, [BX+DI+100]; 将AX内容与存储单元的值相比较 比较结果影响标志位AF,CF,OF,PF,SF和ZF。
57
比较指令主要用于比较两个数之间的关系 若两者相等,相减以后结果为零,ZF标志为1,否则为0。 大小的比较( 假设CMP AX,BX ) 对无符号数,若结果没有产生借位(CF=0),则AX≥BX;若产生了借位(CF=1),则AX<BX。 对带符号数,则可根据OF与SF异或运算的结果来判断,结果为1,则AX<BX,结果为0,则AX≥BX
58
3、乘法指令 8位数×8位数 16位数 16位数×16位数 32位数 约定: 两个8位数相乘,有一个乘数在AL中,另一个乘数在寄存器或内存中,乘积在AX中; 两个16位数相乘,有一个乘数在AX中,另一个乘数在寄存器或内存中,乘积的高16位在DX中,低16位在AX中。 乘法有有符号数和无符号数两套指令
59
功能:AL/AX×OPRD AX / DX, AX
无符号数乘法指令 格式:MUL OPRD; 不出现 AL 或 AX 功能:AL/AX×OPRD AX / DX, AX MUL BL; AL × BL AX MUL CX; AX × CX DX(高位) , AX(低位) MUL BYTE PTR [DI]; AL × ? AX MUL WORD PTR [SI]; AX × ? ?
60
格式:IMUL OPRD; 不出现 AL 或 AX
2) 有符号数乘法指令 格式:IMUL OPRD; 不出现 AL 或 AX 功能上与MUL相似, 要求两个乘数必须为有符号数 IMUL BL; AL × BL AX IMUL CX; AX × CX DX(高位) , AX(低位) IMUL BYTE PTR [DI];
61
乘法运算时,结果影响CF和OF,AF, PF, SF, ZF标志位无意义。
对MUL指令: 当乘积的高半部分不为0,CF=1, OF=1; 否则,CF=0, OF=0 。 CF=1, OF=1表示高半部分包含有结果的有效数 对IMUL指令: 当乘积的高半部分是低半部分最高位的扩展,乘积的高半部分每位与低半部分最高位相同时:CF=0, OF=0; 否则,CF=1, OF=1 。
62
例: MOV AL, 0FBH MOV BH, 02H IMUL BH 结果:AX=0FFF6H, 即-10, CF=0, OF=0 MOV AL, 0FBH MOV BH, 02H MUL BH 结果:AX=01F6H, 即502, CF=1, OF=1
63
4、除法指令 16位数÷8位数 8位数 32位数÷ 16位数 16位数 约定:除数必须为被除数的一半字长 被除数为16位,放在AX中,除数为8位,在寄存器或内存中, 8位商在AL中, 8位余数AH中; 被除数为32位,放在DX(高位), AX(低位)中,除数为16位,在寄存器或内存中, 16位商在AX中, 16位余数DX中。 除法有有符号数和无符号数两套指令
64
格式:DIV OPRD; 不出现 AX 或 DX AX 功能:DX,AX/AX ÷OPRD AX/AL,DX/AH
1)无符号数除法指令 格式:DIV OPRD; 不出现 AX 或 DX AX 功能:DX,AX/AX ÷OPRD AX/AL,DX/AH DIV BL; AX÷BL AL(商) , AH(余数) DIV CX; ?÷ CXAX(商) , DX(余数) DIV BYTE PTR [DI]; AX÷? AL(商) AH(余数)
65
IDIV OPRD; 不出现 AX 或 DX AX 2) 有符号数乘法指令 功能上与DIV相似, 要求被除数,除数必须为有符号数。
IDIV BL; AX÷BL AL(商) , AH(余数)
66
注意: 除法运算后,所有的标志位都是不确定的,没有意义; 用IDIV指令时,如果是双字除以一个字,则商的范围为-32768~32767,如果是一个字除以一个字节,则商的范围为-128~127。如果超出这个范围,会作为除数为0来处理,产生0号中断; 8086系统规定余数的符号和被除数相同; 当8位数除以8位数,16位数除以16位数时,必须对被除数进行扩展。
67
将字节扩展成字的指令:CBW 将AL中的符号位扩展到AH中。当AL<80H,执行CBW后,AH=0;当AL>=80H时,AH=0FFH。 将字扩展成双字的指令:CWD 将AX中的符号位扩展到DX中。当AX<8000H,执行CWD后, DX=0; 当AX>=8000H时,DX=0FFFFH。 当遇到两个字节或字相除时,要预先执行CBW指令或CWD指令,扩展被除数,否则不能正确执行除法操作。
68
5、十进制调整指令 BCD码:用二进制形式表示的十进制码。每一位十进制数用4位二进制表示,运算规则是逢十进一。
0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 8 1000 9 1001 压缩BCD码: 一个字节中有两位BCD码 非压缩BCD码:一个字节只用低4位表示一位BCD码,高4位为0。 BCD码运算时,先用一般的二进制运算,然后再进行BCD码调整。
69
BCD码加法十进制调整指令 1) 非压缩的BCD码加法调整指令 AAA 两个非压缩的BCD码相加,结果在AL中,执行该指令后将结果调整为十进制,放在AX中。 MOV AL, 7H ADD AL, 5H AAA ; AL: 0CH ; AX: 0102H CF=AF=1 调整原则:在调整前若AL低半部包含的数值大于9或AF=1, 则AAA完成下列操作: AL加6,AF和CF置1,AL的高4位清零。
70
7+5=12 用非压缩的BCD码表示运算过程: 16进制加法 BCD码逢十进一,16进制逢16进1,因为低4位大于9,所以在个位上加6,使其产生进位,同时AF=1,CF=1。 AAA指令调整为10进制结果
71
两个压缩的BCD码相加,结果在AL中,执行该指令后将结果调整为十进制,放在AL中。
2) 压缩BCD码加法调整指令 DAA 两个压缩的BCD码相加,结果在AL中,执行该指令后将结果调整为十进制,放在AL中。 MOV AL, 56H ADD AL, 47H DAA ; 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。
72
MOV AX, 1234H MOV BX, 5678H ADD AL, BL DAA MOV CL, AL MOV AL, AH ADC AL, BH MOV AH, AL MOV AL, CL ; AL : ACH ; AL : 12H CF=1 ; CL : 12H ; AL : 12H ; AL : 69H ; AL : 69H CF=0 ; AX :6912H CF=0
73
BCD码减法调整指令与加法调整指令类似,只是分别将加06H, 60H, 66H改为减 06H, 60H, 66H。
AAS: 对非压缩的BCD码减法调整 DAS: 对压缩的BCD码减法调整 注意:调整指令使用时,必须紧跟在相对应的加减法指令后进行。
74
BCD码乘法十进制调整指令 AAM 1) BCD码均为无符号数,故只有用MUL乘法指令才能调整; 2) BCD码乘法调整指令只能对非压缩的BCD码相乘结果进行调整; MOV AL, 05H MOV BH, 06H MUL BH AAM ; AX : 001EH ; AX : 0300H
75
BCD码除法十进制调整指令 AAD 1) BCD码均为无符号数,故只有用DIV除法指令才能调整,并且在两个数相除前进行调整; 2) BCD码除法调整指令只能对非压缩的BCD码相乘结果进行调整; MOV AX, 0300H MOV BL, 05H AAD DIV BL ; AX : 001EH ; AX : 0006H
76
三、逻辑运算指令 1) NOT 格式:NOT OPRD 功能:OPRD按位取反 对标志位没有影响 设:AX=73H DX= 85H MOV AX, DX NOT AX
77
2) AND、 OR、XOR 格式:AND(OR/XOR) OPRD1, OPRD2 功能:OPRD1 AND(OR/XOR) OPRD2 OPRD1 这三条指令执行后,CF=0, OF=0, SF, PF, ZF发生变化。 MOV AX, 2050H AND AX, 0FFH;取AX的低8位 AX=0050H PF=1, SF=0, ZF=0 OR AL, 0FH; 结果? AL=5FH
78
AL: XOR AL, 0FFH XOR AL, 00H 与0异或,状态不变;与1异或,状态相反。 对某些位置1用OR;对某些位清零用AND;对某些位取反用XOR。
79
3) TEST 格式:TEST OPRD1, OPRD2 功能:(OPRD1) AND (OPRD2) 结果影响标志 TEST CX, 0FFFFH JZ P1 TEST AL, 01H JNZ AGAIN ; 检验CX是否为零 ; 若标志ZF=1即CX为0,转向 P1 ; 检验AL最低位是否为零 ; 不为零则转移
80
左移一位进CF,右边补0,相当于乘2。影响标志
4) 移位指令 非循环移位指令(3条) 格式:SAL OPRD, M: 功能:OPRD算术左移M位 格式:SHL OPRD, M: 功能:OPRD逻辑左移M位 CF 左移一位进CF,右边补0,相当于乘2。影响标志 若移位后最高位与CF不同,则OF=1,表示移位前后数据变号。 若移位位数大于1,所移的位数用CL存放。
81
;AL: MOV AL, 02H SAL AL, 1 ;AL: MOV AL, 02H SAL AL, ;错 ;AL: MOV AL, 02H MOV CL, 4 SHL AL, CL ;AL:
82
最低位进CF, 左边重复最高位, 即操作数符号不变。一般用于有符号数的右移,符号扩展。
格式:SAR OPRD, M: 功能:OPRD算术右移M位 CF 最低位进CF, 左边重复最高位, 即操作数符号不变。一般用于有符号数的右移,符号扩展。 若移位位数大于1,所移的位数用CL存放。 ;AL: MOV AL, -4 SAR AL, 1 ;AL: -2
83
最低位进CF, 左边补0。一般用于无符号数的右移。
格式:SHR OPRD, M: 功能:OPRD逻辑右移M位 CF 最低位进CF, 左边补0。一般用于无符号数的右移。 若移位位数大于1,所移的位数用CL存放。 ;AL: MOV AL, 8 SHR AL, 1 ;AL: 4
84
;AL: MOV AL, 48H MOV AH, AL AND AL, 0FH MOV CL, 4 SHR AH, CL MOV NUM, AX ;AL: ;AH: ; NUM: NUM+1: 该程序的功能:完成了将AL中的压缩BCD码变成非压缩BCD码存放在NUM开始的存区。
85
试分析下面程序完成什么任务? 设(DL)=12H,(BL)=34H
MOV CL, 4 SHL DL, CL SHR BL, CL OR DL, BL 该程序的功能:完成了将原DL中的低4位与原BL中的高4位拼起来放在DL中 。 此时,(DL)= 23H
86
若移位后最高位与CF不同,则OF=1,表示移位前后数据变号。
循环移位指令(4条) 格式:ROL OPRD,M : 功能:不带进位循环左移 CF 若移位后最高位与CF不同,则OF=1,表示移位前后数据变号。 若移位位数大于1,所移的位数用CL存放。
87
格式:ROR OPRD,M : 功能:不带进位循环右移
CF 若移位位数大于1,所移的位数用CL存放。
88
可实现多字节的移位,将DX, AX左移1位 CF AX SAL AX, 1 RCL DX, 1 CF DX
格式:RCL OPRD,M : 功能:带进位循环左移 CF 可实现多字节的移位,将DX, AX左移1位 CF AX SAL AX, 1 RCL DX, 1 CF DX
89
格式:RCR OPRD,M : 功能:带进位循环右移
CF 同样可实现多字节的移位。
90
段内转移:目标指令与转移指令在同一代码段中,只改变IP的值
四、程序控制指令 所有的程序控制转移类指令均不影响标志位 分为两种情况: 段内转移和段间转移 JMP LL CS:IP 64KB内 LL:新CS :IP 段内转移:目标指令与转移指令在同一代码段中,只改变IP的值
91
段间转移,目标指令与转移指令分别在不同的代码段,转移时需要改变CS和IP的值
JMP LL CS:IP 段间转移,目标指令与转移指令分别在不同的代码段,转移时需要改变CS和IP的值 可以超过64KB LL:新CS:IP
92
1、无条件转移指令 格式:JMP OPRD 功能:程序转向由OPRD指向的位置执行 分为两种情况:直接转移和间接转移
93
(1)直接转移,分为三种情况: 短程:JMP SHORT OPRD 近程:JMP NEAR PTR OPRD
远程:JMP FAR PTR OPRD OPRD通常以标号形式出现,NEAR为默认值 可以省略。 JMP AGAIN JMP FAR PTR DATCHG
94
短程、近程:差别在于转移的距离不同,其位移量一个是8位,一个是16位。
短程与近程属段内转移,远程属段间转移。 JMP LL CS:IP -128~127 -32768~32767 LL:新CS :IP 短程、近程:差别在于转移的距离不同,其位移量一个是8位,一个是16位。 近程、短程时,CS不变,IP=IP+位移量 远程时,新的CS和IP由OPRD指向位置的段地址和段内地址决定。
95
(2)间接转移 操作数一般是一个存储器操作数,真正的转移地址在内存中。(操作数是寄存器时例外) 分为两种情况: 段内间接转移和段间间接转移
96
1)段内间接转移: 格式:JMP WORD PTR OPRD JMP WORD PTR[SI] ; [DS:SI+1][DS:SI]IP
转移地址存放在内存单元中,转移指令后给出的是内存单元的地址。 JMP WORD PTR[SI] ; [DS:SI+1][DS:SI]IP DS:SI IP 格式:JMP OPRD ;OPRD为寄存器名 JMP BX ; (BX)IP
97
转移地址存放在内存单元中,一般用寄存器间接寻址。
2)段间间接转移: 格式:JMP DWORD PTR OPRD 转移地址存放在内存单元中,一般用寄存器间接寻址。 JMP DWORD PTR [SI] DS:SI IP ; DS:[SI+3][SI+2]CS DS:[SI+1][SI]IP CS
98
否则,程序顺序执行。 (注意:此时程序出现分支)
2、条件转移指令: 功能:根据条件来判断程序是否转移。 满足条件时程序转向指定位置执行, 否则,程序顺序执行。 (注意:此时程序出现分支) JNZ LL 128 127 只能转移到距当前指令 -128~127字节的范围内, 即一个字节的补码范围;
99
根据5个标志位来判断: JZ/JNZ JC/JNC JS/JNS JP/JNP JO/JNO 为1/0转移。 判断无符号数大小的指令: JA/JNBE JAE/JNB JB/JNAE JBE/JNA 判断有符号数大小的指令: JG/JNLE JGE/JNL JL/JNGE JLE/JNG JCXZ rel; 如CX中的值为0则转移,判断循环用
100
条件转移指令常用来进行判断,以实现程序分支:
CMP AL, 0 JAE NN MOV DL, 1 JMP DONE NN: MOV DL, 0 DONE: …… 程序执行完以后,若AL的值小于0则DL=1,反之则DL=0 。
101
下面程序段在什么情况下执行的结果是AL=0
BEGIN: IN AL, 5FH TEST AL, 80H JZ A1 XOR AL, AL JMP STOP A1: MOV AL, 0FFH STOP: HLT 当从5FH端口读到的数据的最高位为1时
102
从数据区BCDBUF开始存放着10个用非压缩BCD码表示的十进制数,要求把它们分别转换成ASCII码后存入另一缓冲区。
LEA SI , BCDBUF LEA DI, ASIBUF MOV CX, 10 AGAIN: MOV AL, [SI] ;取BCD码 OR AL, 30H ;转换 MOV [DI], AL ;存 INC SI INC DI DEC CX JNZ AGAIN 分析: BCD码转换成ASCII码的方法是: BCD码+30H
103
3、循环控制指令 编程时,可以用条件转移指令控制循环, 如: MOV CX, 10 AGAIN: ADD AX, 1 DEC CX JNZ AGAIN 也有专用的循环控制指令(3条)。 3条指令控制转移范围均在-128~127字节内; 循环前必须将循环次数赋值给CX。
104
CX-1CX, 若CX不为0,转移到标号处继续循环
1) 格式:LOOP 标号 CX-1CX, 若CX不为0,转移到标号处继续循环 2) 格式:LOOPZ/LOOPE 标号 CX-1CX, 若CX≠0且ZF=1时转到标号处继续循环 CX为0并不影响标志位ZF,ZF是否为1是由循环指令前面的指令决定的。 3) 格式: LOOPNZ/LOOPNE 标号 CX-1CX, 若CX≠0且ZF=0时转到标号处继续循环
105
结果:AX= 0FFF0H 其中LOOP LOP1 相当于 DEC CX JNZ LOP1 这两条指令 下面程序段执行后,AX=?
MOV AX,0FFFFH MOV CX, 4 LOP1: SHL AX, 1 LOOP LOP1 ; AX: ; AX: ; 循环4次 结果:AX= 0FFF0H 其中LOOP LOP1 相当于 DEC CX JNZ LOP1 这两条指令
106
下面的程序段用于在40个元素构成的数组中寻找第一个非0元素,数组元素从数据段的TABLE处开始存放。
; 设置循环次数 MOV CX, 40 LEA SI, TABLE NEXT: CMP BYTE PTR[SI] , 0 JNZ OKK INC SI LOOP NEXT OKK: CALL DISPLAY2 ; 设置地址指针 ; 与0比较 ; 若ZF ≠1,说明找到了退出循环 ; ZF=1,说明未找到修改地址指针 ; CX-1且CX ≠0 继续循环 ; 找到后,调用显示信息 如果要求寻找第一个为0的元素,程序该如何修改?
107
同样分段内调用和段间调用,一般为直接调用
4、子程序调用和返回指令 CALL T RET CALL NEAR PTR OPRD CALL FAR PTR OPRD 功能:调用子程序 RET 功能:返回主程序 调用处 返回处 子程序首地址:T 同样分段内调用和段间调用,一般为直接调用 子程序 如:CALL T 其中T为子程序入口标号 返回指令
108
1)段内调用:子程序距调用语句不超过64KB,在同一个代码段内,调用时,只改变IP即可。 如执行CALL AA, AA标号的偏移地址是8050H
CS SS 3010H 8050H CALLLL RET 1. 将3010H入栈,保护 返回地址 2. 将8050H赋给IP 3. 执行子程序 SP 4. 执行RET, 栈顶内容弹出送IP 10H SP 30H SP SP 5. 继续运行主程序
109
3400HCS 2460HIP 原IP 原CS 1500HIP 2000HCS
2)段间调用:子程序距调用语句可以超过64KB,不在同一代码段,调用时,需要同时改变CS和IP。 执行CALL NEXT, NEXT指向的地址是 H:2460H CALL RET 调用指令 SS 2000H:1500H 3400HCS 2460HIP 00H 原IP 15H 3400H:2460H 00H 原CS 20H SP 1500HIP 2000HCS
110
段间调用步骤: 将调用指令后的第一条指令地址的CS入栈; 将调用指令后的第一条指令地址的IP入栈; 将调用目的地地址的段地址赋值CS; 将调用目的地地址的偏移地址赋值IP; 执行子程序,直至遇到RET指令; 将栈顶当前内容赋值IP; 将栈顶当前内容赋值CS; 返回主程序。
111
将当前堆栈内容返回到IP(段内调用)或IP,CS(段间调用),具体是段内调用还是段间调用由定义子程序的语句决定的。
3)返回指令:RET 将当前堆栈内容返回到IP(段内调用)或IP,CS(段间调用),具体是段内调用还是段间调用由定义子程序的语句决定的。 RET n:从栈顶弹出返回地址后,SP+nSP,n为偶数,即栈顶位置跳过n个字节。 RET 4 返回地址后SP 4 SP+4SP
112
5、中断指令(三条) 一般格式:INT N 功能: 响应N号中断; 一般格式:INTO 功能: 对溢出情况进行中断响应; 一般格式:IRET 功能: 从中断服务子程序返回主程序;
113
五、串操作指令 用一条指令实现对一串数据或字符的操作,字符或数据的个数在CX中,每执行一次CX自动减1,直至减到零串操作自动停止; 源操作数在DS:[SI]中,目的操作数在ES:[DI]中; 源操作数和目的操作数都在内存中,是唯一一条从内存到内存的指令; DF=1,地址自动由高至低减量,进行串运算;DF=0,地址自动由低至高增量,进行串运算。
114
1、串传送指令 DS:SI ES:DI MOVSB:每次传送一个字节; MOVSW:每次传送一个字; DS:SI ES:DI DS:SI ES:DI 将位于DS段,由SI所指出的存储单元的字节或字传送到位于ES段,由DI所指的存储单元中,再根据DF修改SI和DI,从而指向下一个元素,继续传送,直到CX为0为止。
115
将STAR开始的100个字节传到NEXT开始的存区:
;设置源操作数指针 LEA SI, STAR LEA DI, NEXT MOV CX, 100 CLD AGAIN: MOVSB DEC CX JNZ AGAIN ;设置目的操作数指针 ;传送的元素个数 ;DF=0,每传送一次,地址自动加1 ;每次传送一个字节 ; 传送一次,CX减1 ; CX不为0,转向AGAIN处 MOVSB: 相当于 [DS:SI][ES:DI] 跳出 SI=SI+1 DI=DI+1 (DF=0)
116
通常,在串传送指令前加重复前缀REP,程序可自动计数并判别是否传送完毕。
LEA SI, STAR LEA DI, NEXT MOV CX, 100 CLD REP MOVSB REP MOVSB 相当于 [DS:SI][ES:DI] SI=SI+1 DI=DI+1 CX=CX-1 CX≠0 时转移
117
2、串比较指令 CMPSB :每次比较一个字节; CMPSW:每次比较一个字; 将位于DS段由SI所指出的存储单元的字节或字和ES段由DI所指的字节或字相比较,并且在比较之后根据DF自动修改SI和DI,通过重复前缀的控制,可以实现在两个字符串中寻找第一个不相等的元素或第一个相等的元素。
118
依次比较两个字符串是一个循环过程,这个循环过程有两种退出条件,一是满足比较条件,比如找到第一个相等字符或找到第一个不相等的字符;二是没有满足比较条件但已比较完所有的字符。
119
比较串操作的重复前缀: REPNZ/REPNE: 不相等时继续寻找,直到寻找到第一个相等的字符或寻找完所有的字符(CX=0)。 REPZ/REPE: 比较结果相等时继续寻找,直到寻找到第一个不相等的字符或寻找完所有的字符(CX=0)。 CX的值不影响ZF
120
判断一个微型机系统是否为初次加电,如果不是初次加电可以检测到在RAM的400H单元开始的4个字节分别设置了加电标志12, 23, 34, 45。这4个字节的加电标志是在初次加电时,由ROM区(位于0E2DH单元开始的4个字节)复制过去的。当然,ROM区中的E2DH处的加电标志是永存的。 假设ES指向RAM区,DS指向ROM区 MOV SI, 0E2DH MOV DI, 0400H MOV CX, 4 CLD REPZ CMPSB JZ DONE RET DONE: ……;后续处理 相等继续比较 如果4个字节都符合,表明设置好了加电标志 否则返回 ZF与CX无关
121
MOVSB MOVSW CMPSB CMPSW REP REPNZ/REPNE REPZ/REPE 指令完成后指针(SI, DI) 自动增加或减少(DF); 加上重复前缀后CX自动减1,并判断CX是否为0。若为0,终止循环。
122
3、取字符串指令 LODSB/LODSW (Load String)
将位于DS段SI所指的存储单元的内容取到AL或AX中。用LODSB时,每次取一个字节,取完后,地址自动加1或减1;用LODSW时,每次取一个字,取完后,地址自动加2或减2。 该指令一般不用重复前缀,否则,AL或AX中的内容会被后一次操作覆盖,最后只能得到内存中字符串的最后一个字节或字。
123
LODSB DS:SI DS:SI AL DS:SI DS:SI
124
4、存字符串指令 STOSB/STOSW (Store String)
把AL或AX中的数据存放到位于ES段DI所指的存储单元中,并自动修改地址指针。 该指令可加重复前缀,使内存中连续的空间填满相同的数据。 CLD LEA DI, DBB MOV CX, 80H XOR AX, AX REP STOSW 将从DBB开始的256个单元清零
125
不用考虑指针DI,SI的变化 处理字符指令
将从0700H单元开始的5个字节的内容逐一取来,放在累加器中进行处理,处理完后再送到0700H的内存区域。 CLD MOV SI, 0700H MOV DI, 0700H MOV CX, 5 L1: LODSB PUSH CX …… POP CX STOSB DEC CX JNZ L1 不用考虑指针DI,SI的变化 处理字符指令
126
5、字符串检索指令 SCASB/SCASW (Scan String)
将AL或AX中的数据与位于ES段DI指针所指的内存单元的数据相比较,通过重复前缀的控制,可以寻找到内存单元中的第一个与AL(或AX)不同或相同的数据。
127
REPNZ SCASB:(AL)-[ES:DI] , 不为0(不相等) 时继续比较,DI自动加1或减1,CX自动减1,直到相等或CX为0时退出循环。寻找第一个相同的数据
REPZ SCASB:(AL)-[ES:DI] , 为0(相等) 时继续比较,DI自动加1或减1,CX自动减1,直到不相等或CX为0时退出循环。寻找第一个不同的数据。
128
有一字符串放在以2000H单元为始地址的内存中,从中搜索串结束符$,若有,将串长度x放入2100H单元,若没有$, 2100H单元放入0FFH。
计算字符串长度 DONE: MOV BX,100 SUB BX, CX DEC BL MOV AL, BL STO: MOV [2100H], AL CLD MOV DI, 2000H MOV CX, 100 MOV AL, ‘$’ REPNE SCASB JZ DONE MOV AL, 0FFH JMP STO 不等继续比较 若相等,转向DONE 比较完毕CX=0,不等,设立标志
129
六、标志处理和CPU控制指令 标志处理指令 对PSW寄存器的某些位进行操作,有如下三种: 置位(SET):赋值1; 清除(CLEAR): 赋值0 取补(COMPLEMENT): 对当前值取反
130
CLC ;CF=0 CLD ;DF=0 ,地址增量 STD ;DF=1,地址减量 STC ;CF=1 CMC CLI ;IF=0 ,中断屏蔽
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 OF DF IF TF SF ZF AF PF CF CLC ;CF=0 CLD ;DF=0 ,地址增量 STD ;DF=1,地址减量 STC ;CF=1 CMC CLI ;IF=0 ,中断屏蔽 ; CF STI ;IF=1 ,中断允许
131
2. 处理器暂停指令 HLT ( Processor Halt)
用软件的方法使CPU处于暂停状态,等待硬件中断,硬件中断响应时,使CPU退出暂停状态,执行中断服务子程序,中断返回后,CPU接着执行HLT的后续指令。
132
执行该指令占一个指令周期,不影响任何操作,常用于精确定时。
3. 空操作指令 NOP 执行该指令占一个指令周期,不影响任何操作,常用于精确定时。 DELAY: MOV CX, 1000 A1: MOV AX, 250 A2: DEC AX …… JNZ A2 DEC CX JNZ A1 延时4us ;延时1s NOP ……
Similar presentations