汇编指令系统Word下载.docx
《汇编指令系统Word下载.docx》由会员分享,可在线阅读,更多相关《汇编指令系统Word下载.docx(98页珍藏版)》请在冰豆网上搜索。
MOVAX,ES
MOVDS,AX
imm→r→seg
MOVAX,2000H
MOVDS,ES
seg←×
→seg
MOVDS,2000H
imm×
→seg
m→r→m
MOVAX,[20H]
MOV[BX],AX
MOV[BX],[20H]
m←×
→m
思考:
MOV[BX],20H?
堆栈操作指令
�入栈指令PUSH
PUSHsrc;
SP←SP-2
(SP+1)←src(H)
(SP)←src(L)src
reg16
mem16
seg
�出栈指令POP
POPdst;
dst(L)←(SP)
dst(H)←(SP+1)
SP←SP+2
dst
Seg(除CS)
PUSHAX
PUSHWORDPTR[BP]
POPES
POPWORDPTR[BP][SI]
入栈操作示例
设有SS=3200H,SP=0800H,AX=105CH。
SP=0800H→32800H
……
Stack
PUSHAX
SP=SP-1→327FFH
SP=SP-1→327FEH
SP=07FEH
5CH
AL
10H
AH
出栈操作示例
设有SS=3200H,SP=07FEH
POPAX
SP=SP+1→32800H
SP=SP+1→327FFH
SP=07FEH→327FEH
SP=0800H
AX=105CH
AL5CH
�一定是16位操作,即压入和弹出的一定是字单元,且高
字节总是在高地址单元;
�不允许使用立即数作为操作数
�不能以CS、IP作为目的操作数
�因为8086系统的堆栈是向下(低地址端)生成的,并且
是实栈顶,所以入栈时总是SP先减2再压入字,而出栈时
总是先弹出字再将SP加2;
�堆栈中的数据总是先进后出;
�不影响标志位
堆栈操作注意
交换指令XCHG
�可使用的操作数类型组合:
XCHGCL,DH;
通用寄存器↔通用寄存器
XCHGAX,[BP];
通用寄存器↔存储器
将源、目操作数的内容互相交换,指令执行后源、
目操作数同时被改变
�指令形式:
XCHGop1,op2;
(op1)↔(op2)
�op1:
R,M;
op2:
R,M
立即数为什么
不能做操作
数?
寄存器
交换指令XCHG注意
�不能直接交换两个存储单元的值;
�任一个操作数都不能是段寄存器或立即数;
《例》用MOV、PUSH,POP、XCHG指令
完成两寄存器AX、BX中数据的交换
(讨论所用机器码数量)
•用MOV指令
•用PUSH指令
POP
•用XCHG指令
MOVCX,AX
MOVAX,BX
MOVBX,CX6字节机器码
PUSHBX
POPBX4字节机器码
XCHGAX,BX1字节机器码
数据查表指令——XLAT
•指令格式
•指令功能
XLAT;
(AL)←[(BX)+(AL)]
�使用XLAT指令前
(BX)←表的首地址,(AL)←表的索引值
�使用XLAT指令
�使用XLAT指令后
(BX)+(AL)地址单元中的字节数据送(AL)
查表求平方
TABLEDB0,1,4,9,16,25,……,225
MOVAX,SEGTABLE
MOVBX,OFFSETTABLE;
DS:
BX指向表TABLE
MOVAL,4;
AL中为查表索引值
XLATTABLE;
取表中数据16到AL中
;
最多只能查到15的平方(=225)
LED七段显示码与显示数字的关系
77H9
7FH8
67H3
6DH2
03H1
3FH0
显示码显示数字
77H
7FH
67H
6DH
03H
3FH
用AL代表显示数字,用XLAT指令查出对应显示码。
…
(BX)
(AL)=0~9
有效地址传送指令——LEA
•指令格式
•指令功能
•指令应用
LEAreg,src;
(reg)←src的EA
将src的有效地址(16位段内偏移地址)
传送给通用寄存器reg
MOVBX,2130H
立即数2130H赋给通用寄存器BX
LEABX,[2130H]
地址值2130H赋给通用寄存器BX
符号地址的获得
将符号地址BUFF的地址值赋给通用寄存器BX
•LEABX,BUFF
指令LEA传送BUFF的地址值给BX
•MOVBX,OFFSETBUFF
运算符OFFSET返回BUFF的地址值后赋给BX
�MOVBX,BUFF
注:
将BUFF地址单元中的字数据传送给BX
注意
LEA指令和OFFSET运算符可以完成相同的功能,只是执行时
间不同;
LEABX,label;
程序运行时,取lable的EA到BX中
MOVBX,OFFSETlabel
;
汇编时取lable的EA,运行时放入BX中
《例》查表求数字0~9的格雷码
•格雷码表
14H
12H
11H
0CH
0AH
09H
06H
05H
34H
18HTABLE
DS段
0~9的格雷码从符号地
址TABLE开始顺序存入。
•编程序段
LEABX,TABLE;
表首地址赋BX
MOVAL,7;
表偏为7
查表
注:
AL中有7的格雷码11H
全地址指针传送指令——LDS、LES
LDSreg,src;
(reg)←src的(EA)
(DS)←src的(EA+2)
LESreg,src;
(ES)←src的(EA+2)
LDS,32位目标地址送段寄存器DS和通用寄存器reg
LES,32位目标地址送段寄存器ES和通用寄存器reg
指令LEA与LDS,LES的区别
•LEAreg,src
src表示存储器单元地址本身
•LDSreg,src
LESreg,src
src表示存储器单元地址中的地址值
指令LEA与LDS,LES的比较
已知:
DS=09A0H,BX=0048H
LEADI,[BX]
LDSDI,[BX]
LESDI,[BX]
→执行后:
DI=0048H
DI=003EH
DS=0816H
ES=0816H
DS=09A0
08H
3EH
00H
16H
0048H
0049H
004AH
004BH
标志传送指令——LAHF、SAHF
•LAHF;
(AH)←(F)低8
读标志寄存器的低8位到寄存器AH的指令
•SAHF;
(F)低8←(AH)
将AH的值写入标志寄存器的低8位的指令
注:
字节传送方式
16位标志寄存器中的低8位数据传送
即状态标志位CF、AF、ZF、SF、PF的传送
标志传送指令——PUSHF、POPF
•PUSHF
标志寄存器的入栈指令
•POPF
标志寄存器的出栈指令
字传送方式
16位标志寄存器中的16位数据传送
即状态标志位OF、CF、AF、ZF、SF、PF的传送
及控制标志位IF、DF、TF的传送
注意
�操作数全部隐含
�PUSHF和POPF指令一般用于保护FR内容;
�LAHF和SAHF指令一般用于修改FR内容:
LAHF;
将FR的低8位送入AH
……;
修改AH的值
SAHF;
将修改后的值重新送回FR
�上述方法显然只能处理FR的低8位,如需处
理FR中的任一位,可用以下方法:
PUSHF;
将FR的值压入堆栈
POPAX;
将刚压入的FR值弹出到AX中
修改AX的值
PUSHAX;
将修改后的值压入堆栈
POPF;
将修改后的值弹出到FR中
数据传送类指令总结
�源、目操作数长度必须一致。
�源、目操作数不能同时是存储器操作数。
�源、目操作数不能同时是段寄存器。
�立即数和代码段寄存器CS不能作目操作数。
�当目操作数是段寄存器时,源操作数不能是立即数。
�可以使用段寄存器的指令:
MOV、PUSH、POP。
�除XCHG指令外,其它数传指令仅改变目操作数,源操
作数保持不变。
�除SAHF、POPF指令外,其它数传指令的执行不影响标
志位。
对所有指
令都适
用!
微机系统原理与接口技术微机系统原理与接口技术
算术运算类指令
�加法指令
�减法指令
�乘法指令
�除法指令
ADD,ADC指令、INC指令、DAA,AAA指令
SUB,SBB指令、DEC指令、DAS,AAS指令
NEG指令、CMP指令
MUL,IMUL指令、AAM指令
DIV,IDIV指令、AAD指令
�计算机中运算指令的特点
•对十进制加、减、乘、除的应用是小学问题
•对二进制加、减、乘、除的应用是大学问题
•对有限位二进制加、减、乘、除的应用是
计算机中必须解决的问题
�除了除法指令及符号扩展指令外,其它算术运算指令
都将影响各状态标志,不同的指令对各状态标志的影响
也不同;
�加、减法运算时所有数据长度相等,乘法运算时结果
长度加倍,除法运算时被除数长度加倍;
乘除法运算时
使用隐含操作数;
�可以使用BCD码进行算术运算,并可用相应的调整指
令对结果进行调整以保证结果仍为BCD码;
�运算指令对状态标志位的影响
•无符号数运算影响状态标志位CF
•有符号数运算影响状态标志位OF
•有符号数运算结果的正负值影响状态标志位SF
•两数运算结果是否为0影响状态标志位ZF
•两数低4位运算影响状态标志位AF
•两数运算结果中1的量影响状态标志位PF
�计算机中两数运算后的溢出检测
•对无符号数测状态标志位CF
对有符号数测状态标志位OF
•CF的特点
两数运算后CF=0,表示运算结果未超界,无溢出
两数运算后CF=1,表示运算结果己超界,有溢出
•OF的特点
两数运算后OF=0,表示运算结果未超界,无溢出
两数运算后OF=1,表示运算结果己超界,有溢出
溢出即加法有进位,减法有借位
溢出即运算出现错误
�二进制数的表值范围与标志
•8位无符号数
和在数0~255内CF=0
和在数0~255外CF=1
•8位有符号数
和在数-128~+127内OF=0
和在数-128~+127外OF=1
两个8位二进制数的加法运算及和的溢出
分析
•表示无符号数时——无溢出
•表示有符号数时——无溢出
+15<
+12715<
25500001111B
+3
++12
3
+12
00000011B
+00001100B
认为有符号数相加认为无符号数相加机内二进制数相加
CF=0,无溢出OF=0,无溢出
•表示无符号数时——有溢出
+2<
+127258>
2551←00000010B
+6
+-4
6
+252
00000110B
+11111100B
CF=1,有溢出OF=0,无溢出
•表示有符号数时——有溢出
+131>
+127131<
25510000011B
+8
++123
8
+123
00001000B
+01111011B
CF=0,无溢出OF=1,有溢出
-132<
-128380>
2551←01111100B
-121
+-11
135
+245
10000111B
+11110101B
CF=1,有溢出OF=1,有溢出
算术运算——加法类指令
�加法指令——ADD
•指令特点
不带进位的加法指令
ADDdst,src;
dst←dst+src
用于低字(字节)相加
无符号数、有符号数的加法用相同的指令
最常用
的加法
�加法指令——ADC
带进位的加法指令
ADCdst,src;
dst←dst+src+CF
用于高字(字节)相加
�ADD、ADC指令的操作数及类型
OPreg,reg
OPreg,memOPmem,reg
OPreg,immOPmem,imm
•操作数
•数据类型
字节数据类型
字数据类型
�ADD与ADC分析
•影响所有标志位
•ADC指令的另一个默认操作数为进位位CF;
•若进位标志CF=0,则ADD=ADC
•无符号数、有符号数用相同的加法指令
�对无符号数加法时,判断标志位CF
�对有符号数加法时,判断标志位OF
�INC——加1指令
•影响的标志(不影响的标志)
•允许的操作数
INCoprd;
oprd←oprd+1
多用于循环程序中的地址指针加1
OF、SF、ZF、PF、AF(CF)
reg、mem
将存放在20000H和21000H地址处的两个32位
数相加,结果放在21000H地址处。
MOVDS,AX;
设置默认段基址DS=2000H
MOVSI,0;
使SI指向20000H单元
MOVDI,1000H;
使DI指向21000H单元
MOVAX,[SI];
将20000H、20001H单元的16位数送到AX中
ADD[DI],AX;
将两个32位数的低16位相加,结果放21000H处
MOVAX,[SI+2];
将20002H、20003H单元的16位数送到AX中
ADC[DI+2],AX;
将32位的高16位相加,结果放21002H处
MOV[DI+4],0
ADC[DI+4],0;
处理高16位的进位
《例》两双倍精度字1234FEDCH和11228765H相加
22H
87H
65H
FEH
DCH
DS段1000H
2000H
•编程•存储图
LEASI,[1000H]
LEADI,[2000H]
MOVAX,[SI]
ADDAX,[DI]
MOV[SI],AX
MOVAX,[SI+2]
ADCAX,[DI+2]
MOV[SI+2],AX
•结果
23H
57H
86H
41H
�十进制数的BCD编码
用4位二进制数对1位十进制数进行编码
�8-4-2-1BCD编码
0000——0、...1001——9
�组合十进制数
1字节含2个BCD编码的十进制数
�非组合十进制数
1字节含1个BCD编码的十进制数
BCDBCD
BCD0000
�十进制数的BCD编码表示
•4位二进制数的表值范围
0000B~1111B、0~15、0H~FH
•4位二进制数的BCD编码表示