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

下载本文档

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

文档简介

第二章汇编语言程序设计80X86的寻址方式

80X86的指令系统汇编语言程序格式汇编语言程序设计方法一条指令就是完成一种操作命令,它由操作码和操作数构成,用二进制数表示。操作码表示计算机所要执行的操作,操作数表示操作的对象,也就是指令执行操作的过程中所需要的数据或地址。一条指令一定包含这样的信息:是做什么操作?操作数从哪里来?一般说来,操作数可以跟随在指令的操作码之后,称为立即数;也可以存放在CPU内部的存放器中,称为存放器操作数。绝大多数的操作数存放在内存中,称为存储器操作数。指令规定了操作数存放的位置,在执行指令时需要根据这个信息找到需要的操作数。所谓寻址方式,就是寻找操作数的方式或过程,处理器设计了许多方式用来指明操作数的位置。根据操作数可能的存放位置,有各种不同的寻址方式。第一节80X86的寻址方式固定寻址立即数寻址存放器寻址存储器寻址I/O端口寻址与转移地址有关的寻址1、固定寻址是一种特定的单操作数指令,其操作数隐含在操作码中,常常是对某一个固定的存放器进行操作,而这个存放器名又隐含在操作码中。总之,在固定寻址的指令中,操作数是被隐含在指令中的,不需要执行总线周期,执行速度快。例如:CBW;(AL)→(AX)该指令指定的操作数在AL存放器中,其功能是将AL存放器中的符号位扩展到AH中。形成16位的操作数存放在AX中。PUSHAX;源操作数是AX存放器,目的操作数被隐含在存储器的堆栈中,其操作数地址是堆栈栈顶。该指令的功能是将AX存放器的内容压入堆栈。2、立即数寻址这种寻址方式下,操作数就包含在指令中,作为指令的一局部,它与操作码一起存放在代码段中。它的特点是执行速度快,主要用来给存放器赋值。立即数可以是8位的或16位的。立即数寻址只能用于源操作数的寻址,而不能用于目的操作数的寻址。因为操作数是直接从指令中取得,不需要执行总线周期,执行速度非常快。例如:MOVAL,02H;将一个8位立即数送AL存放器。指令执行完后,〔AL〕=02H。MOVAX,1102H;给AX存放器赋值MOVBX,0A123H;将一个16位立即数送BX存放器。指令执行完后,〔BX〕=0A123H。

MOVBX,0A123H

指令执行后(BX)=0A123HBX:代码段A123OP:存储器例:3、存放器寻址操作数在CPU内部的存放器中,指令指定存放器名,操作数的位数由存放器名决定。这种存放器寻址方式的操作数就在存放器中,不需要访问内存来取得操作数,所以它的执行速度比较快。例如:MOVAX,BX;将BX的内容送AX中。MOV[1234H],BX;将BX内容送地址为1234H的内存单元中。INCCX;CX存放器中的内容加1。4、存储器寻址如果操作数存放在内存储器中,那么指令中需要给出操作数的地址信息。用存储器寻址的指令,其操作数一定在数据段、附加段、堆栈段的主存储器中,指令中一定包含有存储器单元的地址或产生存储器单元地址的信息。执行这类指令时,CPU首先根据指令提供的地址信息计算出偏移地址,用地址产生器产生能直接访问内存单元的物理地址,从内存中取得操作数,再执行指令规定的操作。双操作数指令的两个操作数中,只能有一个使用存储器寻址方式。80X86允许使用段跨域前缀来改变系统所指定的默认段,如允许数据存放在除DS段以外的其他段,此时程序中应使用段跨越前缀。但是在下面三种情况下,不允许使用段跨越前缀。〔1〕串处理指令的目的串必须用ES段。〔2〕PUSH指令的目的操作数和POP指令的源操作数必须使用SS段。〔3〕指令必须放在CS段中。直接寻址方式存放器间接寻址方式存放器相对寻址方式基址变址寻址方式相对基址变址寻址方式比例变址寻址方式4、存储器寻址操作数的偏移地址直接由指令给出〔就包含在指令中〕,其默认段在数据段。也就是说,通常用DS存放器的内容作段基址,也可以通过段跨越前缀来取得其他段中的操作数。直接寻址方式适合处理单个变量。⑴直接寻址方式例如:MOVAL,[2000H];将DS段中偏移地址为2000H的字节单元内容送存放器AL中.MOVAX,ES:[2000H];将附加段中偏移地址为2000H的字单元内容送存放器AX中.MOVAX,[1122H];

设(DS)=3000H存储器中操作码后面是操作数的偏移地址.物理地址=3000H*16+1122H=31122H,该内存单元的内容送AX存放器.执行指令后,(AX)=3456H例:操作数的偏移地址存放在指令指定的存放器中,存放器作为指针指向内存单元,这样的存放器称为间址存放器。操作数在存储器中。16位系统中,间址存放器可以是基址存放器BX、BP或变址存放器SI、DI。存放器间接寻址方式下,指令会根据所使用的间址存放器指定默认的段。存放器间接寻址方式主要用来处理一维数组或表格,只要改变间址存放器的内容,用一条存放器间接寻址指令就可以对连续的内存单元的内容进行访问。⑵存放器间接寻址方式〔1〕如果指令指定BX、SI、DI存放器为间址存放器,那么操作数默认在数据段中,用DS存放器作段基地址,操作数的物理地址是DS存放器的内容左移4位加上间址存放器的内容。例如:MOVAX,[BX];数据段中一个字送AXMOVAX,ES:[DI];附加段中一个字送AX〔2〕如果指令指定BP存放器为间址存放器,那么操作数默认在堆栈段中,用SS存放器内容作段首地址,操作数的物理地址是SS存放器的内容左移4位加上间址存放器BP的内容。例如:MOVAX,[BP];堆栈段中一个字送AXMOVAX,DS:[BP];数据段中一个字送AX例:MOVAX,[BX];

设(DS)=2000H,(BX)=1234H物理地址=20000H+1234H=21234H指令执行后(AX)=5678H操作数的偏移地址是间址存放器的内容加上位移量,位移量是地址的一局部。位移量是一个带符号的整数。通常可以将数组或表格的首地址设置成位移量,利用修改基址存放器或变址存放器的内容来取得数组或表格中的值。⑶存放器相对寻址方式例如:MOVAX,1000H[BX]MOVAX,ES:10H[SI]MOVAX,TABLE[SI];位移量TABLE是表的首地址,间址存放器SI的内容加上位移量就是要访问的表中的某一数据.MOVAX,COUNT[BX]

(DS)=3000H,(BX)=1234H,COUNT=1000H

物理地址=30000H+1234H+1000H=32234H

指令执行后

(AX)=5678H例:操作数的偏移地址一局部在基址存放器,一局部在变址存放器,基址存放器的内容与变址存放器的内容之和就是操作数的偏移地址。对于16位系统,假设用BX作基址存放器,操作数隐含在数据段中,DS存放器的内容是操作数的段首地址;假设用BP作基址存放器,操作数隐含在堆栈段中,SS存放器的内容是操作数的段首地址。⑷基址变址寻址方式存放在基址存放器〔BX或BP〕中的内容是基地址,它通常用来指向数据段中数组或字符串的首地址;而存放在变址存放器〔SI或DI〕中的内容是变址,它通常用来访问数组中的某个元素或字符串中的某个字符。这种寻址方式适合于数组的处理,通常用基址存放器保存数组的起始地址,而用变址存放器指示数组中元素的相对位置。这种基址加变址的寻址方式也可以用来处理数组或表格,改变基址、变址存放器的内容,就可以用来处理二维数组。例如:MOVAX,[BX][SI];假设〔DS〕=3000H,〔BX〕=0158H,〔SI〕=10A4H,那么偏移地址为0158H+10A4H=11FCH,物理地址为30000H+11FCH=311FCH。指令执行后,将311FCH和311FDH相邻两个单元的内容送AX存放器,其中,高地址单元内容送AH,低地址单元内容送AL。MOVAX,ES:[BX][SI];BX和SI存放器的内容之和就是操作数的偏移地址,它在附加段中,它的段首地址就是ES存放器的内容。MOVAX,[BX][SI](DS)=2100H,(SI)=1234H,(BX)=1100H

物理地址=21000H+1234H+1100H=23334H

指令执行后

(AX)=5678H例:带位移量的基址变址寻址称为相对的基址变址寻址方式。关于操作数所在段的隐含规定,与上述基址变址寻址方式一样,也是由基址存放器决定选择哪个段存放器。相对基址变址寻址方式下的偏移地址的计算方法是:16位偏移地址=基址存放器的内容+变址存放器的内容+8位或16位的位移量其中,基址存放器可以是BX或BP;变址存放器可以是SI或DI。位移量可以是8位或16位的带符号数。⑸相对基址变址寻址方式这种寻址方式为访问堆栈段中的数组带来方便,如果用基址存放器BP存放堆栈顶的地址,用位移量表示栈顶到数组第一个元素的距离,那么可以用变址存放器来访问数组中的每一个元素。这种寻址方式也可以用于二维数组的寻址。例如:MOVAX,100H[BX][SI];BX和SI存放器的内容之和加上位移量就是操作数的偏移地址,操作数在数据段中。MOVAX,ES:100H[BX][SI];该指令的操作数的偏移地址与上例相同,但它在附加段中。MOVAX,100H[BP][SI];这是16位寻址,基址存放器BP与变址存放器SI的内容之和,加上位移量100H,就是操作数的偏移地址,操作数隐含在堆栈段中。将堆栈段中的偏移地址为BP+SI+100H的一个字数据送AX中。比例变址寻址方式只能在32位及以后的系统中使用。操作数的有效地址是变址存放器的内容乘以指令中指定的比例因子再加上位移量。例如:MOVAX,[EBX+4*EDI+20H];这是32位寻址,指令执行的结果是将数据段中偏移地址为(EBX)+4*(EDI)+20H的内存单元的一个字数据送AX存放器中.⑹比例变址寻址方式5、I/O端口寻址⑴直接端口寻址——指令中包含I/O端口的直接地址(8位端口),直接端口寻址的端口数是256个。INAL,80H;将80H端口的字节数据〔8位〕输入到AL存放器中。INAX,80H;将80H端口的字数据〔16位〕输入到AX存放器中。OUT80H,AL;将AL存放器的内容输出到80H端口〔写数据〕,这时80H端口宽度〔数据位〕是8位的。OUT80H,AX;将AX存放器的内容输出到80H端口〔写数据〕,这时80H端口宽度〔数据位〕是16位的。直接端口地址也可以用符号表示。OUTPORT,AX⑵间接端口寻址——用DX存放器间接访问端口(16位端口),如果端口地址≥256〔16位地址〕可寻址65536个端口,就必须用间接端口寻址了。先把端口号〔0000H~FFFFH〕存放入DX存放器中并间接访问该端口,用于间接寻址端口的存放器只能使用DX存放器。MOVDX,200H;将端口号200H存入DX中OUTDX,AL;将(AL)输出到〔DX〕所指的端口中MOVDX,200H;将端口号200H存入DX中INAX,DX;将〔DX〕所指的端口输入一个字到AX存放器中6、与转移地址有关的寻址转移指令用来改变程序的正常执行顺序,指令中提供了转移地址的段地址和偏移地址。段内转移和段间转移都可以使用直接寻址和间接寻址。⑴段内直接寻址。JMPLABEL⑵段内间接寻址。JMPBX;JMPWORDPTR[BP]⑶段间直接寻址。JMPFARPTRLABEL⑷段间间接寻址。JMPDWORDPTR[SI]求下面两条转移指令的转移地址A1和A2分别是多少?(1)3000:0110

EBF7JMPA1(2)3000:0110

EB09JMPA2(1)A1的地址=0112

+-9(F7)0109H下一条指令的IP=0110+2=0112(2)A2的地址=0112

+9

011BH例:

段内直接寻址转向的有效地址=当前(IP)+位移量(8位/16位)JMPSHORTLMOVAX,0MOVBX,0MOVAX,0L:RET反汇编后:转移指令转向的偏移地址是0007H+09H=0010H。JMPSHORTL;短转移(-128∽+127)JMPNEARPTRL;近转移(-32768∽+32767)当它用于条件转移指令时,只允许8位的位移量。L:MOVAX,0MOVBX,0MOVAX,0JOLRET例:注意:位移量是负数,F5是补码。所以,转向的偏移地址=0010H+FFF5H=0005H。反汇编后:段内间接寻址例:设〔DS〕=2000H,〔BX〕=1256H,〔SI〕=528FH,位移量VAL=20A1H,〔232F7〕=3280H,〔264E5H〕=2450H。那么JMPBX;执行该指令后,〔IP〕=1256HJMPWORDPTR[BX][SI];指令执行后,〔IP〕=〔20000H+1256H+528FH〕=〔264E5H〕=2450HJMPWORDPTR[BX+VAL];指令执行后,〔IP〕=〔20000H+1256H+20A1H〕=〔232F7H〕=3280Hcode1segment

┊jmpfarptrnext

┊code1endscode2segment┊next:……

┊code2ends

段间直接寻址用指令中提供的转向的段地址和偏移地址取代CS和IP例:段间间接转移指令格式:JMPDWORDPTR[SI]JMPDWORDPTR[TABLE+BX]JMPDWORDPTR[ADDR]其中,[SI]与[TABLE+BX]说明数据寻址方式为存储器寻址方式;DWORDPTR为双字操作符,说明转移地址需取双字为段间转移地址。其中高字是段地址,装入CS存放器;低字是偏移地址,装入IP存放器。第二节80X86的指令系统

数据传送类指令地址传送类指令算术运算类指令逻辑运算类指令串操作类指令控制转移类指令处理器控制类指令

请重点关注:指令的汇编格式指令的根本功能指令支持的寻址方式指令的执行对标志位的影响指令的特殊要求1、数据传送类指令数据传送指令数据交换指令堆栈操作指令标志存放器操作指令输入/输出指令换码指令⑴数据传送指令指令格式:MOVDST,SRCMOVCL,40HMOVCX,AXMOVDS,AXMOVBH,[200H]MOVBX,[200H]MOVEAX,10H[EBX+ESI]数据传送指令不影响标志位

注意:〔1〕目的操作数与源操作数的类型必须一致。〔2〕不允许立即数作为目的操作数。〔3〕不允许在两个主存单元之间直接传送。〔4〕不允许在两个段存放器之间直接传送。〔5〕不能将立即数送段存放器。〔6〕不允许用CS和IP存放器作为目的操作数。⑵数据交换指令指令格式:XCHGOPR1,OPR2XCHGAX,BXXCHGBX,[SI]例〔BX〕=1230H,〔SI〕=0046H,〔DS〕=2000H,〔20046H〕=1234HXCHGESI,EDI数据交换指令不影响标志位⑶堆栈操作指令指令格式:

PUSHSRC;POPDSTPUSHAXPUSHDWORDPTR[BX]PUSHDSPOPBXPOPES堆栈指令不影响标志位PUSHAX;AX=1122H2211AHAL(1)(SP)-2→(SP)(2)AX→((SP))SP→11低地址高地址22例:〔1〕MOVAX,AXCHGAX,BMOVB,AX例:交换存储单元A与B中的内容.设:A与B已定义为字.〔2〕MOVAX,AMOVBX,BMOVA,BXMOVB,AX〔3〕PUSHAPUSHBPOPAPOPB⑷标志存放器操作指令①LAHF;标志存放器的低8位送入AH存放器②SAHF;AH的内容送入标志存放器的低8位③PUSHF;将16位标志存放器内容压入堆栈④POPF;将堆栈顶一个字弹出送入标志存放器⑤PUSHFD;将32位标志存放器压入堆栈⑥POPFD;将32位标志存放器出栈⑦标志位操作指令CLC;(Clearcarry)进位标志清零CMC;(Complementcarry)进位标志取反STC;(Setcarry)进位标志置1CLD;(Cleardirection)方向标志清零STD;(Setdirection)方向标志置1CLI;(Clearinterrupt)禁止可屏蔽中断STI;(Setinterrupt)开放可屏蔽中断⑸输入/输出指令①直接端口寻址:INAX,80H;从指定端口读一个字数据到AX.OUT2FH,AL;把AL内容送往指定端口.②间接端口寻址MOVDX,2F0H;将16位端口地址送DX.INAL,DX;从指定端口读一个字节数据到AL.⑹换码指令指令格式:XLAT;执行的操作:(AL)←((DS)×16+(BX)+(AL))这是一种固定寻址。它可以将AL存放器中设定的一个字节数据转换为存放内存的一张连续表格中的另一个相应的代码,以实现两种编码的转换,它是以查表的方式完成代码转换的。使用这条指令之前,必须先建立一张字节表格,其最大容量为256字节,表格的首地址由BX存放器指向,相对于表格首地址的位移量存放在AL存放器中。也就是说,AL存放器中存放着待查的码,用它表示表中某一项与表首地址的距离,表格的内容就是需要转换的代码,该指令执行后,AL存放器中得到转换后的代码。表格TAB中存放着数字0∽9对应的ASCⅡ码表.将表格中位移量为3的代码取到AL中。30H31H32H33H34HTABMOVBX,OFFSETTABMOVAL,3XLATAL例:2、地址传送类指令偏移地址送存放器指令逻辑地址送存放器和段存放器指令⑴偏移地址送存放器指令指令格式:LEAREG,MEM;目的操作数不能是段存放器,源操作数是存储器操作数.例如:①LEABX,[BX+SI+0F62H]例〔BX〕=0400H+003CH+0F62H=139EH与MOVBX,OFFSET[BX+SI+0F62H]指令等价②LEADX,[BX]③LEADX,TAB;传送地址注:MOVDX,TAB;传送该地址中的内容TAB=001200100011001300140015281102FFLEASI,TAB;执行后:(SI)=0012HMOVSI,TAB;执行后:(SI)=1128HLEA指令与MOV指令的区别:⑵逻辑地址送存放器和

段存放器指令①32位指针送16位存放器和段存放器DS指令格式:LDSREG16,MEM例如:LDSDI,[BX]LDSSI,[1010H]②32位指针送16位存放器和段存放器ES指令格式:LESREG16,MEM例如:LESDI,[BX]LESSI,[1010H]LDS或LES指令将源操作数指定的4个连续字节单元内容分别送指令指定的存放器和DS或ES中.其中:低16位送存放器,高16位送DS或ES中。22H11H44H33H(DS)=C000H,(C2000H)=1122H,(C2002H)=3344HC000:2000HC000:2001HC000:2002HC000:2003H11223344SIDS执行指令:LDSSI,[2000H]例:3、算术运算类指令

加法类指令

减法类指令

乘法指令

除法指令

十进制调整指令1.加法类指令〔1〕加法指令ADD〔2〕带进位的加法指令ADC〔3〕加1指令INC⑴加法类指令ADDDX,0F0FH;

ADCAX,[BX];

ADCAX,BX;

INCSI;

INCWORDPTR[SI]ADD和ADC指令会影响CF,ZF,SF,AF,OF和PF标志位INC指令会影响OF,SF,ZF,AF和PF标志,但不影响进位标志CF.例:ADDDX,0F0F0H;(DX)=4652H4652H0100011001010010

+F0F0

+111100001111000000110111010000101(DX)=3742H,ZF=0,SF=0,CF=1,OF=0例:ADCAX,CX;(AX)=0F365H,(CX)=0E024H,CF=1F365E024

+1D38A1(AX)=0D38AHSF=1,ZF=0,CF=1,OF=0OF表示带符号数是否溢出。带符号数发生溢出,表示运算结果出错。这可以通过双进位判别法来判断:如果用表示符号位的进位,用表示数值局部最高位向符号位的进位,那么它们相异或的结果表示溢出标志的状态。即,那么,表示无溢出;,那么,表示运算结果溢出。2.减法类指令〔1〕减法指令SUB〔2〕带借位的减法指令SBB〔3〕减1指令DEC〔4〕求补指令NEC〔5〕比较指令CMP⑵减法类指令SUBDX,0F0FHSBBAX,[BX]DECSIDECWORDPTR[SI]NEGBXCMPBL,50SUB,SBB和CMP,NEG指令会影响CF,ZF,SF,AF,OF和

PF标志位.DEC指令会影响OF,SF,ZF,AF和PF标志不影响CF标志减法运算MOVAX,5678H;〔AX〕=5678HSUBAX,1234H;〔AX〕=4444H,OF=0,SF=0,ZF=0,CF=0MOVBX,0354H;〔BX〕=0354HSUBBX,3340H;〔BX〕=D014H,OF=0,SF=1,ZF=0,CF=1MOVCX,4336HSUBCX,0136H;(CX)=4200H,OF=0,SF=0,ZF=0,CF=0MOVDL,41HSUBDL,5AH;〔DL〕=0E7H,OF=0,SF=1,ZF=0,CF=1例:求补运算。〔1〕MOVAL,64HNEGAL;〔AL〕=9CH,OF=0,SF=1,ZF=0,CF=1〔2〕MOVBX,0FFFFHNEGBX;〔BX〕=0001H,OF=0,SF=0,ZF=0,CF=1〔3〕MOVCX,0000HNEGCX;〔CX〕=0000H,OF=0,SF=0,ZF=1,CF=0〔5〕比较指令CMP指令格式:CMPOPR1,OPR2指令执行的操作:〔OPR1〕-〔OPR2〕;该指令与SUB指令一样,CMP指令也是执行两操作数相减,但它并不保存结果,只是根据两操作数相减后的结果影响标志位OF、SF、ZF、PF和CF的状态,根据受影响的标志位状态就可以判断两个操作数比较的结果。CMP指令后往往跟着一条条件转移指令,根据比较结果产生不同的程序分支。这是分支程序设计常用的一种方法。⑶乘法指令①无符号数乘法:MULSRC②带符号数乘法:IMULSRC;字节乘:(AX)←(AL)*(SRC);字乘:(DX,AX)←(AX)*(SRC);32位乘:(EDX,EAX)←(EAX)*(SRC);乘法指令只对CF和OF标志位有影响,对SF,ZF,AF,PF标志位的状态不确定

执行乘法指令后,对CF和OF标志位的影响如下。对于无符号数乘法MUL指令,如果乘积的高一半为0,即字节操作时的〔AH〕=0或字操作时的〔DX〕=0,或32位操作时的〔EDX〕=0,那么CF和OF均为0;如果乘积的高一半不为0,那么CF和OF均为1。这样,可以用CF和OF标志位的状态来检查字节相乘的结果是字节还是字,或者可以检查字相乘的结果是字还是双字。对于有符号乘法IMUL指令,如果乘积的高一半是低一半的符号扩展,那么CF和OF均为0,;否那么CF和OF均为1。⑷除法指令①无符号数除法:DIVSRC②带符号数除法:IDIVSRC

字节操作:

(AL)←(AX)/(SRC)的商;(AH)←(AX)/(SRC)余数

字操作:(AX)←(DX,AX)/(SRC)的商;(DX)←(DX,AX)/(SRC)的余数

双字操作:

(EAX)←(EDX,EAX)/(SRC)的商;

(EDX)←(EDX,EAX)/(SRC)的余数执行除法指令后,所有状态标志位OF、SF、ZF、AF、PF、CF的状态均不确定。如果被除数远大于除数时,其商超出了它可以表达的范围,就是溢出。例如,除数为0的溢出,或字节操作时商超出了AL〔8位〕可以表达的范围,或字操作时商超出了AX〔16位〕可以表达的范围,或双字操作时超出了32位,都算溢出。使用带符号数除法IDIV指令的字操作时,商的范围是-32768~+32767;字节操作时,商的范围是-128~+127.如果超出了这个范围,系统将其视为除法出错〔溢出〕,系统直接调用0号中断〔异常〕去处理,并终止程序的运行。而不是用溢出标志OF来表示除法溢出。除法指令执行前,常常要进行位的扩展或符号扩展,可以防止这种溢出。⑸位扩展指令①CBW;字节扩展为字。将AL存放器中的符号位〔最高位〕扩展到AH存放器中。常用于8位的带符号数除法指令。②CWD;字扩展为双字。将AX存放器中的符号位〔最高位〕扩展到DX存放器中。常用于16位的带符号数除法指令。③CWDE;字扩展为双字④CDQ;双字扩展为4字⑤MOVSX;符号扩展⑥MOVZX;零位扩展⑹十进制调整指令指令格式说明DAA压缩的BCD码加法调整DAS压缩的BCD码减法调整AAA非压缩的BCD码加法调整AAS非压缩的BCD码减法调整AAM乘法后的BCD码调整AAD除法前的BCD码调整注意:〔1〕80x86指令系统中只允许采用非压缩的十进制数乘法和除法运算。〔2〕用BCD码进行乘除法运算时,只能使用无符号数形式,因而AAM和AAD应固定地出现在MUL指令之后和DIV之前。例:用压缩BCD码作十进制数〔28+68〕运算,结果用压缩BCD码表示。MOVAL,28HMOVBL,68HADDAL,BL;二进制加法DAA;十进制调整那么执行ADD后,AL=90H,AF=1;再执行DAA指令后,正确的结果为AL=96H,CF=0,AF=1。例:用非压缩BCD码作十进制数〔7×9〕运算,结果用非压缩BCD码表示。MOVAL,07H;将十进制数7和9分别用非压缩BCD码表示MOVBL,09HMULBLAAM;乘法后的BCD码调整那么执行MULBL后,AX=003FH,再执行AAM指令后,AX=0603H。相当于十进制运算7×9=63例:设AX=0103H,BL=06H〔分别表示非压缩BCD码13和6〕。AAD;0103H→000DHDIVBL;〔AL〕=02H,〔AH〕=1那么执行上述指令序列后,商〔AL〕=02H,余数〔AH〕=1。实际上,该程序段就是做十进制的13除以6,其中13和6分别用非压缩的BCD码表示为0103H和06H。执行AAD指令,就将AH中的内容乘以10,再加到AL中,得到的结果为〔AX〕=000DH。例:MOVAL,04HMOVCL,08HMULCL;AX=0020HAAM;AX=0302H例:MOVCL,08HMOVAX,0303HAAD;0303H→0021HDIVCL;AX=0104HAX/CL=33/8=4余1逻辑运算指令移位指令4、逻辑运算类指令

⑴逻辑运算指令ORAX,00FFH;低8位置1,高8位不变ANDAX,00FFH;高8位清0,低8位不变XORAL,03H;使D0D1位变反其余位不变TESTAL,80H;测试AL最高位NOTAX;对〔AX〕按位取反对标志位的影响:CF和OF置0,AF标志位不确定,而SF、ZF和PF那么根据运算结果设置。主要功能:AND指令用于对某些位清0,其余位保持不变;OR指令用于对某些位置1,其余位保持不变;XOR指令是某些位取反,其余位保持不变;TEST指令用于测试某些位而不保存结果;NOT指令对操作数按位取反后再回送该操作数。逻辑运算指令主要用于处理操作数的某些位〔如使某些位置1或置0或取反等操作〕,而使其余位保持不变。XOR指令常用于测试某一操作数是否与另一确定的操作数相等。这种操作常用在检查地址是否匹配。TEST指令通常用于检测一些位是否满足特定的条件,但又不希望改变原操作数的情况,这是它与AND指令最大的区别。例:屏蔽AL的第0、1两位

ANDAL,0FCH例:置AL的第5位为1

ORAL,20H

例:使AL的第0、1位变反

XORAL,3例:测试某些位是0是1

TESTAL,1JNZO

AL=

********OR00100000**1*****

AL=

******01XOR00000011

******10

AL=********AND11111100******00AL=

********AND000000010000000*⑵移位指令SHLOPR,CNT;逻辑左移SALOPR,CNT;算术左移SHROPR,CNT;逻辑右移SAROPR,CNT;算术右移ROLOPR,CNT;不带进位循环左移ROROPR,CNT;不带进位循环右移RCLOPR,CNT;带进位循环左移RCROPR,CNT;带进位循环右移逻辑左移SHLOPR,CNT算术左移SALOPR,CNT逻辑右移SHROPR,CNT算术右移SAROPR,CNT

CF0

0CFCF循环左移ROLOPR,CNT循环右移ROROPR,CNT带进位循环左移RCLOPR,CNT带进位循环右移RCROPR,CNTCF

CFCFCF说明:移位指令可以改变操作数中所有位的位置。OPR为存放器或存储器操作数,不能用立即数。移位一次那么移位次数CNT为1,移位次数大于1时,CNT预先保存在CL存放器中。逻辑移位和算术移位指令还常常用来完成一些算术运算左移n位相当于对操作数乘以。右移n位相当于对操作数除以。它们最大的好处是比用乘除法指令快得多。说明:循环移位操作不丧失任何数据。循环移位指令可以用来检查存放器或存储器操作数中含1或0的个数,只要检测CF就可以对1或0计数。对n位数据用小循环移位指令循环n次,数据恢复原状;大循环移位指令循环n+1次,数据也恢复原状。对标志位的影响〔1〕按照操作数移入CF的位设置进位标志CF。算术左右移和逻辑左右移指令根据移位后的结果影响SF、ZF、PF标志,假设移位后操作数为0,那么ZF=1;SHL或SAL以及SAR指令根据结果的最高位设置SF标志位;而SHR指令执行后SF标志清0。AF标志不确定。〔2〕所有循环移位指令对CF和OF以外的状态标志不影响。〔3〕移位次数为1时,OF位才有效,当移位次数大于1时,OF不确定。设(AL)=B9H,(CF)=1,确定以下指令单独执行后AX的状态:SHLAL,1;(AL)=72H,CF=1,OF=1SARAL,1;(AL)=DCH,CF=1,OF=0SHRAL,1;(AL)=5CH,CF=1,OF=1RORAL,1;(AL)=DCH,CF=1,OF=1ROLAL,1;(AL)=73H,CF=1,OF=1RCLAL,1;(AL)=73H,CF=1,OF=1RCRAL,1;(AL)=DCH,CF=1,OF=0SHLAX,2;相当于AX内容乘以4SHLAX,5;相当于AX内容乘以32SARAX,3;相当于AX中带符号数除以8SARAX,8;相当于AX中的带符号数除以256例:将装在(DX,AX)中的32位数据左移1位,也就是将32位无符号数乘以2。SHLAX,1RCLDX,1;将(DX,AX)*2→(DX,AX)大循环移位指令与移位指令联合使用可以实现双精度数或多倍精度数的左右移位。例:将BX中的带符号数除以4,取整,并回送BX中.MOVCL,2;移位次数保存在CL存放器中SAR BX,CL;完成(BX)/4→BX的运算,取整,不保存余数。例:设(AX)=0011H,(BX)=0022H,将BX与AX中的数据合并,使(AX)=1122H.MOVCL,8SHLAX,CLORAX,BX例:将一个字节数据的高4位和低4位交换.MOVAL,56H;AL=56HMOVCL,4ROLAL,CL;AL=65H,CF=1,OF=1例:统计BX中1的个数并存入CH存放器中.用CL存放器作循环计数.MOVCX,0010H;(CH)=00H,(CL)=10HTESTBX,0FFFFH;测试BX是否为0JZEXT;(BX)=0那么退出R1:ROLBX,1;循环左移一位,将BX最高位移入CFJCCOUNT;CF=1那么转移JMPR2COUNT:INCCH;统计BX中1的个数R2:DECCL;CF=0那么循环计数减1JNZR1;重复操作┊EXT:┊例:将数组整体右移一位.ARYDD3DUP(81818181H)MOVESI,0;ESI是数组的偏移量SHRARY[ESI+8],1;将高地址的双字右移一位RCRARY[ESI+4],1;中间的双字循环右移一位RCRARY[ESI],1;低地址的双字循环右移一位例:5、串操作类指令串传送指令〔MoveString〕存串指令〔StoreString〕取串指令〔LoadString〕串比较指令〔CompareString〕串扫描指令〔ScanString〕串输入〔InputString〕串输出(OutputString)重复前缀〔Repeat〕特点:〔1〕可以对字节串、字串进行操作,32位系统还可以对双字串操作。〔2〕源串默认在数据段,用SI存放器间接寻址,而目的串默认在附加段,使用DI存放器间接寻址。〔3〕串操作时地址指针SI和DI将根据方向标志DF自动修改:DF=1时SI和DI减1或2,DF=0时,SI和DI加1或2。〔4〕执行串操作指令中的串传送、存串和取串指令后不影响标志位。而执行串比较和串扫描指令后将不保存结果,而是根据操作结果影响状态标志CF、PF、AF、ZF、SF、OF。

重复前缀REP;〔CX〕←〔CX〕-1,执行其后的串操作,CX=0退出重复操作REPZ;或REPE;ZF=1〔相等〕时重复执行其后的串操作,CX=0或ZF=0时结束串操作REPNZ;或REPNE;ZF=0〔不相等〕时重复执行其后的串操作,CX=0或ZF=1时结束串操作重复前缀不能单独使用,只能用在串操作指令前,以实现串操作的重复执行,CX存放器的内容是默认的重复次数,每执行一次重复操作,(CX)减1,(CX)是剩下还未处理的单元数,(CX)=0那么退出重复操作,说明已经处理完所有的单元.⑴串传送指令MOVSB;MOVSW;MOVSD;MOVSDST,SRC;将源串数据传送到目的串执行:REPMOVSB或REPMOVSW

之前,应先做好:(1)源串首地址(末地址)

→SI(2)目的串首地址(末地址)

→DI(3)串长度→CX(4)建立方向标志

(CLD使DF=0,STD使DF=1)leasi,mess1leadi,mess2movcx,17cldrepmovsb例:〔SI〕〔DI〕数据段附加段〔SI〕〔DI〕DF=0DF=0传送之前传送之后例:数据段中有一个以SRC为首地址的字串长度为800,将其传送到附加段中以DST位首地址的缓冲区中。用串传送指令实现。LEASI,SRC;源串的首地址由SI指向LEADI,DST;目的串的首地址由DI指向MOVBX,800;传送次数送BX存放器CLDL:MOVSW;传送一个字DECBX;完成一个字的传送后,传送次数减1JNZL;判断BX是否为0。不为0,那么继续执行串传送指令;否那么,结束串操作如果使用重复前缀,用一条REPMOVSW指令就可以完成以上800个数据的传送,但这时必须用CX存放器存放串的长度。LEASI,SRC;源串的首地址由SI指向LEADI,DST;目的串的首地址由DI指向MOVCX,800;传送次数必须存放在CX存放器中CLD;设置方向标志DF=0,地址增量,从低地址向高地址传送REPMOVSW;重复执行串传送指令,直到传送完〔CX=0〕退出⑵存串指令STOSB;STOSW;STOSD;STOSDST;将AL或AX或EAX中的数据装入目的串中LEADI,DST;由DI指向目的串的首地址MOVAL,0;初始化ALMOVCX,100;用CX存放传送次数CLD;DF=0,使地址增量L:STOSB;传送一个字节DECCX;传送次数减1JNZL;CX≠0,那么继续;;否那么,结束存串操作┊例:

LEADI,DST;DI指向目的串首地址MOVAL,0;初始化ALMOVCX,100;用CX存放传送次数CLD;DF=0,使地址增量REPSTOSB;将100个字节清零例:

⑶取串指令LODSB;LODSW;LODSD;LODSSRC;将源串中的数据存入AL或AX或EAX中LEASI,SRC;用SI指向字节串SRC首地址LEADI,EVEN;用DI指向存放偶数的缓冲区首地址LEABX,ODD;用BX指向存放奇数的缓冲区MOVCX,100;待处理的串长度存CX中CLD;使DF=0,地址增量G:LODSES:[SI];取一个数TESTAL,01H;测D0位,D0=0为偶数,D0=1为奇数JNZO;为奇数那么转移E:STOSB;把偶数存入以EVEN为首地址的缓冲区JMPAG;无条件转移到AG去执行程序O:XCHGBX,DI;使DI暂时指向存放奇数的缓冲区STOSB;将奇数存放在ODD为首地址的缓冲区中XCHGBX,DI;交换指针的内容AG:DECCX;CX总是保存着未处理数据的个数JNZG;数据未处理完那么继续例:⑷串比较指令CMPSB;CMPSW;CMPSD;CMPSSRC,DST;源串与目的串相减,不回送结果SRCDD20DUP(1234ABCDH);定义双字变量DSTDD20DUP(1234ABCDH);定义双字变量┊CLD;DF=0,向高地址方向比较MOVECX,20;建立REP的计数器LEAESI,SRC;使ESI指针指向源串LEAEDI,DST;使EDI指针指向目的串REPECMPSD;比较双字数据串,直到ECX=0或找到不相同的位置例:⑸串扫描指令SCASB;SCASW;SCASD;SCASDST;将AL或AX或EAX的内容与目的串相减,不回送结果STRDB‘XYZABCD’LEADI,STR;DI指向串STR首地址MOVAL,‘A’;AL中存放要查找的字符MOVCX,CN;存串长度CLDREPNZSCASB;ZF=0且CX≠0重复查找JZFOUND;ZF=1,找到字符A,转移JMPEXT;未找到(ZF=0并且CX=0),那么退出FOUND:┆EXT:┉例:⑹串输入INSDST,DX;INSB;INSW;INSD;将端口数据输入到附加段的目的串中从端口地址03A0H的I/O设备输入100个字节数据,设I/O设备总是准备好传送数据.LEADI,LIST;用DI指向目的串MOVDX,03A0H;端口地址送DXCLD;DI自动加1MOVCX,100;CX装计数值REPINSB;从端口输入数据存入

DI指向的内存单元例:⑺串输出OUTSDX,SRC;OUTSB;OUTSW;OUTSD;将数据段中的源串数据输出到端口将存放在数据段中的100个字节数据ARY传送到端口地址03A2H的I/O设备中.假设I/O设备总是准备好的状态.LEASI,ARY;用SI指向数组MOVDX,03A2H;端口地址送DXCLD;SI自动加1MOVCX,100;CX装计数值REPOUTSB;将SI指向的内存单元数据输出到端口例:6、控制转移类指令无条件转移指令〔JMP〕子程序调用与返回指令(CALL和RET)条件转移指令〔JCC〕循环控制指令〔LOOP〕中断与返回指令〔INT和IRET〕处理器控制类指令⑴无条件转移指令根据转移范围的不同可以分为段内转移和段间转移。根据转移地址的寻址方式的不同可以分为直接转移和间接转移。无条件转移指令不影响标志位。JMPDISP;段内直接转移,位移量DISP可以是

8位、16位或32位JMPBX;段内间接转移,BX内容是段内偏移地址JMPWORDPTR[SI];段内间接转移,SI指向的内存单元中的一个字是段内偏移地址JMPEBX;段内间接转移,EBX内容是偏移地址JMPDWORDPTR[ESI];段内间接转移,ESI指向的内存单元的一个双字是偏移地址JMPFWORDPTR[ADDR];段间间接转移,ADDR中存放一个48位的指针,其中低32位送EIP存放器,高16位送CS存放器.JMPFWORDPTR[EBX];段间间接转移,EBX指向的内存中的48位内容就是转移地址,其中的低32位送EIP存放器,高16位送CS存放器.⑵子程序调用与返回指令根据主程序和子程序是否在同一个代码段内,它们可以分为段内调用、段内返回以及段间调用、段间返回。根据子程序入口地址DST的寻址方式的不同可以分为直接调用和间接调用。子程序调用指令和子程序返回指令均不影响标志位。⑵子程序调用与返回指令CALLDISP16;段内直接调用,16位的位移量CALLDISP32;段内直接调用,32位的位移量CALLDISP48;段间直接调用,48位的逻辑地址CALLMEM16;段内间接调用,16位指针作为偏移地址送IPCALLMEM32;段内间接调用,32位指针是偏移地址送EIPCALLMEM48;段间间接调用,48位指针是逻辑地址CS:EIPCALLREG16;段内间接调用,16位指针作为偏移地址送IPCALLREG32;段内间接调用,32位指针是偏移地址送EIPRET;NEAR或FAR类型的子程序返回RETn;子程序返回,并修改堆栈指针:

SP←SP内容加n,或ESP←ESP内容加n。⑶条件转移指令判断单个标志位状态的转移指令比较无符号数大小的转移指令比较有符号数大小的转移指令判断计数器CX是否为0的转移指令⑶条件转移指令JZ/JE;ZF=1转移JNZ/JNE;ZF=0转移JS;SF=1转移JNS;SF=0转移JO;OF=1转移JNO;OF=0转移JP;PF=1转移JNP;PF=0转移JCXZ;CX=0转移条件转移指令都不影响标志位。利用标志位作为测试条件,不同的条件转移指令有不同的测试条件.无符号数比较〔above高于,below低于,equal等于〕JC/JB/JNZEJNC/JNB/JAEJBE/JNAJNBE/JA带符号数比较〔greater大于,less小于〕JL/JNGEJNL/JGEJLE/JNGJNLE/JGAX中存放一个带符号数,假设AX为正数,使DX清零;假设AX为负数,使DX=FFFFH.TESTAX,8000HJZZEROMOVDX,0FFFFHJMPNEXTZERO:MOVDX,0NEXT:┊例:⑷循环控制指令LOOPOPR;CX←CX-1;CX≠0那么循环LOOPZOPR;CX←CX-1;ZF=1且CX≠0那么循环LOOPNZOPR;CX←CX-1;ZF=0且CX≠0那么循环MOVCX,10;循环次数N:┊;循环体┊LOOPN;计数器减1.CX≠0循环;CX=0退出循环可用DECCX代替LOOPNJNZN⑸中断与返回指令INTn;中断类型码n(00H∽FFH)INTO;溢出标志OF=1启动的中断IRET;从堆栈中恢复程序断点,返回7、处理器控制类指令

⑴状态标志位处理指令CLC(Clearcarry);进位标志CF=0STC(Setcarry);进位标志CF=1CMC(Complementcarry);进位标志求反CLD(Cleardirection);方向标志DF=0STD(Setdirection);方向标志DF=1CLI(Clearinterrupt);中断标志IF=0(关中断)STI(Setinterrupt);中断标志IF=1(开中断)⑵其它处理器控制指令NOP(Nooperation);空操作指令,常用来作延时,或取代其他指令作调试之用.HLT(Halt);停机指令,CPU暂停执行程序,等待硬件中断。ESC(Escape);换码指令,80486以后已成为未定义指令.WAIT(Wait);等待指令,使处理器处于空转状态,也可以用来等待外部中断发生,但中断处理完后仍返回WAIT指令继续等待.LOCK(Lock);封锁指令,作为指令的前缀可位于任何指令的前端,而不是一条独立的指令,凡带有LOCK前缀的指令,在该指令执行过程中都禁止其他协处理器占用总线,故它可称为总线锁定前缀.第三节汇编语言程序格式汇编语言特性伪指令汇编语言源程序举例汇编语言程序的调试〔常用的DEBUG命令〕汇编语言程序的开发步骤:〔1〕用编辑程序建立扩展名为.ASM的源文件。〔2〕用汇编程序〔MASM程序〕把ASM文件转换成目标文件〔OBJ文件〕。〔3〕用连接程序〔LINK程序〕把目标文件转换成可执行文件〔EXE文件〕。〔4〕用DOS命令直接输入文件名就可以执行该程序。〔5〕用调试程序〔如DEBUG调试程序〕对源程序进行调试。1、汇编语言特性1.程序注释:用一个分号开始,可以放在一条指令之后,也可以自成一行,不产生机器码,目的只是增加源程序的可读性。2.保存字:具有特定意义的字,如存放器名,指令助记符,伪指令助记符,运算符,预定义符号。3.标识符:由字母、数字和特殊字符〔如“?、_、@〞等〕组成的字符串。有两类标识符—变量名和标号〔1〕变量名:是一个数据的符号地址,如:VARDB12H〔2〕标号:是指令、过程或段的符号地址。标号和变量都具有如下三种属性。段属性、偏移属性、类型属性。注意:变量和标号是不同的。〔1〕变量是指数据区的名字,而标号是指某条执行指令起始地址的符号表示。〔2〕变量的类型是指数据项存取的单位的字节数,标号是类型是指使用该标号的指令之间的距离是段内〔NEAR型〕或段间〔FAR型〕。4.语句:语句类型和语句格式语句类型〔1〕指令语句:汇编程序把他们翻译成目标码,对应着计算机的一种操作。〔2〕伪指令语句:不产生目标代码,只是完成某种对应的操作〔伪操作〕。语句格式:标示符操作符操作数;注释操作数:常数、存放器、标号、变量、表达式例如:HERE:LEABX,BUF;设置缓冲区指针VARDW1234H;给变量分配一个字单元,并赋值1.运算符:

算术运算符逻辑运算符关系运算符数值返回运算符属性运算符2.运算符的优先级:见P96表2.4例:VARDW1234H〔1〕MOVBX,SEGVAR〔2〕MOVBX,OFFSETVAR〔3〕MOVAL,TYPEVAR汇编结果是:MOVAL,2〔4〕MOVBYTEPTR[BX],8〔5〕MOVWORDPTR[BX],8〔6〕JMPFARPTRNEXT〔7〕MOVAX,ES:[BX+SI]〔8〕MOVAH,HIGH1234H〔9〕MOVAL,LOW1234H首先,CPU指令是给CPU的命令,在程序运行时由CPU执行,每条指令对应CPU的一种特定的操作,例如传送、做加法等;而伪指令是给汇编程序的命令,在汇编过程中由汇编程序进行处理,例如定义数据、分配存储区、定义段以及定义过程等。其次,汇编以后,每条CPU指令会产生一一对应的目标代码;而伪指令那么不产生与之相应的目标代码。二者区别:无论表示形式或其在语句中所处的位置,都与CPU指令相似,因此称伪指令。2、伪指令分为以下几类:〔1〕变量定义伪指令〔2〕相等伪指令〔3〕段定义伪指令〔4〕子程序定义伪指令〔5〕结束伪指令

①变量定义伪指令DB:定义字节变量,每一个表达式占一个字节.DW:定义字变量,每一个表达式占两个字节,低字节在低地址,高字节在高地址。DD:定义双字变量,每一个表达式占四个字节,低字在低地址,高字在高地址。DQ:定义四字变量,每一个表达式占八个字节,低字在低地址,高字在高地址。DT:定义十个字节,每一个表达式占十个字节,低字在低地址,高字在高地址。例:BDATADB10,?,3*2,‘AB’WDATADW100HARRAYDB2DUP〔0,2,?〕〔1〕MOVAL,BDATA+2〔2〕MOVAX,WORDPTRARRAY;〔AX〕=0200H〔3〕MOVBDATA,41H操作数:常数、表达式、字符串、问号“?〞、重复操作符“DUP〞格式:变量名伪指令助记符操作数;注释②

相等伪指令为常量定义一个符号,有两种:等号伪指令格式:名字=表达式COU=1234H;允许重复定义,屡次使用…COU=COU+1EQU伪指令格式:名字EQU表达式〔常数、符号、数值表达式、地址表达式〕COUNTEQU123;不能重新赋值,可屡次使用③

完整的段定义伪指令SEGMENT/ENDS伪指令必须成对使用,共同定义一个逻辑段。如:段名SEGMENT[定位类型][组合类型][‘类别’]┊;汇编语言指令序列段名ENDS〔1〕定位类型。如何确定段的边界,默认值是PARA〔2〕组合类型。如何组合几个不同的段,默认值是NONE〔3〕类别。作用是在连接时决定各逻辑段的装入顺序。必须位于单引号之间,常用的类别有STACK、CODE和DATA等。ASSUME伪指令指定程序中段与段存放器之间的关系。但不为段存放器设定初值。程序中必须用指令给段存放器赋初值。CS存放器例外。如:ASSUMECS:CODE,DS:DATA,...ORG伪指令用来指出源程序或数据块在内存中的起点偏移地址。假设省略ORG,那么从本段起始地址0开始连续存放。如:ORG100HDATASEGMENT;定义数据段BUFDB11H,22H;定义字节数据缓冲区DATAENDS;数据段结束STACKSEGMENT;定义堆栈段STDB50DUP(?);设置堆栈的大小是50字节STACKENDS;堆栈段结束CODESEGMENT;定义代码段ASSUMECS:CODE,DS:DATA,SS:STACKMAINPROCFAR;把主程序定义为子程序START:┊;汇编指令序列MOVAH,4CHINT21H;返回DOSMAINENDP;子程序结束CODEENDS;代码段结束

ENDSTART;程序结束④

简化的段定义伪指令.MODELSMALL;定义程序的存储模式.STACK;建立一个堆栈段.DATA;建立一个数据段┊;在数据段中定义变量.CODE;建立一个代码段.STARTUP;设置程序的起始点┊;可执行指令构成的程序段.EXIT0;程序结束,返回操作系统

END;汇编结束⑤

子程序定义伪指令子程序名PROC[类型];子程序开始┊;汇编语言指令序列

RET;子程序返回到调用处子程序名ENDP;子程序结束子程序名是子程序入口的符号地址;类型属性有NEAR和FAR;如果类型默认,系统默认是NEAR型。子程序是完成一个特定功能的指令序列,用CALL指令调用子程序,RET指令返回到调用处。⑥

处理器选择伪指令.8086选择8086指令系统〔缺省情况〕.286选择80286指令系统.286P选择保护模式下的80286指令系统.386选择80386指令系统.386P选择保护模式下的80386指令系统.486选择80486指令系统.486P选择保护模式下的80486指令系统.586选择Pentium指令系统.586P选择保护模式下Pentium指令系统⑦结束伪指令格式:END[标号︱过程名]作用:表示源程序结束,汇编程序对源程序汇编时,遇到END那么结束汇编。其中,标号表示程序开始执行的起始地址。假设有多个模块相连接,那么只有主模块要使用标号,其它模块只使用END而不必指定标号。3、汇编语言源程序举例

实现从键盘接收十进制数并存入BX中..MODELTINY;建立微型存储模式.CODE;建立一个代码段.STARTUP;设置程序的起始点

MOVBX,0C:MOVAH,1;DOS调用:键盘输入

INT21HSUBAL,30HJLEX;小于0退出CMPAL,9JGEX;大于9退出

CBWXCHGAX,BXMOVCX,10MULCXXCHGAX,BXADDBX,AXJMPCEX:

.EXIT;程序结束,返回操作系统

END;汇编结束4、汇编语言程序的调试

〔常用的DEBUG命令〕DEBUG是常用的汇编语言级调试工具,为汇编语言程序员提供了分析指令、跟踪程序的有效手段。-A汇编 -U反汇编-T单步执行-G断点执行-D数据显示-R存放器-E修改内存-Q退出DEBUG-I端口输入-O端

温馨提示

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

评论

0/150

提交评论