汇编语言入门经典教材230页 汇编入门7 讲.docx
- 文档编号:17230091
- 上传时间:2023-07-23
- 格式:DOCX
- 页数:67
- 大小:42.18KB
汇编语言入门经典教材230页 汇编入门7 讲.docx
《汇编语言入门经典教材230页 汇编入门7 讲.docx》由会员分享,可在线阅读,更多相关《汇编语言入门经典教材230页 汇编入门7 讲.docx(67页珍藏版)》请在冰点文库上搜索。
汇编语言入门经典教材230页汇编入门7讲
汇编入门(7讲)
时间:
2009-5-168:
12:
26
核心提示:
第5章微机CPU的指令系统指令系统确定了CPU所能完成的功能,是用
汇编语言进行程序设计的最基本部分。
如果不熟悉汇编指令的功能及其有关规定,那么,肯
定不能灵活运用汇编语言。
所以,本章的内容是学习本课程的重点和难点。
5.1汇编语言
指令格式为了介绍指令系统中指令的功能,先要清楚汇编语言是如何书写指令的...
第5章微机CPU的指令系统
指令系统确定了CPU所能完成的功能,是用汇编语言进行程序设计的最基本部分。
如
果不熟悉汇编指令的功能及其有关规定,那么,肯定不能灵活运用汇编语言。
所以,本章的
内容是学习本课程的重点和难点。
5.1汇编语言指令格式
为了介绍指令系统中指令的功能,先要清楚汇编语言是如何书写指令的,这就象在学习
高级语言程序设计时,要清楚高级语言语句的语义、语法及其相关规定一样。
5.1.1指令格式
汇编语言的指令格式如下:
指令助忆符[操作数1[,操作数2[,操作数3]]][;注释]
指令助忆符体现该指令的功能,它对应一条二进制编码的机器指令。
指令的操作数个数
由该指令的确定,可以没有操作数,也可以有一个、二个或三个操作数。
绝大多数指令的操
作数要显式的写出来,但也有指令的操作数是隐含的,不需要在指令中写出。
当指令含有操作数,并要求在指令中显式地写出来时,则在书写时必须遵守:
指令助忆符和操作数之间要有分隔符,分隔符可以是若干个空格或TAB键;
如果指令含有多个操作数,那么,操作数之间要用逗号","分开。
指令后面还可以书写注释内容,不过,要在注释之前书写分号";"。
5.1.2了解指令的几个方面
在学习汇编指令时,指令的功能无疑是我们学习和掌握的重点,但要准确、有效地运用
这些指令,我们还要熟悉系统对每条指令的一些规定或约束。
归纳起来,对指令还要掌握以下几个方面内容:
、要求指令操作数的寻址方式;
、指令对标志位的影响、标志位对指令的影响;
、指令的执行时间,对可完成同样功能的指令,要选用执行时间短的指令(见附
录2)。
5.2、指令系统
指令系统是CPU指令的集合,CPU除了具有计算功能的指令外,还有实现其它功能的
指令,也有为某种特殊的应用而增设的指令。
通常,把指令按其功能分成以下几大类:
数据传送指令
标志位操作指令
算术运算指令
逻辑运算指令
移位操作指令
位操作指令
比较运算指令
下面,我们逐一介绍每类指令中
的指令。
ƒ循环指令
ƒ转移指令
ƒ条件设置字节指令
ƒ字符串操作指令
ƒASCII-BCD码运算调整指令
ƒ处理器指令
5.2.1数据传送指令
数据传送指令又分为:
传送指令、交换指令、地址传送指令、堆栈操作指令、转换指令
和I/O指令等。
除了标志位操作指令SAHF和POPF指令外,本类的其它指令都不影响标志位。
1、传送指令MOV(MoveInstruction)
传送指令是使用最频繁的指令,它相对于高级语言里的赋值语句。
指令的格式如下:
MOVReg/Mem,Reg/Mem/Imm
其中:
Reg—Register(寄存器),Mem—Memory(存储器),Imm—Immediate(立即数),它
们可以是8位、16位或32位(特别指出其位数的除外)。
在本网络课件的网页中,都将采用上
述缩写,此后不再说明。
指令的功能是把源操作数(第二操作数)的值传给目的操作数(第一操作数)。
指令执行后,
目的操作数的值被改变,而源操作数的值不变。
在存储单元是该指令的一个操作数时,该操
作数的寻址方式可以是任意一种存储单元寻址方式。
下面列举几组正确的指令例子:
源操作数是寄存器
MOVCH,ALMOVBP,SPMOVECX,EBX
MOVDS,AXMOV[BX],CHMOV[BX+SI],AX
源操作数是存储单元
MOVAL,[100H]MOVBX,ES:
[DI]MOVEDX,[BX]
MOVBX,VARWMOVAX,[BX+SI]MOVCH,[BX+DI+100H]
其中:
VARW是字类型内存变量(下同)。
源操作数是立即数
MOVAL,89HMOVBX,-100HMOVEDX,12345678H
MOVVARW,200HMOV[BX],2345HMOV[BX+DI],1234H
在汇编语言中,主要的数据传送方式如图5.1所示。
虽然一条MOV指令能实现其中大
多数的数据传送方式,但也存在MOV指令不能实现的传送方式。
对MOV指令有以下几条具体规定,其中有些规定对其它指令也同样有效。
1)、两个操作数的数据类型要相同,要同为8位、16位或32位;如:
MOVBL,AX等是
不正确的;
2)、两个操作数不能同时为段寄存器,如:
MOVES,DS等;
3)、代码段寄存器CS不能为目的操作数,但可作为源操作数,如:
指令MOVCS,AX
等不正确,但指令MOVAX,CS等是正确的;
4)、立即数不能直接传给段寄存器,如:
MOVDS,100H等;
5)、立即数不能作为目的操作数,如:
MOV100H,AX等;
6)、指令指针IP,不能作为MOV指令的操作数;
7)、两个操作数不能同时为存储单元,如:
MOVVARA,VARB等,其中VARA和VARB
是同数据类型的内存变量。
对于规定2、4和7,我们可以用通用寄存器作为中转来达到最终目的。
表5.1列举一个可
行的解决方案,尽供参考。
读者可考虑用其它办法来完成同样的功能。
表5.1MOV指令的变通方法
功能描述不正确的指令可选的解决方法
把DS的值传送给ESMOVES,DSMOVAX,DS
MOVES,AX
把100H传给DSMOVDS,100HMOVAX,100H
MOVDS,AX
把字变量VARB的值传送
给字变量VARA
MOVVARA,VARBMOVAX,VARB
MOVVARA,AX
对于情况1:
不同位数数据之间的传送问题,在80386及其以后的CPU中,增加一组新
的指令——传送-填充指令,它可把位数少的源操作数传送给位数多的目的操作数,多出的
部分按指令的规定进行填充。
2、传送—填充指令(Move-and-FillInstruction)
传送—填充指令是把位数短的源操作数传送给位数长的目的操作数。
指令格式如下:
MOVSX/MOVZXReg/Mem,Reg/Mem/Imm;80386+
其中:
80386+表示80386及其之后的CPU,其它类似符号含义类同,不再说明。
指令的主要功能和限制与MOV指令类似,不同之处是:
在传送时,对目的操作数的高
位进行填充。
根据其填充方式,又分为:
符号填充和零填充。
传送—填充指令的功能如图5.2所示。
、符号填充指令MOVSX(MovewithSign-Extend)
MOVSX的填充方式是:
用源操作数的符号位来填充目的操作数的高位数据位。
、零填充指令MOVZX(MovewithZero-Extend)
MOVZX的填充方式是:
恒用0来填充目的操作数的高位数据位。
例5.1已知:
AL=87H,指令MOVSXCX,AL,MOVZXDX,AL执行后,问CX和DX
的值是什么?
解:
根据传送-填充指令的填充方式可知:
指令MOVSXCX,AL执行后,(CX)=0FF87H,指令MOVZXDX,AL执行后,
(DX)=0087H。
从上例可看出,两条指令的源操作数完全一样,但因为它们的填充方式不同,所得到的
结果而就不同。
试比较下列指令,分析它们执行结果的相同和不同之处:
MOVAX,87HMOVSXAX,87HMOVZXAX,87H
3、交换指令XCHG(ExchangeInstruction)
交换指令XCHG是两个寄存器,寄存器和内存变
量之间内容的交换指令,两个操作数的数据类型要相
同。
其指令格式如下:
XCHGReg/Mem,Reg/Mem
该指令的功能和MOV指令不同,后者是一个操作
数的内容被修改,而前者是两个操作数都会发生改变。
寄存器不能是段寄存器,两个操作数也不能同时为内存
变量。
XCHG指令的功能如图5.3所示。
例5.2已知:
AX=5678H,BX=1234H,指令XCHGAX,BX执行后,AX和BX的值是什
么?
解:
这是两个寄存器内容进行交换,指令执行后,有:
(AX)=1234H,(BX)=5678H。
4、取有效地址指令LEA(LoadEffectiveAddress)
指令LEA是把一个内存变量的有效地址送给指定的寄存
器。
其指令格式如下:
LEAReg,Mem
该指令通常用来对指针或变址寄存器BX、DI或SI等置初
值之用。
其功能如右图所示。
例如:
…
BUFF
ER
DB100DUP(?
)
…
LEABX,BUFFER;把字节变量BUFFER在数据段内的偏移量送给BX
…
问题:
指令“LEABXBUFFER”和“MOVBX,OFFSETBUFFER”的执行效果是一样的
吗?
指令“LEABX,[BX+200]”和“MOVBX,OFFSET[BX+200]”二者都正确吗?
5、取段寄存器指令(LoadSegmentInstruction)
该组指令的功能是把内存单元的一个“低字”传送给指令中指定的16位寄存器,把随后的
一个“高字”传给相应的段寄存器(DS、ES、FS、GS和SS)。
其指令格式如下:
LDS/LES/LFS/LGS/LSSReg,Mem
指令LDS(LoadDataSegmentRegister)和LES(LoadExtraSegmentRegister)在8086CPU
中就存在,而LFS和LGS(LoadExtraSegmentRegister)、LSS(LoadStackSegmentRegister)
是80386及其以后CPU中才有的指令。
若Reg是16位寄存器,那么,Men必须是32位指针;若Reg是32位寄存器,那么,Men
必须是48位指针,其低32位给指令中指定的寄存器,高16位给指令中的段寄存器。
指令的执
行结果如图5.5所示。
例如:
…
POINTERDD12345678H
…
LDSBX,POINTER
…
指令的执行结果如图5.5所示。
各寄存器的内容分别为:
(BX)=5678H,(DS)=1234H。
下面控件是学习和掌握MOV、MOVSX/MOVZX、XCHG、LEA、LDS/LES/LFS/LGS/LSS
指令的,它可检查用户输入这些指令的合法性,并对合法的指令显示其执行的结果。
注意:
如果指令中含有表示内存单元的寻址方式,那么其控件中的"内存单元的类型"
即表示该指令中内存单元的数据类型。
6、堆栈操作指令(StackOperationInstruction)
堆栈是一个重要的数据结构,它具有“先进后出”的特点,通常用来保存程序的返回地址。
它主要有两大类操作:
进栈操作和出栈操作。
1)、进栈操作
、PUSH(PushWordorDoublewordontoStack)
指令格式:
PUSHReg/Mem
PUSHImm;80286+
一个字进栈,系统自动完成两步操作:
SP←SP-2,(SP)←操作数;
一个双字进栈,系统自动完成两步操作:
ESP←ESP-4,(ESP)←操作数。
、PUSHA(PushAllGeneralRegisters)
指令格式:
PUSHA;80286+
其功能是依次把寄存器AX、CX、DX、BX、SP、BP、SI和DI等压栈。
、PUSHAD(PushAll32-bitGeneralRegisters)
指令格式:
PUSHAD;80386+
其功能是把寄存器EAX、ECX、EDX、EBX、ESP、EBP、ESI和EDI等压栈。
2)、出栈操作
、POP(PopWordorDoublewordoffStack)
指令格式:
POPReg/Mem
弹出一个字,系统自动完成两步操作:
操作数←(SP),SP←SP-2;
弹出一个双字,系统自动完成两步操作:
操作数←(ESP),ESP←ESP-4。
、POPA(PopAllGeneralRegisters)
指令格式:
POPA;80286+
其功能是依次把寄存器DI、SI、BP、SP、BX、DX、CX和AX等弹出栈。
其实,
程序员不用记住它们的具体顺序,只要与指令PUSHA对称使用就可以了。
、POPAD(PopAll32-bitGeneralRegisters)
指令格式:
POPAD;80386+
其功能是依次把寄存器EDI、ESI、EBP、ESP、EBX、EDX、ECX和EAX等弹出
栈,它与PUSHAD对称使用即可。
7、转换指令XLAT(TranslateInstruction)
转换指令有两个隐含操作数BX和AL。
指令格式如
下:
XLAT/XLATB
其功能是把BX的值作为内存字节数组首地址、下
标为AL的数组元素的值传送给AL。
其功能描述的表达
式是:
AL←BX[AL],其功能示意图如图5.6所示。
8、I/O指令
有关I/O指令将在第8.1.2节——I/O指令——中介绍,在此从略。
5.2.2标志位操作指令
标志位操作指令是一组对标志位置位、复位、保存和恢复等操作的指令。
1、进位CF操作指令
、清进位指令CLC(ClearCarryFlag):
CF←0
、置进位指令STC(SetCarryFlag):
CF←1
、进位取反指令CMC(ComplementCarryFlag):
CF←notCF
2、方向位DF操作指令
、清方向位指令CLD(ClearDirectionFlag):
DF←0
、置方向位指令STD(SetDirectionFlag):
DF←1
3、中断允许位IF操作指令
、清中断允许位指令CLI(ClearInterruptFlag):
IF←0
其功能是不允许可屏蔽的外部中断来中断其后程序段的执行。
、置中断允许位指令STI(SetInterruptFlag):
IF←1
其功能是恢复可屏蔽的外部中断的中断响应功能,通常是与CLI成对使用的。
4、取标志位操作指令
、LAHF(LoadAHfromFlags):
AH←Flags的低8位
、SAHF(StoreAHinFlags):
Flags的低8位←AH
5、标志位堆栈操作指令
、PUSHF/PUSHFD(PushFlagsontoStack):
把16位/32位标志寄存器进栈;
、POPF/POPFD(PopFlagsoffStack):
把16位/32位标志寄存器出栈;
6、逻辑操作指令的小结
下面是学习标志位指令的控件,浏览者可以运用此类指令,观看标志寄存器的相应变化。
5.2.3算术运算指令
算术运算指令是反映CPU计算能力的一组指令,也是编程时经常使用的一组指令。
它
包括:
加、减、乘、除及其相关的辅助指令。
该组指令的操作数可以是8位、16位和32位(80386+)。
当存储单元是该类指令的操作数
时,该操作数的寻址方式可以是任意一种存储单元寻址方式。
1、加法指令
、加法指令ADD(ADDBinaryNumbersInstruction)
指令的格式:
ADDReg/Mem,Reg/Mem/Imm
受影响的标志位:
AF、CF、OF、PF、SF和ZF
指令的功能是把源操作数的值加到目的操作数中。
、带进位加指令ADC(ADDWithCarryInstruction)
指令的格式:
ADCReg/Mem,Reg/Mem/Imm
受影响的标志位:
AF、CF、OF、PF、SF和ZF
指令的功能是把源操作数和进位标志位CF的值(0/1)一起加到目的操作数中。
、加1指令INC(Incrementby1Instruction)
指令的格式:
INCReg/Mem
受影响的标志位:
AF、OF、PF、SF和ZF,不影响CF
指令的功能是把操作数的值加1。
、交换加指令XADD(ExchangeandAdd)
指令的格式:
XADDReg/Mem,Reg;80486+
受影响的标志位:
AF、CF、OF、PF、SF和ZF
指令的功能是先交换两个操作数的值,再进行算术“加”法操作。
例5.3已知有二个32位数d1和d2(用数据类型DD说明),编写程序片段把d2的值加到d1中。
解:
32位数d1和d2在内存中如下所示。
…
…
…
…
……
方法1:
用16位寄存器编写程序
MO
V
AX,wordptrd1;由于d1是双字类型,必须使用强制类型说明符。
以下同。
MO
V
DX,wordptrd1+2;(DX,AX)构成一个32位数据
AD
D
AX,wordptrd2;低字相加
AD
C
DX,wordptrd2+2;高字相加。
在低字相加时,有可能会产生“进位”
MO
V
wordptrd1,AX;低字送给d1的低字
MO
V
wordptrd1+2,DX;高字送给d1的高字
方法2:
用32位寄存器编写程序
MO
V
EAX,d1
AD
D
EAX,d2
MO
V
d1,EAX
从上面两段程序不难看出:
用32位寄存器来处理32位数据显得简单、明了,而16位微机
虽然也能处理32位数据,但做起来就要复杂一些。
下面是学习和掌握加法类指令的控件,可模拟执行ADD、ADC、INC、XADD、CLC、
STC和CMC等指令。
用鼠标左键单击寄存器列表框中指定的寄存器,则可修改其值。
后面
其它控件的有关操作与此相一致,不再说明。
2、减法指令
、减法指令SUB(SubtractBinaryValuesInstruction)
指令的格式:
SUBReg/Mem,Reg/Mem/Imm
受影响的标志位:
AF、CF、OF、PF、SF和ZF
指令的功能是从目的操作数中减去源操作数。
、带借位减SBB(SubtractwithBorrowInstruction)
指令的格式:
SBBReg/Mem,Reg/Mem/Imm
受影响的标志位:
AF、CF、OF、PF、SF和ZF
指令的功能是把源操作数和标志位CF的值从目的操作数中一起减去。
、减1指令DEC(Decrementby1Instruction)
指令的格式:
DECReg/Mem
受影响的标志位:
AF、OF、PF、SF和ZF,不影响CF
指令的功能是把操作数的值减去1。
、求补指令NEG(NegateInstruction)
指令的格式:
NEGReg/Mem
受影响的标志位:
AF、CF、OF、PF、SF和ZF
指令的功能:
操作数=0-操作数,即改变操作数的正负号。
例5.4已知有二个32位数d1和d2,编写程序片段从d1中减去d2的值。
解:
方法1:
用16位寄存器编写程序
MO
V
AX,wordptrd1;取低字
MO
V
DX,wordptrd1+2;取高字,(DX,AX)构成一个32位数据
SUBAX,wordptrd2;低字相减
SBBDX,wordptrd2+2;高字相减。
在低字相减时,有可能会产生“借位”
MO
V
wordptrd1,AX;低字送给d1的低字
MO
V
wordptrd1+2,DX;高字送给d1的高字
方法2:
用32位寄存器编写程序
MO
V
EAX,d1
SUBEAX,d2
MO
V
d1,EAX
下面是学习和掌握减法类指令的控件,可模拟执行SUB、SBB、DEC、NEG、CLC、
STC和CMC等指令。
3、乘法指令
计算机的乘法指令分为无符号乘法指令和有符号乘法指令,它们的唯一区别就在于:
数
据的最高位是作为“数值”参与运算,还是作为“符号位”参与运算。
乘法指令的被乘数都是隐含操作数,乘数在指令中显式地写出来。
CPU会根据乘数是8
位、16位,还是32位操作数,来自动选用被乘数:
AL、AX或EAX。
指令的功能是把显式操作数和隐含操作数相乘,并把乘积存入相应的寄存器中。
、无符号数乘法指令MUL(UnsignedMultiplyInstruction)
指令的格式:
MULReg/Mem
受影响的标志位:
CF和OF(AF、PF、SF和ZF无定义)
指令的功能是把显式操作数和隐含操作数(都作为无符号数)相乘,所得的乘积按表
5.2的对应关系存放。
表5.2乘法指令中乘数、被乘数和乘积的对应关系
乘数位数隐含的被乘数乘积的存放位置举例
8位ALAXMULBL
16位AXDX-AXMULBX
32位EAXEDX-EAXMULECX
、有符号数乘法指令IMUL(SignedIntegerMultiplyInstruction)
IMU
L
Reg/Mem
IMU
L
Reg,Imm;80286+
IMU
L
Reg,Reg,Imm;80286+
指令的格
式:
IMU
L
Reg,Reg/Mem;80386+
受影响的标志位:
CF和OF(AF、PF、SF和ZF无定义)
1)、指令格式1——该指令的功能是把显式操作数和隐含操作数相乘,所得的乘积按表
5.2的对应关系存放。
2)、指令格式2——其寄存器必须是16位/32位通用寄存器,其计算方式为:
Reg←Reg×
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言入门经典教材230页 汇编入门7 汇编语言 入门 经典 教材 230 汇编