汇编语言程序设计课件_第1页
汇编语言程序设计课件_第2页
汇编语言程序设计课件_第3页
汇编语言程序设计课件_第4页
汇编语言程序设计课件_第5页
已阅读5页,还剩504页未读 继续免费阅读

下载本文档

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

文档简介

基础知识开始1.1汇编语言及特点1.1.1机器语言1.1.2汇编语言1.1.3高级语言1.1.4汇编语言的特点返回本章首页1.1.1机器语言 计算机能够直接识别的数据是由二进制数0和1组成的代码。机器指令就是用二进制代码组成的指令,一条机器指令控制计算机完成一个基本操作。 用机器语言编写的程序是计算机惟一能够直接识别并执行的程序,而用其他语言编写的程序必须经过翻译才能变换成机器语言程序,所以,机器语言程序被称为目标程序。返回本节1.1.2汇编语言 为了克服机器语言的缺点,人们采用助记符表示机器指令的操作码,用变量代替操作数的存放地址等,这样就形成了汇编语言。所以汇编语言是一种用符号书写的、基本操作与机器指令相对应的、并遵循一定语法规则的计算机语言。 用汇编语言编写的程序称为汇编源程序。 汇编语言是一种符号语言,比机器语言容易理解和掌握,也容易调试和维护。但是,汇编语言源程序要翻译成机器语言程序才可以由计算机执行。这个翻译的过程称为“汇编”,这种把汇编源程序翻译成目标程序的语言加工程序称为汇编程序。返回本节1.1.3高级语言

汇编语言虽然较机器语言直观,但仍然烦琐难懂。于是人们研制出了高级程序设计语言。高级程序设计语言接近于人类自然语言的语法习惯,与计算机硬件无关,易被用户掌握和使用。 目前广泛应用的高级语言有多种,如BASIC、FORTRAN、PASCAL、C、C++等等。返回本节1.1.4汇编语言的特点(1)汇编语言与处理器密切相关。(2)汇编语言程序效率高。(3)编写汇编语言源程序比编写高级语言源程序烦琐。(4)调试汇编语言程序比调试高级语言程序困难。汇编语言的主要应用场合:

(1)程序执行占用较短的时间,或者占用较小存储容量的场合。(2)程序与计算机硬件密切相关,程序直接控制硬件的场合。(3)需提高大型软件性能的场合。(4)没有合适的高级语言的场合。返回本节1.2数据表示1.2.1数值数据1.2.2字符数据返回本章首页1.2.1数值数据数值数据分为有符号数和无符号数。无符号数最高位表示数值,而有符号数最高位表示符号。有符号数有不同的编码方式,常用的是补码。1.原码最高位表示符号(正数用0,负数用1),其他位表示数值位,称为有符号数的原码表示法。【例1.1】有符号数的原码表示。X=45=00101101B[X]原=00101101BX=-45,[X]原=10101101B原码表示简单易懂,但若是两个异号数相加(或两个同号数相减),就要做减法。为了把减法运算转换为加法运算就引进了反码和补码。2.反码正数的反码与原码相同,符号位用0表示,数值位值不变。负数的反码符号位用1表示,数值位为原码数值位按位取反形成,即0变1、1变0。【例1.2】有符号数的反码表示。X=45=00101101B,[X]反=00101101BX=-45,[X]反=11010010B3.补码正数的补码与原码相同,即符号位用0表示,数值位值不变。负数的补码为反码加1形成。【例1.3】有符号数的补码表示。X=45=00101101B[X]补=00101101BX=-45[X]补=11010011B4.符号扩展在数据处理时,有时需要把8位二进制数扩展成16位二进制数,当要扩展的数是无符号数时,可在最高位前扩展8个0。如果要扩展的数是补码形式的有符号数,那么,就要进行符号位的扩展,符号扩展后,其结果仍是该数的补码。【例1.4】符号扩展表示。21的8位二进制补码为:00010101符号扩展后21的16位二进制补码为:0000000000010101。00010101和0000000000010101都是21的补码。5.数据的表示范围和大小

n位二进制数能够表示的无符号整数的范围是:0≤I≤2n-1n位二进制数能够表示的有符号整数的范围是:-2(n-1)≤I≤+2(n-1)-16.十六进制表示

由于二进制数的基数太小,书写和阅读都不方便.而十六进制的基数16=24,这样二进制数与十六进制之间能方便地转换。因此,习惯把二进制数改写成十六进制数,在汇编语言程序设计时尤其如此。在书写时,为了区别于十六进制和二进制数,通常在十六进制数后加字母H。返回本节1.2.2字符数据1.ASCII码2.BCD码1.ASCII码标准ASCII码用7位二进制数编码,共有128个。计算机存储器基本单位为8位,ASCII码的最高位通常为0,通信时,最高位用作奇偶校验位。ASCII码表中的前32个和最后1个编码是不能显示的控制字符,用于表示某种操作。ASCII码表中20H后的94个编码是可显示和打印的字符,其中包括数码0~9,英文字母,标点符号等。2.BCD码 虽然二进制数实现容易,但不符合人们的使用习惯,且书写阅读不方便,所以在计算机输入输出时通常还是采用十进制来表示数,这就需要实现十进制与二进制间的转换。为了转换方便,常采用二进制编码的十进制,简称为BCD码。 BCD码就是用4位二进制数表示1位十进制整数。表示的方法有多种,常用的是8421BCD码,它的表示规律如表1.1所示。表1.1十进制数字的8421BCD码十进制数字8421BCD码十进制数字8421BCD码00000501011000160110200107011130011810004010091001返回本节1.38086CPU和寄存器组

1.3.1Intel

8086CPU内部结构1.3.28086寄存器组1.3.3标志寄存器返回本章首页1.3.1Intel

8086CPU内部结构图1.28086CPU内部结构图1.28086CPU内部结构返回本节1.3.28086寄存器组图1.38086CPU寄存器分组1.通用寄存器(1)数据寄存器数据寄存器共有4个寄存器AX、BX、CX、DX,用来保存操作数或运算结果等信息。AX寄存器称为累加器。使用频度最高,用于算术、逻辑运算以及与外设传送信息等。BX寄存器称为基址寄存器。常用于存放存储器地址。CX寄存器称为计数器。一般作为循环或串操作等指令中的隐含计数器。DX寄存器称为数据寄存器。常用来存放双字数据的高16位,或存放外设端口地址。变址和指针寄存器包括SI、DI、SP、BP4个16位寄存器,主要用于存放某个存储单元的偏移地址。SI是源变址寄存器,DI是目的变址寄存器,在字符串操作中,SI和DI都具有自动增量或减量的功能。SP为堆栈指针寄存器,用于存放当前堆栈段中栈顶的偏移地址;BP为基址指针寄存器,用于存放堆栈段中某一存储单元的偏移地址。(2)变址和指针寄存器2.段寄存器8086CPU的4个16位的段寄存器分别称为代码段寄存器CS,数据段寄存器DS,堆栈段寄存器SS,附加数据段寄存器ES。段寄存器用来确定该段在内存中的起始地址。代码段用来存放程序的指令序列。CS存放代码段的段首址,指令指针寄存器IP指示代码段中指令的偏移地址。3.指令指针 8086CPU中的指令指针IP,它总是保存下一次将要从主存中取出指令的偏移地址,偏移地址的值为该指令到所在段段首址的字节距离。在目标程序运行时,IP的内容由微处理器硬件自动设置,程序不能直接访问IP,但一些指令却可改变IP的值,如转移指令、子程序调用指令等。返回本节1.3.3标志寄存器8086CPU中有一个很重要的16位标志寄存器,它包含9个标志位,主要用于保存一条指令执行后,CPU所处状态信息及运算结果的特征。1.条件标志2.状态控制标志1.条件标志(1)进位标志CF(2)零标志ZF(3)符号标志SF(4)溢出标志OF(5)奇偶标志PF(6)辅助进位标志AF2.状态控制标志(1)方向标志DF(2)中断允许标志IF(3)追踪标志TF返回本节1.4存储器物理地址的形成1.4.1存储器1.4.2存储器单元的地址和内容1.4.3物理地址的形成返回本章首页1.4.1存储器 存储器是计算机的记忆部件,用来存放程序和数据。按所在的位置,存储器可以分成主存储器和辅助存储器。 主存储器存放当前正在执行的程序和使用的数据,CPU可以直接存取,它由半导体存储器芯片构成,其成本高,容量小,但速度快。 辅助存储器可用来长期保存大量程序和数据,CPU需要通过I/O接口访问,它由磁盘或光盘构成,其成本低,容量大,但速度较慢。返回本节1.4.2存储器单元的地址和内容存储单元地址:8086系统中,为了标识和存取每一个存储单元,给每个存储单元规定一个编号,这就是存储单元地址。存储单元的内容:一个存储单元中存放的信息称为该存储单元的内容。图1.4表明了存储器中部分存储单元存放信息情况。从图1.4可看到,地址为34560H的字节的存储单元中的内容是34H,而地址为34561H的字节存储单元中的内容是12H。返回本节1.4.3物理地址的形成 8086CPU的地址线是20位的,这样最大可寻址空间应为220=1MB,其物理地址范围从00000H~FFFFFH。而8086CPU寄存器都是16位的。那么,这1MB空间如何用16位寄存器表达呢? 根据要求可把1M字节地址空间划成若干逻辑段。每个逻辑段必须满足两个条件:一是逻辑段的起始地址(简称段首址)必须是16的倍数;二是逻辑段的最大长度为64K。按照这两个条件,1M字节地址空间最多可划分成64K个逻辑段,最少也要划分成16个逻辑段。逻辑段与逻辑段可以相连,也可以不连,还可以重叠。【例1.5】各独立段的分配情况示例。设CS=B000H、DS=1CDEH、SS=4200H、ES=0150H,它们分别为代码段、数据段、堆栈段和附加段的段首址。自每个段首址开始,各段均占64KB的范围,各段之间互不重叠。如图1.5所示。【例1.6】各段相互重叠情况示例。设CS=0200H、DS=0400H、SS=0480H,这样代码段、数据段和堆栈段的物理首地址分别为02000H、04000H和04800H。其中代码段占8KB地址空间,数据段占2KB,堆栈段占256B,SP=0100H。如图1.6所示。8086CPU的指令系统的基本指令包括数据传送类指令、算术运算类指令、位操作类指令、串操作类指令、控制转移类指令、处理机控制类指令。后几节将分别介绍这些指令的语句格式和功能。8086CPU的指令的共同的规律l

大多数数据传送类指令、算术运算类指令、位操作类指令及串操作类指令,其双操作数指令有相同的语句格式和操作规定。

语句格式:[标号:]操作符

OPD,OPS[;注释]l

算术运算和位操作类指令的部分单操作数指令有相同的语句格式和操作规定。语句格式:[标号:]操作符

OPD[;注释]2.1寻址方式2.1.1寄存器寻址2.1.2寄存器间接寻址2.1.3变址寻址2.1.4基址加变址寻址2.1.5立即寻址2.1.6直接寻址2.1.7跨段问题返回本章首页2.1.1寄存器寻址寄存器寻址方式的操作数在指令指明的寄存器中。汇编格式:R其中R表示寄存器名。功能:操作数直接存放在寄存器R中。图形表示:

R

指令→操作数【例2.1】下列程序执行后,(AX)=?,(BX)=?MOVAX,1234HMOVBX,5678HADDAX,BX该程序中MOV指令为数据传送指令操作符,ADD指令为加法指令操作符,三条指令皆为双操作数指令。第一、二条指令AX、BX皆为目的操作数地址,为寄存器寻址方式。第三条指令中,AX为目的操作数地址,BX为源操作数地址。源地址和目的地址皆为寄存器寻址方式。图形表示:执行:1234H→AX5678H→BX

(AX)+(BX)→AX执行后:(AX)=68ACH,(BX)=5678H返回本节2.1.2寄存器间接寻址寄存器间接寻址方式中,寄存器的内容为操作数的偏移地址EA,操作数在存储器中。汇编格式:[R]功能:操作数存放在存储器,寄存器R存放操作数的偏移地址EA。偏移地址EA计算方法如下:EA=[SI] SI作间址寄存器。[DI] DI作间址寄存器。[BX] BX作间址寄存器。[BP] BP作间址寄存器。执行指令:MOVAX,[BP]执行后:(AX)=?,(BP)=?,(SS)=?,(20030H)=?图形表示如下:

【例2.2】寄存器和存储器内容分别为:(AX)=0,(BP)=0030H,(SS)=2000H,(20030H)=1234H返回本节2.1.3变址寻址变址寻址方式操作数的偏移地址EA为寄存器的内容加位移量,操作数在存储器中。汇编格式:X[R](X表示位移量,是8位或16位二进制补码表示的有符号数)功能:操作数存放在存储器,寄存器R的内容加位移量X为操作数的偏移地址EA。图形表示如下:偏移地址EA计算方法如下:【例2.3】设执行前:(AX)=0040H,(BX)=0030H,(DS)=2000H,(20036H)=0050H执行指令:ADD6[BX],AX执行后:(AX)=?,(BX)=?,(DS)=?,(20036H)=?图形表示如下:

执行:(20036H)+(AX)→20036H执行后:(AX)=0040H,(BX)=0030H,(DS)=2000H,(20036H)=0090H。返回本节2.1.4基址加变址寻址基址加变址寻址方式中,操作数的偏移地址EA是指令中基址寄存器内容、变址寄存器内容、位移量X三项之和,操作数在存储器中。汇编格式:X[BR+IR]功能:操作数存放在存储器,BR的内容加IR的内容加位移量X是操作数的偏移地址EA。图形表示:操作数偏移地址EA计算方法如下返回本节2.1.5立即寻址立即寻址方式中,指令操作码和操作数都在存储器代码段中。汇编格式:n(n为立即操作数,是用8位或16位二进制补码表示的有符号数)功能:操作数存放在存储器,指令下一单元的内容为立即操作数n。图形表示:【例2.5】【例2.5】MOVAX,10执行后(AX)=?该例中源操作数为立即寻址方式,立即数为10,存放在指令的下一单元。图形表示:执行:10→AX执行后:(AX)=000AH

返回本节2.1.6直接寻址汇编格式:①含有变量的地址表达式。②段寄存器名:[EA]。功能:指令下一字单元的内容是操作数的偏移地址EA。图形表示:【例2.6】【例2.6】寄存器和存储器内容为:(AX)=1212H,BUF为数据段定义的变量,其偏移地址是2000H,(DS)=3000H,(32000H)=4545H。执行指令:MOVAX,BUF执行后:(AX)=?图形表示:执行:(32000H)→AX执行后:(AX)=4545H返回本节2.1.7跨段问题按前述规定:若选用BP作间址基址寄存器、变址寄存器或基址寄存器,则操作数在堆栈段,操作数的物理地址PA由堆栈段寄存器SS的内容左移4位与偏移地址EA相加后形成;否则,操作数在数据段,操作数的物理地址PA由数据段寄存器DS的内容左移4位与偏移EA相加后形成。该规定为系统默认状态。当要否定默认状态,到非约定段寻找操作数时,必须用跨段前缀指明操作数的段寄存器名。汇编格式:段寄存器名:操作数地址。功能:段寄存器名指明操作数属哪个段。【例2.7】跨段前缀示例。MOV AX,DS:[BP]MOV CX,SS:[SI]该例中,DS:,SS:均为跨段前缀,此时默认状态无效,操作数的物理地址PA由段寄存器内容左移4位加偏移EA形成。上述2条指令的源操作数物理地址分别为:PA1=(DS)左移4位+[BP]PA2=(SS)左移4位+[SI返回本节2.2数据传送类指令2.2.1通用数据传送指令2.2.2堆栈操作指令2.2.3标志寄存器传送指令2.2.4地址传送指令2.2.5输入输出指令返回本章首页2.2.1通用数据传送指令1.传送指令MOV2.数据交换指令XCHG3.查表转换指令

XLAT1.传送指令MOV语句格式:MOVOPD,OPS功能:将源操作数传送入目的地址,源地址内容不变。即(OPS)→OPD。下图2.1描述了MOV指令在传送数据时允许传送的路径及类型。图2.1MOV指令所允许的数据传送路径及类型【例2.8】存储器与寄存器间数据传送。MOVAX,BUF;BUF是变量,源操作数为直接寻址MOVBH,[DI] ;源操作数为寄存器间接寻址MOVDI,ES:3[SI];源操作数为变址寻址,使用跨段前缀MOVBP,3[BX+SI] ;源操作数为基址加变址寻址MOVBUFA,DL ;BUFA是一字节变量MOV[BP],AX ;使用SS段寄存器MOVDS:[BP],DL ;使用跨段前缀MOVBUF,DS ;BUF是个字变量MOVES,BUF2.数据交换指令XCHG语句格式:XCHGOPD,OPS功能:将源地址与目的地址中的内容互换。即(OPD)→OPS,(OPS)→OPD。【例2.9】寄存器与存储器之间数据交换。MOV AX,5678H ;(AX)=5678HMOV BX,0FFFFH ;(BX)=0FFFFHXCHG AX,BX ;(AX)=0FFFFH,(BX)=5678H3.查表转换指令XLA语句格式:XLATOPS或XLAT功能:将(BX)为首址(AL)为位移量的字节存储单元中的数据送AL寄存器。即([BX+AL])→AL。返回本节2.2.2堆栈操作指令1.进栈指令PUSH2.出栈指令POP1.进栈指令PUSH语句格式:PUSHOPS功能:将寄存器、段寄存器或存储器中的一个字数据压入堆栈,堆栈指针减2。即:①(SP)-1→SP(OPS)15~8→[SP]②(SP)-1→SP (OPS)7~0→[SP]2.出栈指令POP语句格式:POPOPD功能:将栈顶元素弹出送至某一寄存器、段寄存器(除CS外)或存储器,堆栈指针加2。从POP指令功能可看出,该指令为PUSH指令的逆过程。即:①([SP])→(OPD)7~0 (SP)+1→SP②([SP])→(OPD)15~8 (SP)+1→SP返回本节2.2.3标志寄存器传送指令1.标志送AH指令LAHF2.AH送标志指令SAHF3.标志寄存器进栈指令PUSHF4.标志寄存器出栈指令POPF1.标志送AH指令LAHF语句格式:LAHF功能:将标志寄存器的低8位送入AH寄存器。即(FLAGS)7-0→AH。该指令的执行对标志位无影响。【例2.13】标志寄存器传送。执行前:(FLAGS)=0485H,(AX)=0FFFFH执行指令:LAHF2.AH送标志指令SAHF语句格式:SAHF功能:将AH的内容送入标志寄存器的低8位,高8位不变。即(AH)→FLAGS7-0.。从该指令功能可看出,SAHF为LAHF的逆过程。3.标志寄存器进栈指令PUSHF语句格式:PUSHF功能:将标志寄存器的内容压入堆栈。即(FLAGS)→↓(SP)。4.标志寄存器出栈指令POPF功能:将栈顶内容弹出送入标志寄存器中。即↑(SP)→FLAGS。POPF指令与PUSHF指令互为逆过程。【例2.14】将标志寄存器的单步标志TF置位。PUSHF ;(FLSGS)→↓(SP)POPAX ;(SP)→AXORAX,0100H ;设置D8=TF=1PUSHAX ;(AX)→↓(SP)POPF;(SP)→↓FLAGS,即(AX)→↓FLAGS返回本节2.2.4地址传送指令1.传送偏移地址指令LEA2.传送偏移地址及数据段首址指令LDS3.传送偏移地址及附加数据段指令LES1.传送偏移地址指令LEA语句格式:LEAOPD,OPS功能:主存按源地址的寻址方式计算偏移地址,将偏移地址送入指定寄存器。【例2.15】主存偏移地址的获取。MOVBX,0100H ;(BX)=0100HMOVSI,0210H ;(SI)=0210HLEABX,1234[BX+SI] ;(BX)=1544H2.传送偏移地址及数据段首址指令LDS语句格式:LDSOPD,OPS功能:将主存中指定字单元数据送入指定存储器,下一字单元数据送DS寄存器。3.传送偏移地址及附加数据段指令LES语句格式:LESOPD,OPS功能:将主存某字单元内容送指定寄存器。即(OPS)→OPD,(OPS+2)→ES。返回本节2.2.5输入输出指令1.输入指令IN2.输出指令OUT1.输入指令IN输入指令用来从指定的外设寄存器取信息送入累加器。它有四种形式:(1)语句格式:IN AL,PORT

功能:(PORT) →AL(2)语句格式:IN AX,PORT

功能:(PORT) →AX(3)语句格式:IN AL,DX

功能:([DX]) →AL(4)语句格式:IN AX,DX

功能:([DX]) →AL2.输出指令OUT输出指令用来把累加器的内容送往指定的外设存储器,它有四种形式:(1)语句格式:OUT PORT,AL

功能:(AL)

→PORT(2)语句格式:OUT PORT,AX

功能:(AX)

→PORT(3)语句格式:OUT DX,AL

功能:(AL)

→[DX](4)语句格式:OUT DX,AX

功能:(AX)

→[DX]返回本节2.3算术运算类指令2.3.1加法指令2.3.2减运算指令2.3.3乘运算指令2.3.4除运算指令2.3.5符号扩展指令2.3.6十进制调整指令返回本章首页2.3.1加法指令1.加1指令

INC2.加指令ADD3.带进位加指令ADC1.加1指令INC语句格式:INCOPD功能:将目的操作数加1,结果送目的地址。即(OPD)+1→OPD。INC指令是一个单操作数指令,操作数可以是寄存器或存储器操作数。如:INCBX,即(BX)+1→BX。加1指令可用于对计数器和地址指针进行调整。2.加指令ADD语句格式:ADDOPD,OPS功能:将目的操作数与源操作数相加,结果存入目的地址中,源地址的内容不改变。即(OPD)+(OPS)→OPD。3.带进位加指令ADC语句格式:ADCOPD,OPS功能:将目的操作数加源操作数再加低位进位,结果送目的地址。即(OPD)+(OPS)+CF→OPD。【例2.20】无符号双字加法运算。MOV AX,4652H ;(AX)=4652HADD AX,0F0F0H ;(AX)=3742H,CF=1MOV DX,0234H ;(DX)=0234HADC DX,0F0F0H ;(DX)=0F325H,CF=0返回本节2.3.2减运算指令1.减1指令DEC2.减指令SUB3.求补指令NEG4.带借位减指令

SBB5.比较指令

CMP1.减1指令DEC语句格式:DECOPD功能:将目的操作数减1,结果送目的地址。即(OPD)-1→OPD。DEC指令是一个单操作数指令,操作数可以是寄存器或存储器操作数。如:DECCX。即(CX)-1→CX。减1指令DEC也一般用于对计数器和地址指针的调整。2.减指令SUB语句格式:SUBOPD,OPS功能:目的操作数减源操作数,结果存于目的地址,源地址内容不变。即(OPD)-(OPS)→OPD【例2.21】减法运算。MOV AX,5678H ;(AX)=5678HSUB AX,1234H ;(AX)=4444HMOV BX,3354H ;(BX)=3354HSUB BX,3340H ;(BX)=0014H3.求补指令NEG语句格式:NEGOPD功能:将目的操作数的每一位求反(包括符号位)后加1,结果送目的地址。即(OPD)+1→OPD。【例2.22】求补运算。MOV AX,0FF64HNEG AL ;(AX)=0FF9CHSUB AL,9DH ;(AX)=0FFFFHNEG AX ;(AX)=0001HDEC AL ;(AX)=0000HNEG AX ;(AX)=0000H4.带借位减指令SBB语句格式:SBBOPD,OPS功能:目的操作数减源操作数再减低位借位CF,结果送目的地址。即(OPD)―(OPS)―CF→OPD5.比较指令CMP语句格式:CMPOPD,OPS功能:目的操作数减源操作数,结果只影响标志位,不送入目的地址。即(OPD)-(OPS)。【例2.24】比较AL的内容数值大小。CMP AL,50 ;(AL)-50JB BELOW ;(AL)<50,转到BELOW处执行SUB AL,50 ;(AL)>=50,(AL)-50→ALINC AH ;(AH)+1→AHBELOW: …返回本节2.3.3乘运算指令1.无符号数乘法指令MUL2.有符号乘指令IMUL1.无符号数乘法指令MUL语句格式:MULOPS功能:若是字节数据相乘,(AL)与OPS相乘得到字数据存入AX中;若是字数据相乘,则(AX)与OPS相乘得到双字数据,高字存入DX、低字存入AX中。即字节乘法:(AL)*(OPS)→AX,字乘法:(AX)*(OPS)→DX,AX【例2.25】无符号数0A3H与11H相乘。MOV AL,0A3H ;(AL)=0A3HMOV BL,11H ;(BL)=11HMUL BL ;(AX)=0AD3H2.有符号乘指令IMUL语句格式:IMULOPS功能:字节乘法:(AL)*(OPS)→AX,字乘法:(AX)*(OPS)→DX、AX。IMUL指令除计算对象是带符号二进制数外,其他都与MUL一样,但计算结果不同。【例2.26】有符号数0B4H与11H相乘。MOV AL,0B4H ;(AL)=B4HMOV BL,11H ;(BL)=11HIMUL BL ;(AX)=0FAF4H返回本节2.3.4除运算指令1.无符号除指令DIV2.有符号除指令IDIV1.无符号除指令DIV语句格式:DIVOPS功能:字节除法:(AX)/(OPS)→AL(商)、AH(余数)字除法:(DX、AX)/(OPS)→AX(商)、DX(余数)【例2.27】写出实现无符号数0400H/0B4H运算的程序段。MOV AX,0400H ;(AX)=0400HMOV BL,0B4H ;(BL)=0B4HDIV BL ;商(AL)=05H,余数(AH)=7CH

2.有符号除指令IDIV语句格式:IDIVOPS功能:字节除法:(AX)/(OPS)→AL(商)、AH(余数)字除法:(DX,AX)/(OPS)→AX(商)、DX(余数)除法指令DIV和IDIV虽然对标志的影响未定义,但可产生溢出。【例2.28】写出实现有符号数0400H/0B4H运算的程序段。MOV AX,0400H ;(AX)=0400HMOV BX,0B4H ;(BX)=0B4HIDIV BX ;(AL)=0F3H,(AH)=24H返回本节2.3.5符号扩展指令1.字节转换成字指令CBW2.将字转换成双字指令CWD1.字节转换成字指令CBW语句格式:CBW功能:将AL中的符号位数据扩展至AH。【例2.29】将字节数据扩展成字数据。MOV AL,0A5H ;(AL)=0A5HCBW ;(AX)=0FFA5HADD AL,70H ;(AL)=25HCBW ;(AX)=0025H2.将字转换成双字指令CWD语句格式:CWD功能:将AX中的符号位数据扩展至DX。【例2.30】将字数据扩展成双字数据。MOV DX,0 ;(DX)=0MOV AX,0FFABH ;(AX)=0FFABHCWD ;(DX)=0FFFFH(AX)=0FFABH返回本节2.3.6十进制调整指令1.压缩BCD码调整指令2.非压缩BCD码调整指令(1)加法的十进制调整指令DAA语句格式:DAA功能:如果AL寄存器中低4位大于9或辅助进位(AF)=1,则(AL)=(AL)+6且(AF)=1;如果(AL)>=0A0H或(CF)=1,则(AL)=(AL)+60H且(CF)=1。同时,SF、ZF、PF均有影响。【例2.31】压缩BCD码的加法运算。MOVAL,68H ;(AL)=68H,表示压缩BCD码68MOVBL,28H ;(BL)=28H,表示压缩BCD码28ADDAL,BL ;二进制加法:(AL)=68H+28H=90HDAA ;十进制调整:(AL)=96H;实现压缩BCD码加法:68+28=96(2)减法的十进制调整指令DAS语句格式:DAS功能:如果(AF)=1或AL寄存器中低4位大于9,则(AL)=(AL)-6且(AF)=1;如果(AL)>=0A0H或(CF)=1,则(AL)=(AL)-60H且(CF)=1。同时SF、ZF、PF均受影响。【例2.32】压缩BCD码的减法运算。MOV AL,68H;(AL)=68H,表示压缩BCD码68MOV BL,28H;(BL)=28H,表示压缩BCD码28SUB AL,BL ;二进制减法:(AL)=68H-28H=40HDAS ;十进制调整:(AL)=40H ;实现压缩BCD码减法:68-28=40

2.非压缩BCD码调整指令(1)加法的非压缩BCD码调整指令AAA(2)减法的非压缩BCD码调整指令AAS(3)乘法的非压缩BCD码调整指令AAM(4)除法的非压缩BCD码调整指令AAD(1)加法的非压缩BCD码调整指令AAA语句格式:AAA功能:如果AL的低4位大于9或(AF)=1,则:(AL)=(AL)+6(AH)=(AH)+1(AF)=(CF)=1

且AL高4位清零。否则:(CF)=(AF)=0AL高4位清零。(2)减法的非压缩BCD码调整指令AAS语句格式:AAS功能:如果AL的低4位大于9或(AF)=1,则:(AL)=(AL)-6(AH)=(AH)-1(AF)=(CF)=1AL高4位清零。否则:(CF)=(AF)=0AL高4位清零。其他标志位OF、PF、SF、ZF不确定。(3)乘法的非压缩BCD码调整指令AAM语句格式:AAM功能:被调整的乘积在AX中,对AL按10取模,则:(AL)/0AH→AH(商):AL(余数)其中AH为商,AL为余数,标志位AF、CF、OF、PF、SF、ZF受影响。(4)除法的非压缩BCD码调整指令AAD语句格式:AAD功能:除法运算前,先调整被除数AX内容,使:(AL)=(AL)+(AH)*0AH(AH)=0即把非压缩型十进制数变成二进制数。返回本节2.4位操作类指令2.4.1逻辑运算指令2.4.2移位指令

返回本章首页2.4.1逻辑运算指令1.求反指令NOT2.逻辑乘指令AND3.测试指令TEST4.逻辑加指令OR5.按位加指令XOR1.求反指令NOT语句格式:NOTOPD功能:将目的地址中的内容逐位取反后送入目的地址。即(OPD)→OPD【例2.37】逻辑非运算。MOV AX,878AH ;(AX)=878AHNOT AX, ;(AX)=7875H2.逻辑乘指令AND语句格式:ANDOPD,OPS 功能:将目的操作数和源操作数进行逻辑乘运算,结果存目的地址。即(OPD)∧(OPS)→OPD。该指令用于清除目的操作数中与源操作数置0的对应位。说明:逻辑乘的运算法则为:1∧1=1,1∧0=0,0∧1=0,0∧0=0【例2.38】将AL中第3位和第7位清零。MOV AL,0FFHAND AL,77H3.测试指令TEST语句格式:TESTOPD,OPS功能:源地址和目的地址的内容执行按位的逻辑乘运算,结果不送入目的地址。即(OPD)∧(OPS)。【例2.39】测试AX中的第12位是否为0,不为0则转L。TEST AX,1000HJNE L4.逻辑加指令OR语句格式:OROPD,OPS功能:将目的操作数和源操作数进行逻辑加运算,结果存目的地址。即(OPD)∨(OPS)→OPD。说明:逻辑加的运算法则为:1∨1=1,1∨0=1,0∨1=1,0∨0=0。【例2.40】将AL寄存器中第3位和第7位置1。MOV AL,0OR AL,88H5.按位加指令XOR语句格式:XOROPD,OPS功能:目的操作数与源操作数做按位加运算,结果送入目的地址。即(OPD)⊕(OPS)→OPD。说明:按位加的运算法则为;1⊕1=0,1⊕0=1,0⊕1=1,0⊕0=0。【例2.41】按位加运算。MOV AL,45H ;(AL)=45HXOR AL,31H ;(AL)=74H返回本节2.4.2移位指令移位指令包括算术移位指令、逻辑移位指令和循环移位指令,分别进行左移和右移操作。这些指令均有统一的语句格式:[标号:]操作符OPD,1或[标号:]操作符OPD,CL其功能为将目的操作数的所有位按操作符规定的方式移动1位或按寄存器CL规定的次数(0~255)移动,结果送入目的地址。目的操作数是8位(或16位)的寄存器数据或存储器数据。1.算术左移和逻辑左移指令SAL(SHL)语句格式:SALOPD,1或SHLOPD,1SALOPD,CL或SHLOPD,CL功能:将(OPD)向左移动CL指定的次数,最低位补入相应的0,CF的内容为最后移入位的值。2.算术右移指令SAR语句格式:SAROPD,1或SAROPD,CLCF功能:将(OPD)向右移动CL指定的次数且最高位保持不变;CF的内容为最后移入位的值。【例2.43】算术右移运算。MOV BH,0F4H ;(BH)=0F4HMOV CL,2 ;(CL)=2SAR BH,CL ;(BH)=0FDH,(CF)=0该例语句“SARBH,CL”实际上完成了(BH)/4→BH的运算,所以,用SAR指令可以实现对有符号数除2n的运算(n为移位次数)。3.逻辑右移指令SHR语句格式:SHROPD,1或SHROPD,CL功能:将(OPD)向右移动CL规定的次数,最高位补入相应个数的0,CF的内容为最后移入位的值。4.循环左移指令ROL语句格式:ROLOPD,1或ROLLPD,CL功能:将目的操作数的最高位与最低位连成一个环,将环中的所有位一起向左移动CL规定的次数。CF的内容为最后移入位的值。5.循环右移指令ROR语句格式:ROROPD,1或ROROPD,CL功能:将目的操作数的最高位与最低位连成一个环,将环中的所有位一起向右移动CL规定的次数,CF的内容为最后移入位的值。6.带进位的循环左移指令RCL语句格式:RCLOPD,1或RCLOPD,CL功能:将目的操作数连同CF标志一起向左循环移动CL规定的次数。7.带进位的循环右移指令RCR语句格式:RCROPD,1或RCROD,CL功能:将目的操作数连同CF标志一起向右循环移动所规定的次数。返回本节2.5串操作类指令串操作指令:数据传送类指令每次只能传送一个数据,若要传送大批数据就需要重复编程,这样就浪费了大量的时间和空间。为此8086提供了一组处理主存中连续存放数据串的指令,这就是串操作指令。

返回本章首页图2.3流程图总结了串操作的过程。图2.3串操作流程图1.传送指令MOVS语句格式:①MOVSB——字节串传送②MOVSW——字串传送功能:将以SI为指针的源串中的一个字节(或字)存储单元中的数据传送至以DI为指针的目的地址中去,并自动修改指针,使之指向下一个字节(或字)存储单元。即:①(DS:[SI])→ES:[DI]。

当DF=0时,(SI)和(DI)增量。当DF=1时,(SI)和(DI)减量。2.串比较指令CMPS语句格式:①CMPSB——字节串比较②CMPSW——字串比较功能:将SI所指的源串中的一个字节(或字)存储单元中的数据与DI所指的目的串中的一个字节(或字)存储单元中的数据相减,并根据相减的结果设置标志,但结果并不保存。即:①([SI])-([DI])。②修改串指针,使之指向串中的下一个元素。当DF=0时,(SI)和(DI)增量。当DF=1时,(SI)和(DI)减量。3.串搜索指令SCAS语句格式:①SCASB——字节串搜索②SCASW——字串搜索功能:AL(字节)或AX(字)中的内容与DI所指的目的串中的一个字节(或字)存储单元中的数据相减,根据相减结果设置标志位,结果不保存,即:①字节操作:(AL)-([DI]),字操作:(AX)-([DI])。②修改指针使之指向串中的下一个元素。当DF=0时,(DI)增量。当DF=1时,(DI)减量。4.从源串中取数指令LODS语句格式:①LODSB——从字节串中取数②LODSW——从字串中取数功能:将SI所指的源串中的一个字节(或字)存储单元中的数据取出来送入AL(或AX)中。即:①字节操作:([SI])→AL,字操作:([SI])→AX。②修改指针SI,使它指向串中的下一个元素。当DF=0时,(SI)增量。当DF=1时,(SI)减量。5.往目的串中存数指令STOS语句格式:①STOSB——往字节串中存数②(2)STOSW——往字串中存数功能:将AL或AX中的数据送入DI所指的目的串中的字节(或字)存储单元中。即:①字节操作:(AL)→[DI],字操作:(AX)→[DI]。②修改指针DI,使之指向串中的下一个元素。当DF=0时,(DI)增量)。当DF=1时,(DI)减量。6.重复前缀指令REPREPZREPNZ(1)REPREP前缀用在MOVS、STOS、LODS指令前。功能:每执行一次串指令(CX)-1,直到(CX)=0,重复执行结束。(2)REPZ该指令一般用在CMP、SCAS指令前。功能:每执行一次串指令(CX)-1,并判断ZF标志是否为0,只要(CX)=0或ZF=0,则重复执行结束。(3)REPNZ该指令一般用在CMPS、SCAS指令前。功能:每执行一次串指令(CX)-1,并判断ZF标志是否为0,只要(CX)=0或ZF=1,则重复执行结束。2.6控制转移类指令2.6.1条件转移指令2.6.2无条件转移指令2.6.3循环指令

2.6.4子程序调用指令2.6.5中断指令返回本章首页2.6.1条件转移指令1.简单条件转移指令2.无符号数条件转移指令3.有符号数条件转移指令它们都有通用的语句格式和功能。语句格式:[标号:]操作符短标号功能:如果条件满足,则(IP)+位移量→IP。1.简单条件转移指令

2.无符号数条件转移指令表2.2无符号数条件转移指令【例2.53】比较无符号数大小,将较大的数存放AX寄存器。CMP AX,BX;(AX)-(BX)JNB NEXT ;若AX>=BX,转移到NEXTXCHG AX,BX;若AX<BX,交换NEXT:…3.有符号数条件转移指令表2.3有符号数条件转移指令【例2.54】比较有符号数大小,将较大的数存放在AX寄存器。CMP AX,BX ;(AX)-(BX)JNL NEXT ;若AX>=BX,转移到NEXTXCHG AX,BX ;若AX<BX,交换NEXT:…返回本节2.6.2无条件转移指令表2.4无条件转移指令的语句格式及功能返回本节2.6.3循环指令1.循环指令LOOP2.相等/为零循环指令LOOPE3.不相等/不为零循环指令LOOPNE4.CX为零转移指令JCXZ1.循环指令LOOP语句格式:LOOP短标号功能:(CX)-1≠0,则程序转移(循环);否则,顺序执行。说明:使用LOOP指令可代替两条指令:DECCXJNE短标号2.相等/为零循环指令LOOPE语句格式:①LOOPE短标号②LOOPZ短标号功能:(CX)-1≠0且ZF=1,则程序转移(循环);否则,顺序执行。3.不相等/不为零循环指令LOOPNE语句格式:①LOOPNE短标号②LOOPNZ短标号功能:(CX)-1≠0,则程序转移(循环);否则,顺序执行。4.CX为零转移指令JCXZ语句格式:JCXZ短标号功能:(CX)-1≠0,则程序转移(循环);否则,顺序执行。返回本节2.6.4子程序调用指令1.子程序调用指令CALL(1)段内直接调用(2)段间直接调用(3)段内间接调用(4)段间间接调用2.返回指令RET(1)语句格式:RET(2)语句格式:RETn(n为偶数)返回本节2.6.5中断指令1.中断调用指令INT语句格式:INTn功能:①(FLAGS)→↓(SP),0→IF、TF。②(CS)→↓(SP),(4*n+2)→CS。③(IP)→↓(SP),(4*n)→IP。2.中断返回指令IRET语句格式:IRET功能:①↑(SP)→IP②↑(SP)

→CS③↑(SP)

→FLAGS返回本节2.7处理机控制类指令2.7.1标志位设置指令2.7.2CPU状态控制指令返回本章首页2.7.1标志位设置指令1.进位标志操作指令2.方向标志操作指令3.中断标志操作指令返回本节3.1宏汇编语言格式3.1.1指令语句格式3.1.2伪指令语句格式返回本章首页3.1.1指令语句格式指令语句的一般格式如下:[标号:]指令助记符操作数;注释1.标号:标号是机器指令语句存放地址的符号表示,代表该指令目标代码的第一个字节地址,后面必须紧跟冒号“:”

。2.指令助记符:指令助记符为语句的核心成分,表示了该语句的操作类型。

3.操作数:操作数表示指令助记符的操作对象。

4.注释:注释均以分号开始,它可占一行或多行,一般放在一条语句的后面。

返回本节3.1.2伪指令语句格式伪指令语句格式如下:[符号名]伪指令符操作数;注释1.符号名:符号名是伪指令语句的一个可选项。

2.伪指令符:伪指令符指定汇编程序要完成的具体操作,如数据定义伪指令DB、DW、DD,段定义伪指令SEGMENT,假定伪指令ASSUME等。

3.操作数:伪指令后面的操作数可以是常数、字符串、变量、表达式等,其个数由具体的伪指令决定,各个操作数之间必须以“逗号”分隔。4.注释:伪指令的注释必须以“;”开始,其作用同指令语句中的注释部分。

返回本节3.2汇编语句表达式3.2.1常量3.2.2变量3.2.3标号3.2.4表达式与运算符3.2.5运算符的优先级返回本章首页3.2.1常量1.数值常量2.字符串常量1.数值常量表3.1各种形式数字常量格式对照表2.字符串常量字符串常量是用单引号或双引号引起来的一个或多个字符。字符串常量是以各字符的ASCⅡ码表示的。如‘A’用41H表示,字符串‘A1B2’用41H,31H,42H,32H表示。返回本节3.2.2变量1.变量2.变量的定义(1)段属性(2)偏移地址属性(3)类型属性1.变量表达式项是给变量或指定存储单元赋予初值,它有以下几种形式:(1)数值表达式(2)字符串表达式(3)地址表达式(只适用DW和DD两个伪指令)(4)?表达式(5)带DUP的表达式2.变量的定义数据定义伪指令可以为一个或连续的存储单元设置数值初值。【例3.1】为数据段分配存储单元。DATA SEGMENTA DB 11H,12H,13HB DW 1122H,3344HC DD 12345678HDATA ENDS上述变量的存储单元分配及初始化情况如下图3.1所示。(1)数值表达式图3.1数据段中数据存储分配图字符串表达式中的字符串必须用引号引起来。DB、DW、DD伪指令将字符串中的各字符均以ASCⅡ码形式存放在相应的存储单元,但表示形式各不相同。【例3.2】为字符串分配存储单元。DATA SEGMENTSTR1 DB ‘1234’STR2 DW ‘AB’,‘CD’,‘A’STR3 DD ‘AB’DATA ENDS其存储单元分配如下图3.2所示。(2)字符串表达式图3.2数据段存储分配图(3)地址表达式(只适用DW和DD两个伪指令)如果该地址表达式为一变量(或标号)名,用DW伪指令则是取它的偏移地址来初始化变量,用DD伪指令则是取它的段首址和偏移地址来初始化变量。例如:

BUF1 DW ABUF2 DD B在表达式中使用重复数据操作符DUP,可以为连续的存储单元提供重复数据,其格式为:

NDUP(表达式)其中N为重复因子,只能取正整数,表示定义了N个重复数据存储单元,其类型由它前面的数据定义伪指令确定,而每个数据存储单元中的初值由DUP后面圆括号中的表达式给定。例如:BUFDB100DUP(0)以上语句定义了以BUF为首址,大小为100个字节,初值为0的数据存储单元。(5)带DUP的表达式返回本节3.2.3标号标号是一条指令语句的符号地址。在汇编源程序中,只有在需要转向一条指令语句时,才为该指令语句设置标号,以便在转移类指令(含子程序调用指令)中直接引用这个标号。因此,标号可作为转移类指令的操作数,即转移地址。【例3.3】符号地址表示。

┆NEXT:MOV AL,[SI] ;带标号NEXT的指令

┆DECCXJNENEXT ;标号NEXT作转移指令的操作数1.段属性2.偏移地址属性3.类型属性标号也具有三种属性返回本节3.2.4表达式与运算符1.算术运算符2.逻辑运算符3.关系运算符4.属性运算符5.数值返回运算符算术运算符包括:+(加)、-(减)、*(乘)、/(除)、MOD(求模)、SHL(左移)、SHR(右移)几种,它既可以用于数值表达式又可用于地址表达式。1.算术运算符 ┆NUM1 EQU 25*4–50 ;NUM1=50NUM2 EQU NUM1/7 ;NUM2=7NUM3 DB NUM1MOD7 ;NUM3=1VAR1 DB 1,2,3,4,5VAR2 DB ‘12345’NUM4 EQU VAR2-VAR1 ;NUM4=5NUM5 EQU 0FH ┆ MOV AL,NUM5SHL4 ;(AL)=11110000B MOV BL,NUM5SHR4 ;(BL)=00000000B【例3.4】用算术运算符进行数值表达式运算。逻辑运算符包括:逻辑乘(AND)、逻辑加(OR)、按位加(XOR)、逻辑非(NOT)四种运算。由于逻辑运算是按位操作,且在汇编过程中完成,因而运算的结果仍为整数常量。【例3.5】用逻辑运算符进行运算。MOV AL,34HAND0FH ;04H→ALMOV BL,05HOR30H ;35H→BLMOV CX,NOT00FFH ;0FF00H→CXMOV DX,789AHXOR000FH ;7895H→DX2.逻辑运算符关系运算符包括:相等(EQ),不等(NE),小于(LT),大于(GT),小于等于(LE)及大于等于(GE)。【例3.6】用关系运算符进行数值表达式运算。NUM1 DB 10LT5 ;NUM1=0NUM2 DB 0AAAAHGT7FFFH ;NUM2=0FFFFH MOV AX,‘A‘EQ41H ;0FFFFH→AX MOV BX,NUM2LTNUM1 ;0→BX3.关系运算符(1)PTR运算符格式:类型PTR地址表达式②PTR与EQU连用,可定义与PTR右边地址表达式类型不同的新变量名或新标号,但不另分配存储单元。4.属性运算符(1)SEG运算符(2)OFFSET运算符(3)TYPE运算符(4)LENGTH运算符(5)SIZE运算符(6)字节分离运算符5.数值返回运算符(1)SEG运算符格式:SEG变量或标号功能:分离出其后变量或标号所在段的段首址。例如:MOV AX,SEG ARRMOV DS,AX(2)OFFSET运算符格式:OFFSET变量或标号功能:分离出其后变量或标号的偏移地址。例如:

MOVBX,OFFSETBUF(3)TYPE运算符格式:TYPE变量或标号功能:分离出其后变量或标号的类型。如果是变量,将返回该变量的类型对应字节数;如果是标号,则返回代表标号类型的数值。它们之间的关系见表3.2所示。(4)LENGTH运算符格式:LENGTH变量功能:取出变量所含的数据存储单元个数。【例3.12】取出变量占存储单元个数。DATA SEGMENTA DB ‘ABCDEF’B DW 10 DUP(1,2DUP(2))C DB 3,20 DUP(0)DATA ENDS ┆ MOV AX,LENGTHA ;1→AX MOV BX,LENGTH B ;10→BX MOV CX,LENGTH C ;1→CX ┆(5)SIZE运算符格式:SIZE变量功能:取出变量所含的数据存储区大小。其返回值为:

LENGTH变量*TYPE变量例如:上例中A、B、C三变量:SIZEA=LENGTHA*TYPEA=1SIZEB=LENGTHB*TYPEB=20SIZEC=LENGTHC*TYPEC=1(6)字节分离运算符字节分离运算符包括:HIGH和LOW。格式:HIGH常量或地址表达式LOW常量或地址表达式功能:HIGH用来分离出其后16位常量或地址表达式的偏移量的高字节;LOW用来分离出其后16位常量或地址表达式偏移量的低字节。返回本节3.2.5运算符的优先级表3.3运算符的优先级返回本节3.3伪指令3.3.1数据定义伪指令3.3.2符号定义伪指令3.3.3段定义伪指令SEGMENT/ENDS3.3.4假定伪指令ASSUME3.3.5置汇编地址计数器伪指令ORG3.3.6源程序结束伪指令返回本章首页3.3.1数据定义伪指令常用的数据定义伪指令有DB,DW,DD,DQ,DT。格式:[变量名]数据定义伪指令表达式[,…]功能:定义数据存储区,类型由数据定义伪指令确定,初值由表达式给定。返回本节3.3.2符号定义伪指令1.等价伪指令2.等号伪指令3.定义符号名伪指令1.等价伪指令格式:符号名EQU表达式功能:为常量、表达式及其他各种符号定义一个等价的符号名,但它不申请存储单元。用途:①用符号表示常量、数值表达式,即定义符号常量。使用符号常量可使程序简单明了,增强程序的可读性和通用性。②EQU与属性运算符PTR或THIS联合使用,可以给变量或标号定义新的类型属性并重新命名,但保持其段偏移地址属性不变。③利用EQU可以用一个符号名替代一个复杂的地址表达式和其他一些符号,如指令助记符、变量名、标号、段名、寄存器名、宏定义名等。2.等号伪指令格式:符号名=表达式功能:为常量、表达式及其他各种符号定义一个等价的符号名,并能对所定义的符号多次重复定义,且以最后一次定义的值为准。【例3.17】定义等价符号名。

┆COST=20M =MOVLOST=LOST+10 ;30→LOSTM =ADD ;M=ADD ┆3.定义符号名伪指令3.定义符号名伪指令格式:变量名或标号LABEL类型功能:定义与原有变量类型不同的新变量或为指令语句定义有指定类型的标号。通常与数据定义伪指令连用,其功能类似语句“变量名或标号EQUTHIS类型”。【例3.18】定义新类型的变量。

┆DDBUF LABELDWORDBUF DB 200DUP(0)

A LABEL FARB: LEA DX,BUF ┆返回本节3.3.3段定义伪指令SEGMENT/END1.段名2.定位方式3.类别4.组合方式1.段名段名是为该段起的名字,用来指出汇编程序为该段分配的存储区起始位置。2.定位方式(1)PARA:表示本段必须从能被16整除的地址处开始存放,即段起始地址最低四位必须是0。(2)WORD:表示本段要从一个偶数地址处开始存放,即段起始地址的最低一位必须是0。(3)BYTE:表示本段起始地址可以从任一地址处开始存放。(4)PAGE:表示本段要从能被256整除的地址处开始存放,即起始地址的最低八位必须是0。【例3.19】对连接程序进行连接后存储区各段相对位置分布。DATA1 SEGMENT ‘DATA’CODE SEGMENT ‘CODE’STACK1 SEGMENT ‘STACK’DATA2 SEGMENT ‘DATA’STACK2 SEGMENT ‘STACK’经连接程序连接后,各段的相对位置如下:DATA1 SEGMENT ‘DATA’DATA2 SEGMENT ‘DATA’STACK1 SEGMENT ‘STACK’STACK2 SEGMENT ‘STACK’CODE SEGMENT ‘CODE’3.类别组合方式有六种类型可供选择。(1)“不选择”(2)PUBLIC(3)STACK(4)COMMON(5)MEMORY(6)AT表达式4.组合方式【例3.20】有两个模块,各模块段定义如下:模块1:

┆DATA1 SEGMENTPARAPUBLIC‘DATA1’M1 DB45HDUP(0)DATA1 ENDSDATA2 SEGMENTPARACOMMON‘DATA2’N1 DB102HDUP(0)DATA2 ENDSEND模块2:

┆DATA1 SEGMENTPARAPUBLIC‘DATA1’M2 DB104HDUP(11H)DATA1 ENDSDATA2 SEGMENTPARACOMMON‘DATA2’N2 DB105HDUP(0)DATA2 ENDSDATA3 SEGMENTT1 DB50DUP(20H)DATA3 ENDSEND该段的定位组合方式示意图如图3.3所示。图3.3模块1、模块2连接后段的定位组合方式示意图返回本节3.3.4假定伪指令ASSUME格式:ASSUME段寄存器:段名[,段寄存器:段名]功能:建立段寄存器与段之间的对应关系。该伪指令一般出现在代码段中。【例3.21】用ASSUME伪指令建立代码段、堆栈段与CS和SS的对应关系。DATA1 SEGMENTA DB1,2,3DATA1 ENDSSTACK SEGMENTSTACKDB 200DUP(0)STACK ENDSDATA2 SGEMENTB DB‘123ABCDATA2 ENDSDATA3 SEGMENTC DB?,?,?DATA3 ENDSCODE SEGMENT ASSUME DS:DATA1,ES:DATA2,CS:CODE,SS:STACKSTART: MOV AX,DATA1 MOV DS,AX ;DATA1→DS MOV AX,DATA3 MOV

温馨提示

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

评论

0/150

提交评论