《微型计算机技术》第3章 8086的汇编语言程序设计_第1页
《微型计算机技术》第3章 8086的汇编语言程序设计_第2页
《微型计算机技术》第3章 8086的汇编语言程序设计_第3页
《微型计算机技术》第3章 8086的汇编语言程序设计_第4页
《微型计算机技术》第3章 8086的汇编语言程序设计_第5页
已阅读5页,还剩234页未读 继续免费阅读

下载本文档

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

文档简介

2023/1/301微型计算机技术WeixinɡJisuɑnjiJishu

(第3版)

2023/1/302

第3章

8086的汇编语言程序设计2023/1/3038086的汇编语言程序设计3.18086的指令系统3.2汇编语言的基本语法3.3汇编语言程序设计基础2023/1/3043.18086的指令系统3.1.18086指令的寻址方式3.1.28086指令简析2023/1/3053.1.18086指令的寻址方式所谓指令的寻址方式(AddressingMode)是指在指令中操作数的表示方式。由于程序编写上的需要,大多数情况下,指令中并不直接给出操作数的数值,而是给出操作数存放的地址———

寄存器的地址或存储单元的地址。同时,在许多情况下,操作数的地址也不直接给出,而是给出计算操作数地址的方法。计算机执行程序时,根据指令给出的寻址方式,计算出操作数的地址,然后从该地址中取出操作数进行指令操作码指定的操作,把操作结果送入指定的目的操作数中。一般来说,计算机的寻址方式越丰富,指令系统的功能就越强,工作的灵活性也越大。2023/1/306

8086指令的寻址方式立即寻址、寄存器寻址、存储器寻址、串操作寻址、外设I/O端口寻址以及程序转移操作寻址。其中,变化最多的是存储器寻址,这种寻址方式又分为:直接寻址、寄存器间接寻址、基址寻址、变址寻址以及基址变址寻址。注意:根据寻址方式计算而得的地址只是有效地址EA

———

段内偏移地址,这一地址还需与所在段的段基值组合后才能形成20位的物理地址。2023/1/307

立即寻址(ImmediateAddressing)立即寻址(的指令直接给出操作数的数值,即指令机器码的最后1个或2个字节就是操作数———立即数。立即数只能作为源操作数,在汇编码指令中,可用十六进制数(以H结尾)、二进制数(以B结尾)和十进制数(不需加特殊符号)表示,也可以使用撇号“′”括起来的ASCII码表达的字符和字符串。注意,如果十六进制数以字母A~F打头,则必须在前面加上一个“0”,这是汇编程序的要求。由于立即数是直接从指令中取得的,所以取数速度较快,这种寻址方式常用来给寄存器或存储器赋初值。2023/1/308寄存器寻址(RegisterAddressing)操作数在寄存器中,即寄存器的内容就是操作数的数值。在汇编码指令中,操作数用寄存器的符号来表示。例如,INCAX,其功能为AX+1→AX。这类寻址方式的指令的机器码字节最短,因为8个通用寄存器只要用3个代码即可区分。另外,由于寄存器是在微处理器芯片的内部,整个操作都在微处理器内部进行,不必执行访问内存的总线周期,因此其执行速度最快。8086的寄存器寻址中,可用的寄存器有通用寄存器和段寄存器,寄存器可作为源寄存器或/与目的寄存器。例如“

MOVDS,AX”

。2023/1/309存储器寻址(MemoryAddressing)对于存储器寻址的指令,操作数在存储器中,在指令操作中,存储器操作数出入微处理器都需经过总线。当EU读或写一个存储器操作数时,必须将一个偏移地址(OffsetAddress)传送给BIU,BIU经过地址运算后产生一个20位的物理地址,然后执行存取该操作数所需的总线周期。EU为一个存储器操作数而计算出来的偏移量称为操作数的有效地址EA,这是一个16位无符号数,表示该操作数所在存储单元与所在段起始地址的距离(以字节为单位)。2023/1/3010存储器寻址一条存储器寻址的指令能访问由基址寄存器内容或/与变址寄存器内容或/与DISP值组合而得的有效地址EA所决定的存储单元。其中,DISP(Displacement)为位移量,是一个8位或16位数,DISP包含在指令中,根据程序中操作数名称(变量或标号)的位置推算而得,程序员可修改或规定此值。2023/1/3011按其有效地址EA的形成方法可分为如下几种1)直接寻址

2)寄存器间接寻址3)基址寻址4)变址寻址5)基址变址寻址2023/1/30121)直接寻址(DirectAddressing)

由指令直接给出操作数的偏移地址,它紧跟在操作码之后。例如,INCBYTEPTR[04A3H]指令中,存储器操作数的偏移地址为4A3H。直接寻址指令的另一种表示形式为

INCADDR,指令中存储器操作数的地址用符号地址(变量,Variable)ADDR表示。2023/1/30132)寄存器间接寻址

(RegisterIndirectAddressing)

存储器操作数的有效地址直接取自一个基址寄存器(BX)或变址寄存器(SI或DI)。例如INCBYTEPTR[BX]。2023/1/3014

3)基址寻址(BasedAddressing)以基址寄存器BX或BP的内容为基准地址,指令中再给出一个地址位移量D(D8或D16),它们组合而得存储器操作数的有效地址。汇编码指令中有效地址的表示方法有如下几种:[BX(或BP)+D],其中,D为常量,例如INCBYTEPTR[BP+4]。

D[BX(或BP)],其中,D为变量或常量,例如INCADDR[BX]。当使用BP作基址寻址时,若无指定段替换,则内定在堆栈段内寻址。若D为常量,则以有符号的二进制数表示,可为8位或16位值。当D为8位值时,有效地址计算中,位移量必须进行符号扩展。2023/1/30154)变址寻址(IndexedAddressing)

指令中给出一个位移量D作为基准地址,再同变址寄存器SI(或DI)的内容相加作为存储器操作数的有效地址。汇编码指令中的有效地址有[SI(或DI)+D]以及D[SI(或DI)]两种表示,式中D的含义与基址寻址的相同。基址寻址和变址寻址又称为寄存器相对寻址。2023/1/30165)基址变址寻址

(BasedIndexedAddressing)基址寄存器BX(或BP)中存放基准地址,变址寄存器SI(或DI)存放变址值,指令中再给出一个位移量D,三者相加构成存储器操作数的有效地址。其中,D可为8位数或16位数,也可以无此项。若为8位数,在计算中应进行符号扩展。2023/1/3017基址变址寻址汇编码指令中的有效地址有两种表示:1、[BX(或BP)+SI(或DI)+D],例如,INCBYTEPTR[BX+DI+4];2、D[BX(或BP)+SI(或DI)],例如,INCADDR[BX+SI]。采用BP作为基址时,规定在当前堆栈内寻址。含有D项的基址变址方式又称为相对基址变址寻址方式。2023/1/3018程序转移寻址指令在顺序执行时,下一条指令的偏移地址总是由指令指针IP自动递增而得,当程序在本段内发生转移时,需要给出即将转移去执行的那条指令的偏移地址,并用它去取代IP中的原有内容。如果即将转移去执行的指令与原来执行的指令不在同一段中,则还需用新的代码段的段基值去取代CS中的原有内容,此时,操作数作为转移地址使用,分别送到IP和CS。2023/1/3019程序转移寻址程序转移寻址方式用于条件转移指令、无条件转移指令、循环指令和转子指令(调用指令)。程序转移寻址方式按目的地址的形式可分为如下几种。2023/1/30201)相对寻址以IP的内容为基准地址,加上紧跟指令操作码后的相对位移量D,得到转移地址的偏移地址。转移地址的偏移地址为IP+D,D是带符号的二进制数。当D为8位数时,转移范围为-128~+128;当D为16位数时,转移范围为-32768~+32767(注意:不能越段)。例如,条件转移指令JEA和无条件转移指令JMPADDR,指令中的A、ADDR为转移地址的标号。这种寻址方式又称为段内直接转移。2023/1/30212)段内寄存器寻址以寄存器的内容为转移地址的偏移地址。例如,“

JMPBX”

,BX中的内容即偏移地址。2023/1/30223)段内间接转移寻址包括前述的存储器操作数中的寄存器间接寻址、变址寻址、基址寻址以及基址变址寻址等几种寻址方式,这些寻址方式求得的操作数即为转移地址的偏移地址。例如,JMPWORDPTR[BX],JMPVAR[BX][SI],JMPWORDPTR[EA](EA为有效地址)。指令中的[BX]及VAR[BX][SI]都表示段内间接转移地址为偏移地址。2023/1/30234)段间直接转移寻址程序从一个代码段转移到另一个代码段称为段间转移,实现段间转移不仅要求改变IP中的指令偏移地址,还要改变CS中的段基值。这种寻址方式的转移指令中带有两个16位地址,第一个地址为转移地址的偏移值,第二个地址为转移地址的段基值。2023/1/30245)段间间接转移寻址在这种寻址方式的转移指令中,要实现段间转移所需的两个16位地址,可以用任何数据存储器的间接寻址方式求得,汇编码指令形式为:JMPDWORDPTR[EA]。2023/1/3025

3.2

8086指令简析8086的汇编码指令(即汇编语言指令)有100多条(以助记符计算),按功能可分为数据传送指令、算术运算指令、位处理指令、串操作指令、程序转移指令和处理器控制指令共6大类,2023/1/30261.数据传送指令(共14条)助记符功能通用数据传送指令MOV传送字节或字PUSH字入栈POP字出栈XCHG交换字节或字XLAT字节转换地址目标传送指令LEA装入有效地址LDS将指针变量装入寄存器及DSLES将指针变量装入寄存器及ES标志传送指令LAHF标志寄存器低字节送AHSAHFAH值送标志寄存器低字节PUSHF标志寄存器内容进栈POPF标志寄存器内容出栈I/O指令IN输入字节或字OUT输出字节或字2023/1/3027

数据传送指令(共14条)

src/s源,dest/d目的reg/r寄存器,mem/m存储器(内存)sreg段寄存器,B字节,W字2023/1/3028数据传送指令(续)1)MOVdest,src(B/W);ds2)PUSHsrc(W) ;SPSP-2 (SP+1)(SP)srcPOPdest(W); dest(SP+1)(SP)SPSP+23)XCHGdest,src(B/W);destsrc2023/1/3029数据传送指令(续)4.XLAT(B)XLAT变量名/表格首地址(B)AL[BX+AL]5.LEAreg16,mem(W);reg16EAsrc(loadeffectiveaddress)6.传送是复制(COPY),除XCHG,XLAT外都不改变src.7.除POPF,SAHF外,不影响FR.2023/1/30302.算术运算指令

(20条)助记符功能加法指令ADD加法ADC带进位的加法INC增量(加1)AAA加法的ASCII修正DAA加法的十进制修正减法指令SUB减法SBB带借位的减法DEC减量(减1)NEG求补(变负)CMP比较AAS减法的ASCII修正DAS减法的十进制修正2023/1/3031乘法指令MUL无符号数乘法IMUL整数乘法AAM乘法的ASCII修正除法指令DIV无符号数除法IDIV整数除法AAD除法的ASCII修正CBW字节转换为字CWD字转换为双字2023/1/3032算术运算指令

(续)1)加法指令

ADDdest,src;B/WADCdest,src;B/WDest和src可以是带符号数,也可以是无符号数。

INCdest;B/Wdestdest+1INC指令不影响CF。2023/1/3033算术运算指令

(续)2)减法指令

SUBdest,src;B/WSBBdest,src;B/WCMPdest,src;B/WDECdest;B/Wdest-1destNEGdest;B/WDEC指令不影响CF。2023/1/3034

NEG指令的三种理解:

l)dest求补(全部位取反加l);2)dest变负;3)零减dest。2023/1/3035算术运算指令

(续)3)修正指令

DAA,DAS

当BCD码进行加或减法运算时,在加法指令和减法指令后,必须加上一条DAA指令(加法)或DAS(减法)指令。2023/1/3036算术运算指令

(续)4)乘除法指令(乘法)

MUL,DIVMULr/m(B/W)

当r/m为8位时,指令操作为AL*r/m送AX

当r/m为16位时,

指令操作为AX*r/m送DX_AX(DX_AX表示以DX和AX构成的一个32位寄存器)2023/1/3037算术运算指令

(续)

乘除法指令(除法)

DIVr/m(B/W)

当r/m为8位时,指令操作为:AX/(r/m)B,结果商送AL,余数送AH;

当r/m为l6位时,指令操作为:DX_AX/(r/m)w,结果商送AX,余数送DX。2023/1/3038算术运算指令

(续)5)扩展指令CBW;AL转换为AX,且AX=ALCWD;AX转换为DXAX,且DX_AX=AX都为符号扩展。2023/1/30393.位处理指令(14条)助记符功能逻辑运算指令AND逻辑“与”OR逻辑“或”NOT逻辑“非”XOR逻辑“异或”TEST测试移位指令SHL逻辑左移SAL算术左移SHR逻辑右移SAR算术右移循环移位指令ROL循环左移ROR循环右移RCL通过CF循环左移RCR通过CF循环右移2023/1/3040位处理指令(续)1)逻辑运算指令AND、OR、XOR、TEST、NOT前三条指令执行后,同时使CF=0TEST指令实现”与”操作,但不改变目的操作数,将运算结果的特性反映在标志寄存器中NOT指令不影响标志位。2023/1/3041位处理指令(续)2)移位指令SHL/SAL(逻辑左移/算术左移),实现相同操作;功能:0(补零)CF dest2023/1/3042位处理指令(续)移位指令SHR逻辑右移0dest CF2023/1/3043位处理指令(续)SAR算术右移,实现带符号数被2除,朝小取整。SH……shift,A……arithmetic

dest CF2023/1/3044位处理指令(续)3)循环移位指令ROL小循环左移CF dest2023/1/3045位处理指令(续)ROR小循环右移

dest CF2023/1/3046位处理指令(续)RCL带进位位左移(大循环左移)CF dest2023/1/3047位处理指令(续)RCR带进位位右移(大循环右移)dest CF2023/1/3048位处理指令(续)注意:移位和循环移位后移出位都送标志位CF指令格式:

SHL/RORreg/mem,countcount=1(移位次数为1时)count=CL(移位次数大于1时)2023/1/3049位处理指令(续)例如:AL逻辑右移4次的指令为:

MOVCL,4SHRAL,CL2023/1/30504.串操作指令(共5条)助记符功能串操作指令MOV(MOVSB,MOVSW)串传送(字节传送,字传送)CMPS(CMPSB,CMPSW)串比较(字节比较,字比较)STOS(STOSB,STOSW)存入串(存入字节,存入字)LODS(LODSB,LODSW)取出串(取出字节,取出字)SCAS(SCASB,SCASW)扫描串(扫描字节,扫描子)重复前缀REP重复操作REPE/REPZ等于/为零重复REPNE/REPNZ不等于/不为零重复2023/1/3051助记符功能无条件转移指令CALL调用过程(子过程)RET从过程(子程序)返回JMP无条件转移条件转移指令JA/JNBE高于/不低于等于,转移JAE/JNB高于等于/不低于,转移JB/JNAE低于/不高于等于,转移JBE/JNA低于等于/不高于,转移JC有进位(借位),转移JE/JZ等于/为零,转移JG/JNLE大于/不小于等于,转移JGE/JNL大于等于/不小于,转移JL/JNGE小于/不大于等于,转移JLE/JNG小于等于/不大于,转移JNC无进位(借位),转移2023/1/3052条件转移指令JNE/JNZ不等于/不为零,转移JNO不溢出,转移JNP/JPOPF为“0”/奇状态,转移JNSSF为“0”,转移JO溢出,转移JP/JPEPF为“1”/偶状态,转移JSSF为“1”,转移JCXZ寄存器CX=0,转移重复控制指令LOOP循环LOOPE/LOOPZ等于/为零,循环LOOPNE/LOOPNZ不等于/不为零,循环中断指令INT中断INT3断点中断INTO溢出中断IRET中断返回2023/1/3053串操作指令(续)1)MOVSB;[DS:SI]B→[ES:DI]B,SI/DI+/-1CMPSB;[DS:SI]B-[ES:DI]B,SI/DI+/-1STOSB;AL→[ES:DI]B,DI+/-1LODSB;[DS:SI]B

→AL,SI+/-1SCASB;AL-[ES:DI]B,DI+/-1(教材P50中CMPSB;[DS:SI]B→ES:DI]B

有误)2023/1/3054串操作指令(续)2)若MOVSB改为MOVSW,则改为字操作

[DS:SI]B

和[ES:DI]B

改为

[DS:SI]W

和[ES:DI]WCMPSW同MOVSW,STOSW、LODSW和SCASW指令中将原来的AL改为AX而SI/DI+/-1改为SI/DI+/-22023/1/3055串操作指令(续)3)若五条串操作指令中来标明B或W,则指令格式为:MOVS dest,srcCMPSsrc,destSTOSdestLODSsrcSCASdest2023/1/3056串操作指令(续)

式中dest和src都为变量名,变量定义时所定义的类型属性决定串操作中的操作类型。2023/1/3057串操作指令(续)

4)5条重复前缀指令 例题:要求把内存区中2000H:5000H开始的100个字节数传送到3000H:4000H中,用串操作指令实现之。

注意,MOVSB指令每执行一次只能传送一个字节,所以必须编写一段循环程序,

2023/1/3058串操作指令(续)

解: MOVAX,2000H MOVDS,AX MOVAX,3000H MOVES,AXMOVSI,5000HMOVDI,4000H MOVCX,100 LOP:MOVSB DECCX JNZLOP2023/1/3059串操作指令(续)

若采用重复前缀REP,则最后三条指令可改为:

REPMOVSB REP的功能是:重复执行右边的串操作指令CX次2023/1/3060串操作指令(续)另有4条重复前缀指令:REPZ……若CX≠0,且ZF=1,则重复执行右边的串操作指令若CX=0,或ZF=0,则结束串操作REPNZ……若CX≠0,且ZF=0,则重复执行右边的串操作指令若CX=0,或ZF=1,则结束串操作2023/1/3061串操作指令(续)REPE与REPZ功能一样,REPNE与REPNZ功能一样。通常REP前缀用于MOVS/MOVSB/MOVSW和STOS/SORSB/STOSW而REPZ/REPE/REPNZ/REPNE前缓用于CMPS/CMPSB/CMPSW和SCAS/SCASB/SCASW。2023/1/30625.程序转移指令助记符功能无条件转移指令CALL调用过程(子过程)RET从过程(子程序)返回JMP无条件转移条件转移指令JA/JNBE高于/不低于等于,转移JAE/JNB高于等于/不低于,转移JB/JNAE低于/不高于等于,转移JBE/JNA低于等于/不高于,转移JC有进位(借位),转移JE/JZ等于/为零,转移JG/JNLE大于/不小于等于,转移JGE/JNL大于等于/不小于,转移JL/JNGE小于/不大于等于,转移JLE/JNG小于等于/不大于,转移JNC无进位(借位),转移2023/1/3063条件转移指令JNE/JNZ不等于/不为零,转移JNO不溢出,转移JNP/JPOPF为“0”/奇状态,转移JNSSF为“0”,转移JO溢出,转移JP/JPEPF为“1”/偶状态,转移JSSF为“1”,转移JCXZ寄存器CX=0,转移重复控制指令LOOP循环LOOPE/LOOPZ等于/为零,循环LOOPNE/LOOPNZ不等于/不为零,循环中断指令INT中断INT3断点中断INTO溢出中断IRET中断返回2023/1/3064程序转移指令(续)1)无条件跳转(1)JMP标号/reg/mem①标号(label)是代码段中一条指令的符号地址,它可以作为程序转移指令的操作数使用。2023/1/3065无条件跳转

标号有三属性……

段属性(段基值)

偏移量属性(偏移地址)

类型属性(NEAR或FAR)2023/1/3066无条件跳转(续)标号的类型属性为FAR,则实现段间转移,指令为5字节长;标号的类型属性为NEAR,则实现段内转移,指令为3字节长;标号的类型属性为NEAR中的SHORT,则实现段内短转移,指令为2字节长。2023/1/3067无条件跳转(续)段间跳转时机器指令中的地址为绝对地址,是二个16位地址,偏移地址在前,段基值在后;段内跳转时机器指令中的地址为相对地址,是偏移地址的差值(16位);段内短跳转时机器指令中的地址为相对地址,是偏移地址的差值(8位)2023/1/3068无条件跳转(续)

②JMPBX;NEAR,功能为:IPBX

2023/1/3069无条件跳转(续)

③JMP[BX][BX]必须写明:是WORDPTR[BX],

还是DWORDPTR[BX]若为WORDPTR[BX],则为段内跳转,

功能是用[BX]W送IP;若为DWORDPTR[BX],则为段间跳转,

功能是用[BX]DW送CS:IP。2023/1/3070

分类范围寻址方式操作数类型操作数使用方式示例段内转移直接标号1字节立即数加入IPJMPSHORTSTARTJMPSTART2字节立即数加入IP间接寄存器操作数送入IPJMPBXJMPJTABLE[BX]存储器操作数(2字节)送入IP段间转移直接标号(4字节立即数)送入IP/CSJMPSTART1间接存储器操作数(4字节)送入IP/CSJMPJTABLE1[BX]JMP指令的汇编表示2023/1/3071无条件跳转(续)(2)CALL标号/reg/mem

调用指令,用来调用一个子程序(过程),又称为转子指令。

CALL指令的格式同JMP指令,区别在于CALL指令必须保存断点(CS:IP),这是由硬件来实现的。2023/1/3072无条件跳转(续)(3)RET返回指令,从子程序返回主程序。2023/1/30732)条件转移指令(1)JC/JZ/JS/JO/JP当CF/ZF/SF/OF/PF=1时跳转;JNC/JNZ/JNS/JNO/JNP当CF/ZF/SF/OF/PF=0时跳转JP与JPE等价,JNP与JPO等价;JZ与JE等价,JNZ与JNE等价。2023/1/3074条件跳转(续)

(2)JAabove> JBbelow< JGgreater> JLless< JA和JB用于无符号数,JG和JL用于 带符号数。

JA与JNBE等价2023/1/3075条件跳转(续)(3)JCXZ当CX=0时跳转 所有的条件转移指令都为短跳转,操作数为标号。2023/1/30763)重复控制指令

LOOP标号 当CX-1≠0时跳到标号处。

LOOPZ/LOOPE当CX-1≠0且ZF=1时跳转

LOOPNZ/LOOPNE当CX-1≠0且ZF=0时跳转

LOOP标号与DECCXJNZ标号等价。2023/1/30774)中断指令INTN;指令中断,N为0~255间的正整数

INT3;断点中断、单字节中断指令

INTO;溢出中断

IRET;中断返回2023/1/30786.处理器控制指令助记符功能标志操作STC进位标志置1CLC进位标志置0CMC进位标志取反STD方向标志置1CLD方向标志置0STI中断允许标志置1CLI中断允许标志置0外同步HLT暂停直至中断或复位WAIT等待-TEST信号有效ESC交权给外部处理机LOCK在下一条指令期间封锁总线空操作NOP空操作2023/1/3079处理器控制指令(续)六条对标志位置l和清0的指令:

STISTDSTCCLICLDCLCCF取反指令CMC暂停指令HLT三条控制CPU工作的指令:

WAIT(等待),ESC(交权),LOCK(封锁指令)。2023/1/30803.2汇编语言的基本语法

3.2.1汇编语言源程序的格式

3.2.2常量、标识符和表达式

3.2.3指示性语句

3.2.4指令性语句

3.2.5宏指令2023/1/30813.2.1汇编语言源程序的格式程序是为实现某一特定目的(例如,对数据进行某种处理等)而编写的一组指令的有序集合。汇编语言程序就是用汇编语言编写的源程序。汇编语言是一种面向机器的语言。它是与计算机硬件密切关联的,因而熟悉计算机硬件是汇编语言程序员必须具备的条件。与用高级语言编写程序相比较,汇编语言程序具有更高的效率,它的程序执行时间短且占用内存少,这在计算机实时控制和实时处理中是十分重要的,因而在实时领域中得到广泛的应用。2023/1/3082汇编语言与汇编程序用汇编语言编写的源程序必须用汇编程序(一种系统软件)进行汇编,将它转换成用机器语言表示的目标程序后,才能由CPU识别执行。因此编制程序时必须遵循规定的格式和语法。不同型号的CPU和不同版本的汇编程序,其汇编语言是不同的。对于同一系列的CPU,则是向上兼容的2023/1/3083例3-1对10个字节数据a1~a10求和。DATA

SEGMENTAT2000HARRAYDBa1,a2,a3,…

,a10COUNTEQU$-ARRAYSUMDW?DATAENDSSTACKSEGMENTPARASTACK餐STACK餐STAKDB10

DUP(?)TOPEQULENGTHSTAKSTACKENDSCODESEGMENTASSUME

CS:CODE,DS:DATA,SS:STACK2023/1/3084例3-1START:MOVAX,DATAMOVDS,AXMOVAX,0MOVDI,OFFSETSUMMOVBX,OFFSETARRAYMOVCX,COUNTLOP:ADDAL,[BX]ADCAH,0INCBXLOOPLOPMOV[DI],AXMOVAH,4CHINT21

HCODEENDSENDSTART2023/1/3085汇编语言的两个组成特点分段结构和语句行

1.分段结构8086/8088的程序是分段的,由此可知程序最多可由4种段组成,并分别将段寄存器CS、DS、ES和SS的内容作为段基值,每段所占内存容量可达64KB。上例程序共有3段,它们分别是数据段(段名DATA)、堆栈段(段名STACK)和代码段(段名CODE),各段由命令SEGMENT开始,并由命令ENDS结束。2023/1/3086语句行2.语句行上例程序共有26行,即共有26个语句行。汇编语言程序的语句有两类:指令性语句和指示性语句。2023/1/3087语句行

指令性语句是主要由指令构成的语句,其格式为

[标号:]操作码[操作数][;注释]其中操作码和操作数是用助记符表示的指令的两个部分,操作数可以是1个、2个或几个,也可以无操作数(或是默认的)。2023/1/3088

1)指令性语句其中带方括号的有三项:标号、操作数和注释。带有方括号表示该项是任选项,即根据具体编程需要该项可有可无,在实际语句中该项的方括号是不写出来的。标号具有该语句指令所在内存地址的属性,通常在转移指令中用做目的地址。注意,标号必须用冒号“:”结尾,这是语法的规定。用分号“;”开始的注释用来说明该语句在程序中的作用,以方便程序的阅读和修改,这项也是任选的。2023/1/30892)指示性语句指示性语句是主要由命令(也称伪指令)构成的语句,用来指示汇编程序进行汇编操作,其格式为[名字/变量]命令参数[;注释]其中,“命令”指示汇编程序进行某种汇编操作,“参数”是有关的数据,带方括号的项是任选项。2023/1/30903.2.2常量、标识符和表达式1.常量

2.标识符

3.表达式2023/1/30911.常量常量是其值在程序中不能改变的量,

在汇编语言源程序中的常量有:

数字常量、字符常量和符号常量(1)数字常量可以是二进制数、八进制数、十进制数或十六进制数表示(2)字符常量是用单引号‘

’括起来的ASCII字符其值是该字符的ASCII代码值(3)符号常量是用符号定义的常量。 例如,采用符号定义语句PORTAEQU80H,则指令MOVAL,PORTA与指令MOVAL,80H等价。

2023/1/30922.标识符

在编程时建立的有特定意义的字符序列,标识符可用作符号常量、名字、变量和标号等。 组成标识符有如下规定:

(1)组成标识符的字符有: 英文大写字母:A~Z; 英文小写字母:a-z; 数字0~9; 字符?、@、_、$;

(2)字符长度不超过3l个;

(3)首字符不能是数字;

(4)?不能单独作为一个标识符;

(5)不能把保留字用作标识符,保留字包括助记符、寄存器名等。

2023/1/30933.表达式

表达式由操作数和运算符组成。 操作数可以是常量、名字、变量和标号等。 运算符包括算术运算符、逻辑运算符、关系运算符、分析运算符和合成运算符等。

2023/1/3094表达式中的运算符

优先级低1括号中的项,即(…)和[…]2LENGTH,SIZE,WIDTH,MASK3PTR,OFFSET,SEG,TYPE,THIS4*,/,MOD5+,-6EQ,NE,L,LE,GT,GE7NOT8AND9OR,XOR2023/1/30953.2.3指示性语句1.程序开始和结束语句2.段定义语句3.过程定义语句4.数据定义语句5.符号定义语句2023/1/30961.程序开始和结束语句(1)NAME命令 给程序模块命名 格式:NAME名字(2)TITLE命令 格式:TITLE名字 名字作为每页标题打印出来,标题名字符不大于60个2023/1/3097程序开始和结束语句(3)END命令 格式:END[标号]

主模块结束必须写上标号, 标号是程序中第一句指令性语句的标号。

2023/1/30982.段定义语句

用来定义一个段

(1)SEGMENT/ENDS命令 格式:段名SEGMENT[参数] …….

段名ENDS

2023/1/3099段定义语句

段名由程序员定义,汇编时由系统为该段分配一个段基值,并将该值赋于段名。

SEGMENT语句中的参数为:[定位类型][组合类型][‘类别’]

用来设定该段在内存中的位置和在汇编、连接时,当该段与其它段组合在一起时该段同其它段的连接关系。都是任选项。

2023/1/30100①定位类型(align—type)定位类型用来指定该段段基值的边界条件,定位类型有以下四种:a.BYTE该段可从任何地址开始,即段基址=XXXX,XXXX,XXXX,XXXX,

XXXXB,其中X表示任意值,即1/0。b.WORD该段必须从字的边界开始,即段基址=XXXX,XXXX,XXXX,XXXX,XXX0B。2023/1/30101定位类型

c.PARA该段必须从小节的边界开始,即段基址=XXXX,XXXX,XXXX,XXXX,0000B。d.PAGE该段必须从页的边界开始,即段基值=XXXX,XXXX,XXXX,0000,0000B。注意:当定位类型缺省(即不写)时,隐含值为PARA。2023/1/30102②组合类型(combine-type)

在汇编和连接时,当该段与其他段组合在一起时,组合类型用来设定该段与其他段的连接关系,组合类型有以下六种。2023/1/30103组合类型a.PUBLIC该段连接时将与其他同名段依次连接起来,其连接次序由连接程序确定.b.COMMON该段连接时将与其他同名段有相同的段基值,即共享相同的存储空间,亦即各段会产生覆盖,但可节省内存容量。c.ATexp—使段基值等于按表达式exp计算所得的16位数,必须指出,对于代码段不能用ATexp来设定段基值。2023/1/30104组合类型d.STACK—仅用于堆栈段,使同名段都连接成一个连续段,且系统自动对SS和SP初始化。e.MEMORY指定该段在同名段的最后,即该段在同名段中位于最高的地址空间,若连接时有几个组合类型为MEMORY的段,则只有最前面(最先遇到)的段按组合类型MEMORY处理,其他段句按组合类型PUBLIC处理。f.NONE—表示本段与其他段逻辑上不发生关系,各段都有自己的段基值。注意:当组合类型缺省(即不写)时,隐含值为NONE。2023/1/30105段定义语句(2)ORG命令 偏移地址定位语句 指定某一语句在段内的偏移地址

格式:ORGexp exp为能计算出16位立即数的表达式2023/1/30106段定义语句(3)ASSUME命令

ASSUME命令紧跟在代码段的SEGMENT语句之后,用于指示下述程序中段寄存器同指定段名的对应关系 格式:

ASSUMECS:段名1,DS:段名2, SS:段名3,ES:段名4

2023/1/30107段定义语句

注意:

ASSUME语句仅指出段寄存器同段名的对应关系,并未对段寄存器赋值,在程序中未用到的段寄存器不必指示。2023/1/301083.过程定义语句

应用PROC/ENDP命令定义过程(procedure),过程即子程序,是程序的一部分,程序中用CALL指令调用过程,过程结束用RET指令返回程序。

2023/1/30109

过程定义语句格式:过程名PROC类型

……

过程名ENDP

类型为FAR/[NEAR]

2023/1/301104.数据定义语句

用来为数据分配内存单元。 格式:

[变量]命令参数1,参数2,……[;注释]

变量是内存中一组数的名字,由程序员在编程时用标识符定义,

变量可以作为内存操作数来使用。2023/1/30111数据定义语句

数据定义语句中的命令可以是:

DB定义字节数据(8位) DW定义字数据(16位) DD定义双字数据(32位) DQ定义8字节数据(64位) DT定义10字节数据(80位)2023/1/30112数据定义语句

参数是相应内存单元中的数据,可以是: 数字常量……用各种规定的数制表示; 字符常量……用单引号括起来的ASCII字符; 符号常量……用EQU语句定义。

2023/1/30113数据定义语句

?保留一个存储单位,以备程序执行过程中存入结果数据;

????保留4个存储单位;

ARYDB4DUP(43H)

表示定义一个变量ARY,在内存中开辟一个数组,存放4个43H。2023/1/30114数据定义语句

DUP为复制符格式:复制次数DUP(数据)

2023/1/30115数据定义语句(例)DATA1SEGMENTAT2000HORG3000HARY1DB12H,34H,56H,78HARY2DW1234H,5678HARY3DB‘A’,’B’,’C’,’D’,’ABCD’ARY4DW‘AB’ARY5DD‘AB’ARY6DWAYT2ARY7DDARY2

2023/1/30116数据定义语句(例)

在定义ARY6的语句中,参数为已定义的变量ARY2,其值为ARY2的偏移地址3004H;

在定义ARY7的语句中,参数为已定义的变量ARY2,其值为ARY2的偏移地址3004H和段基值2000H。

2023/1/301175.符号定义语句

(1)EQU命令等值命令 格式:名字/变量EQUexp(2)=命令等号命令 格式:名字=exp(3)PURGE命令 用来撤消已定义的符号常量 格式:PUREG名字 可同时撤消几个己定义的名字

2023/1/301186.名字与变量

1)名字 名字包括文件名、标题名、段名、过程名和符号常量名等,是程序员在编程中按标识符规定命名的,目的是方便编程和读程。

2023/1/30119名字(1)段名 在段定义语句中命名取定,定义后的段名可以作为段基值来使用,用来对段寄存器赋值,例如:

MOVAX,DATA1MOVDS,AX

2023/1/30120名字

(2)过程名 在过程定义语句中定义,指向过程中第一条指令所在的内存单元的地址,即过程的入口地址,有NEAR和FAR之分。

(3)符号常量 由符号定义语句EQU、=来定义,对符号常量给以赋值。

2023/1/301212.变量

(1)变量的定义和属性 变量由数据定义语句

DB/DW/DD/DQ/DT来定义。 变量有三属性:

2023/1/30122变量变量有三属性:段属性……说明该变量在哪个存储段中; 偏移地址属性……说明该变量的段内偏移量; 类型属性……说明该变量所在内存数据的类型(字节、字、双字、8字节还是10字节)。

2023/1/30123变量(2)分析运算符(Analyticoperator)

用于把变量的三个属性分别取出来作为操作数。有SEG、OFFSET.、TYPE、LENGTH和SIZE。

SEG变量名

取出变量的段基值

OFFSET变量名

取出变量的偏移地址

TYPE变量名

取出变量的类型值,字节数据为1、字数据为2、双字数据为4、

8字节数据为8、10字节数据为10。

2023/1/30124变量

LENGTH变量名:表示变量所在数组的元素个数。 注意:只有当数据用DUP定义时,才适用,否则恒为1。

SIZE变量名:表示变量所在数组的字节数。 注意:同LENGTH, SIZE变量=LENGTH变量*TYPE变量

2023/1/30125变量(3)合成运算符(a)PTR运算符 类型PTRexp

其中类型是

BYTE、WORD、DWORD(变量) FAR、NEAR(标号) exp为表达式,是存储器操作数,2023/1/30126

PTR运算符用于临时改变变量或标号的类型属性例如:BUFWDW1234H,5678H MOVAX,BUFW MOVAL,BYTEPTRBUFW也可用来指定内存操作数的类型例如:INCBYTEPTR[BX] INCWORDPTR[BX]

2023/1/30127PTR运算符也可用EQU和PTR定义一个新的变量 例如:BUFWDW1234H,5678H BUFBEQUBYTEPTRBUFW

则MOVAX,BUFW和

MOVAL,BUFB

都是合法的。2023/1/30128

(b)THIS类型 类似于PTR运算符,THIS与EQU一起用来定义一个新变量名。 例如:BUFBEQUTHISBYTE BUFWDW1234H,5678H EQU语句必须紧跟在DW语句(已定义的变量名之前)

THIS运算符2023/1/30129

LABEL命令

(c)LABEL命令 格式:变量/标号LABEL类型 用来定义语句中的变量(或标号)

例如: BUFBLABELBYTE BUFWDW1234H,5678H LABEL语句必须紧跟在DW语句(已定义的变量名之前) 。2023/1/301303.2.4指令性语句

格式:[标号:]操作码[操作数][,操作数][;注释]

一、标号

标号是一条指令在内存中的符号地址.

标号可以用作内存操作数。

2023/1/301311.标号

标号有三属性

(l)段属性:表示标号所在段的段基值;

(2)偏移量属性:表示标号所在位置的偏移地址;

(3)类型属性:表示标号所在指令是允许段内跳转还是段间跳转。

2023/1/30132标号用PTR重新指定标号类型 设已定义标号METER

则段内转移用JMPMETER; 段间转移用JMPFARPTRMETER2023/1/30133标号用EQU和PTR定义新标号:

METER:……. KILOMTEQUFARPTRMETER用EQU和THIS定义新标号:

KILOMTEQUTHISFAR METER:…….

2023/1/30134标号用LABEL定义新标号:

KILOMTLABELFAR METER:…….2023/1/301352.操作数

操作数可以用段名、符号常量、变量、属性表达式、过程名和标号等。例如:

MOVAX,DATA ;DATA是段名

MOVCX,COUNT ;COUNT是符号常量

MOVBL,BUFFER ;BUFFER是变量

MOVSI,OFFSETARRAY;OFFSETARRAY是属 ;性表达式

CALLSBRT1 ;SBRT1是过程名

JMPDONE ;DONE是标号2023/1/301363.3汇编语言程序设计基础

3.3.1概述

3.3.2顺序程序

3.3.3分支程序

3.3.4循环程序

3.3.5子程序

3.3.6汇编语言程序举例

3.3.7系统功能调用2023/1/301373.3.1概述程序(PROGRAM)

是完成特定功能的一组指令的有序集合程序设计的步骤是: 分析课题 确定算法 画流程图 编写程序 上机调试、修改

2023/1/301383.3.2顺序程序

*指令顺序执行,无分支、无转移、无循环。

*硬件支持是IP自动加1,

从内存取出一个指令字节,IP自动加1。

2023/1/30139例3-17查表求平方值

DATA SEGMENT TABLESQ DB0,1,4,9,16,25,36,49, DB64,81,100,121,144,169,196,225 XX DBX;X为0~15的正整数

YY DB? DATA ENDS STACK SEGMENTPARASTACK’STACK’ DB50DUP(?) STACK ENDS

2023/1/30140查表求平方值(续)CODE SEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN: MOVAX,DATA MOVDS,AX MOVBX,OFFSETTABLESQ MOVAH,0 MOVAL,XX ADDBX,AX MOVAL,[BX] MOVYY,AL MOVAH,4CH INT21H

2023/1/30141查表求平方值(续)注意

几个问题

1.程序结束方法

1)设计为一个“过程”(PROCEDURE) 2)以MOVAH,4CH INT21H

即4CH号功能调用结束。2.MOVAH,0;AH置0的必要性。3.MOV,ADD指令中d和s必需是相同类型。2023/1/30142例3.18非压缩的BCD码转换为压缩的BCD码

MOVAX,DAT1;AX=0109MOVCL,4;CL=4SALAH,CL;AH=10HROLAX,CL;AX=0091ROLAL,CL;AL=19HMOVBYTEPTRDATA,AL DAT1DW0109H

2023/1/301433.3.3分支程序

1.分支程序二要素

具有判断和转移功能的程序。

(1)判断

:运算结果的状态标志CF,PF,ZF,SF,OF;

(2)转移:主要是条件转移指令Jcc,cc为条件。 单标志位判断……JC,JZ,JO,JP,JS,JAE等;

多标志位判断……JA,JG,JGE等。

2023/1/30144分支程序

2.采用比较指令和转移指令实现分支

CMPd,s;d-s Jcc标号2023/1/30145例3-19 符号函数处理有一符号函数Y=f(X)1;X>0Y=0;X=0

-1;X<02023/1/30146

符号函数处理

MOVAL,XX CMPAL,0 JGEBIGR MOVAL,0FFH MOVYY,AL ;X<0时,-1送入YY单元

HLTBIGR:JEEQUL

2023/1/30147符号函数处理

MOVAL,1 MOVYY,AL ;X>0时,1送入YY单元

HLTEQUL:MOVYY,AL ;X<0时,0送入YY单元

HLT注意:JGE是用于帶符号数的指令

MOVAL,0FFH;AL→-

1

2023/1/30148例3-20数据块传送程序

DATA SEGMENT STRG DB1000DUP(?) STG1 EQUSTRG+7 STG2 EQUSTRG+25 STRSE EQU50 DATA ENDS STACK SEGMENTPARASTACK‘STACK’ STARN DB100DUP(?) STACK ENDS

20

温馨提示

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

评论

0/150

提交评论