【文档说明】第10章如何发挥主机内存各类寄存器(位)处理器的功能--汇编语言程序设计课件.ppt,共(81)页,522.023 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-44761.html
以下为本文档部分文字说明:
10.1概述10.1.1汇编语言程序设计的一般步骤10.1.2流程图返回本章首页10.1.1汇编语言程序设计的一般步骤汇编语言程序设计一般有以下几个步骤:1.分析问题,确定算法2.绘制流程图3.根据流程图编制程序10.调试程序返回本节10.1.2流程图1.流程图的概念流
程图是由特定的几何图形、指向线、文字说明来表示数据处理的步骤,形象描述逻辑控制结构以及数据流程的示意图。流程图具有简洁、明了、直观的特点。2.流程图符号表示(1)起止框:表示程序的开始和结束。•开始•结束(2)判断框•条件(3)处理框YN(10)指向线10.2顺序程序设计下面举
例说明顺序程序的设计。【例10.1】试编写一程序计算以下表达式的值。w=(v-(x*y+z-5100))/x式中x、y、z、v均为有符号字数据。设x、y、z、v的值存放在字变量X、Y、Z、V中,结果
存放在双字变量W之中,程序的流程图如图10.1所示。•图10.1顺序运算程序流程图DX源程序如下:DATASEGMENTXDW200YDW100ZDW3000VDW10000WDW2DUP(?)DATAENDSSTACKSEGMENTSTACKDB200DUP(0)ST
ACKENDSCODESEGMENTASSUMEDS:DATA,CS:CODE,SS:STACKSTART:MOVAX,DATAMOVDS,AX;DATA→AXMOVAX,XIMULY;(X)*(Y)→DX:AXMOVCX,AXMOVBX,DX;(DX:AX)→(BX:CX
)MOVAX,ZCWD;(Z)符号扩展ADDCX,AXADCBX,DX;(BX:CX)+(DX:AX)→(BX:CX)SUBCX,5100SBBBX,0;(BX:CX)-5100→(BX:CX)MOVAX,VCWD;(V)符
号扩展SUBAX,CXSBBDX,BX;(DX:AX)-(BX:CX)→(DX:AX)IDIVX;(DX:AX)/XMOVW,AX;商→WMOVW+2,DX;余数DX→W+2MOVAH,10C
HINT21HCODEENDS;退出DOS状态ENDSTART【例10.2BX、AL与查表指令】【例10.2】已知某班学生的英语成绩按学号(从1开始)从小到大的顺序排列在TAB表中,要查的学生的学号放在变
量NO中,查表结果放在变量ENGLISH中。编写程序如下:STACKSEGMENTSTACKDB200DUP(0)STACKENDSDATASEGMENTTABDB80,85,86,71,79,96DB83,56,32,66,78。
810NODB10ENGLISTDB?DATAENDSCODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODEBEGIN:MOVAX,DATAMOVDS,AXLEABX,TABMOVAL,NODECALXLATTABMOVENGL
ISH,ALMOVAH,10CHINT21HCODEENDSENDBEGIN10.3分支程序设计(标志寄存器与条件转移指令)返回本章首页测试某一次运算的结果ZF=1JZ/JESF=1JSOF=1JOPF=1JPCF=1JC(JB,JNAE)比较两个无符号数(ASCI
I码)JB=JNAE=JC(借位位)JL=JNGEJNLE=JG测试CX的值,等于0则转移JCXZ10.3分支程序设计(标志寄存器与条件转移指令)10.3.1用条件转移指令实现程序分支10.3.2用跳转表实现多路分支返回本章首页10.3.1用条件转移指令实现程序分
支【例10.3】编写计算下面函数值的程序:1X>0Y=0X=0-1X设输入数据为X、输出数据Y,且皆为字节变量。程序流程图如图10.2所示。程序如下:•图10.2分支运算程序流程图DATASEGMENTXDB-10YDB?DATAENDSSTACKSEG
MENTSTACKDB200DUP(0)STACKENDSCODESEGMENTASSUMEDS:DATA,SS:STACK,CS:CODESTART:MOVAX,DATAMOVDS,AXCMPX,0;与0进行比较JGEA1;X≥0转A1MOVY,-1
;X<0时,-1→YJMPEXITA1:JGA2;X>0转A2MOVY,0;X=0时,0→YJMPEXITA2:MOVY,1;X>0,1→YEXIT:MOVAH,10CHINT21HCODEENDSENDSTART•图1
0.2分支运算程序流程图X<=0>DATASEGMENTXDB-10YDB?DATAENDSSTACKSEGMENTSTACKDB200DUP(0)STACKENDSCODESEGMENTASSUMEDS:DATA,SS:STACK
,CS:CODESTART:MOVAX,DATAMOVDS,AXCMPX,0JLEA1MOVY,1JMPEXITA1:JLA2MOVY,0JMPEXITA2:MOVY,-1EXIT:MOVAH,10CHINT21HCO
DEENDSENDSTART【例10.10】【例10.10】试编一程序,求三个带符号字数据中的最大值,并将最大值存入MAX字单元中。设三个带符号数分别在三个字变量X、Y、Z中存储。程序流程图如图10.3所示图10.3
[例10.10]程序流程图程序如下:STACSEGMENTSTACKDB200DUP(0)STACKENDSDATASEGMENTXDW00ABHYDW–5ZDW200MAXDW?DATAENDSCODESEGMENTASSUMEDS:DATA,SS:S
TACK,CS:CODESTART:MOVAX,DATAMOVDS,AXMOVAX,XCMPAX,Y;X>Y?JGL1MOVAX,Y;Y>Z?CMPAX,ZJGEXITL2:MOVAX,ZJMPEXITL1:CMPAX,Z;X>Z?JLEL2EXI
T:MOVMAX,AXMOVAH,10CHINT21HCODEENDSENDSTART返回本节10.3.2用跳转表实现多路分支(教材177页)【例10.5】设某程序有8路分支,试根据给定的N值(1~8),将程序的执行转移到其中的一路分支。程序流
程如图10.10所示。程序如下:DATASEGMENTTABDWP1,P2,P3,P10,P5,P6,P7,P8NDB5DATAENDSSTACKSEGMENTDB200DUP(0)STACKENDSCODESEGMENTASSUMEDS:DATA
,SS:STACK,CS:CODESTART:MOVAX,DATAMOVDS,AX┆MOVAL,NDECALADDAL,AL;SHLALMOVBL,ALMOVBH,0JMPTAB[BX];
MOVAX,OFFSETTABADDBX,AXMOVAX,[BX]JMPAXP1:……┆JMPEXITP2:……┆JMPEXITP2:……┆JMPEXITP3:……┆JMPEXIT┆P8:……┆EXIT:MOVA
H,10CHINT21HCODEENDSENDSTART上述程序中的无条件转移指令的转移地址采用的是变址寻址。同理,转移地址也可以用寄存器间接寻址或基址加变址寻址,读者可自行考虑。返回本节10.10循环程序设计10.10.1循环程序的结构10.
10.2单重循环程序设计10.10.3多重循环程序设计返回本章首页10.10.1循环程序的结构1.初始化部分2.循环体部分3.循环控制部分循环程序的常见结构形式如图10.5(a)、(b)所示。返回本节循环体循环体10.10.2单重循环程序设计1.计
数控制2.条件控制1.计数控制【例10.7】已知有几个元素存放在以BUF为首址的字节存贮区中,试统计其中正元素的个数。显然,每个元素为一个8位有符号二进制数,统计其中正元素的个数可用循环程序实现。其程序流程图如图10.6所示
。•图10.6程序流程图<=0<=0[Bx]titleaccountdatasegmentnumberdb10,-23,-30,50,9,-105,32,310,20,86sdb0dataendscodesegmentassumecs:code,ds
:datastart:movax,datamovds,axmovbx,offsetnumbermovcx,10moval,s本题为统计10个数值中正数的个数do2:movdl,0cmp[bx],dljledo1incaldo1:
deccxcmpcx,0jleexitincbxjmpdo2exit:movs,almovah,10chint21hcodeendsendstart本题为统计10个数值中正数的个数datasegmentmessagedb"overflow!!!"adb100bdb100cdb?dataen
dscodesegmentassumecs:code,ds:datastart:movax,datamovds,axmoval,amovbl,baddal,bljochulijmpend1chuli:callyichuend1:mova
h,10chint21hyichuprocmovcx,11movsi,offsetmessageback:movdl,[si]movah,2int21hdeccxincsicmpcx,0jabackretyichuendpcodeendsendstart关于循环
结构中的串操作指令实施步骤1、如果串操作要涉及两个串,则一个串应在DS中,叫做源串,另一个应在ES中,叫做目标串。定义一个同时包含这两个串的数据段,然后把段基址同时传送到DS和ES中,用DS:[SI](偏移量1)表示源串,用DS:[DI](偏移量2)表
示目的串。2、在串传送、比较等操作之前,因为在串的传送和比较过程时,系统是逐个字符进行比较的,所以传送和比较操作需要重复进行多次。因此需要在执行之前用CX保存重复执行的次数。3、用CLD命令置DF=0,使SI,DI自动增量进行;用STD命令置DF=1,使SI,DI自动减量进
行10、增量可能是1也可能是2,这取决于串处理指令是字节型还是字类型。将内存中10000H单元开始存放的“classmates!”的字符串传送到20000H单元开始的区域titleaccountdatasegmentorg1000hdb"classmates!"
org2000hdb11dup(?)dataendscodesegmentassumecs:code,ds:data,es:data将内存中10000H单元开始存放的“classmates!”的字符串传送到20000H单元开始的区域st
art:movax,datamovds,axmovsi,1000hmovax,datamoves,axmovdi,2000hmovcx,11cldrepmovsbmovah,10chint21hcodeendsendstart比较“classmate”和”c
lassnate”是否相同titleaccountdatasegmentorg1000hdb"classmate"org2000hdb"classnate"dataendscodesegmentassumecs:co
de,ds:data,es:datastart:movax,datamovds,axmovsi,1000hmovax,datamoves,ax比较“classmate”和”classnate”是否相同movdi,2000hmovcx,11cldr
epecmpsbcmpcx,0jnzdecision1movbx,0;equationjmpexitdecision1:movbx,1;notequationexit:movah,10chint21hcodeendsends
tart【例10.8】【例10.8】试编写一程序,要求比较两个字符串STR1和STR所含字符是否相同,若相同则显示‘MATCH!’,若不相同则显示‘NOMATCH!’。(程序略)其流程图如图10.7所示。•图10.7程序流程图【例10.9】试编一个程序将
字单元BUF中所含1的个数存入COUNT单元中。要测出BUF字单元所含1的个数,首先将BUF中的数送给寄存器AX,然后将AX寄存器逻辑左移一次,如果CF=1,则表明AX中的最高位为1,则计数器CL计数1次,如果CF=0,表明AX最高位为0,这样依次将最高位
移入CF中去测试。移位之后,判断AX的值是否为0,如果为0则结束循环,不为0,则继续循环。其流程图如图10.8所示。2.条件控制程序如下:STACKSEGMENTSTACKDB200DUP(0)STACKEDNSDAT
ASEGMENTBUFDW0011110010101011BCOUNTDB?DATAENDSCODESEGMENTASSUMEDS:DATA,CS:CODE,SS:STACKSTART:MOVAX,DATAMOVDS,A
XMOVAX,BUFMOVCL,0;计数器为0COPA:ANDAX,AXJEEXIT;(AX)=0,结束循环SHLAX,1;AX左移一位JNCLOPAINCCL;产生进位,(CL)+1→CLJMPLOPAEXIT:MOVCOUNT,CLMOVAH,10CH
INT21HCODEENDSENDSTART返回本节10.10.3多重循环程序设计【例10.10】在以BUF为首址的字存储区中存放有N个有符号数,现需将它们按大到小的顺序排列在BUF存储区中,试编写其程序
。我们采用冒泡排序算法从第一个数开始依次对相邻两个数进行比较,如次序对,则不交换两数位置;如次序不对则使这两个数交换位置。可以看出,第一遍需比较(N-1)次,此时,最小的数已经放到了最后;第二遍比较只需考虑剩下的(N-1)个数,即只需比较(N-2)次;第三遍只需比较(N-3)次,……
整个排序过程最多需(N-1)遍。如下面的10个数即是采用冒泡排序比较的例子。数108169032第一遍101690328第二遍169032108第三遍903216108程序流程图如图10.9所示。程序如下:DATASEGMENTBUFDW3,-10,
6,7,9,2,0,-8,-9,-10,20N=($-BUF)/2DATAENDSSTACKSEGNMENTSTACKDB200DUP(0)STACKENDSCODESEGMENTASSUME
CS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVCX,NDECCXLOOP1:MOVDX,CXMOVBX,0LOOP2:MOVAX,BUF[BX]CMPAX,BUF[BX
+2]JGELXCHGAX,BUF[BX+2]MOVBUF[BX],AXL:ADDBX,2DECCXJNELOOP2MOVCX,DXLOOPLOOP1MOVAH,10CHINT21HCODEENDSEN
DSTART程序运行后,BUF区中的内容如下:20,9,7,6,3,2,0,-10,-8,-9,-10若要对N个无符号数按由大到小的顺序排列,只需将指令“JGEL”改为“JAEL”即可。返回本节10.5子程序设计
10.5.1子程序的概念10.5.2子程序的定义10.5.3子程序设计方法10.5.10子程序应用举例返回本章首页10.5.1子程序的概念在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的
子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。调用子程序的程序称为主调程序或主程序。返回本节10.5.2子程序的定义子程序的定义是由过程定义伪指令PROC和ENDP来完成的。其格式如下:过程
名PROC[NEAR/FAR]┆过程名ENDP其中PROC表示过程定义开始,ENDP表示过程定义结束。过程名是过程入口地址的符号表示。一般过程名同标号一样,具有三种属性,即段属性、偏移地址属性以及类型属性。返回本节10.5.
3子程序设计方法1.信息的保护与恢复2.主程序与子程序参数传递方式1.信息的保护与恢复例如:若子程序PROG中改变了寄存器AX,BX,CX,DX的值,则可采用如下方法保护和恢复现场。PROGPROCPUSHAX
PUSHBXPUSHCX;保护现场PUSHDX┆┆POPDXPOPCXPOPBX;恢复现场POPAXRET;返回断点处PROCENDP2.主程序与子程序参数传递方式(1)寄存器法(2)约定单元法(3)堆栈法返回本节10.5.10子程序应用举例【
例10.12】将一个给定的二进制数按位转换成相应的ASCII码字符串,送到指定的存储单元并显示。如二进制数10010011转换成字符串为‘10010011’。要求将转换过程写成子程序,且子程序应具有较好的通用性,而必须能实现对8倍和16倍二进制数的转换。入口参数:DX存放
待转换的二进制数CX存放待转换数的位数(8位或16位)DI存放ASCII码首地址出口参数:转换后的字符串存放在以DI作指针的字节存贮区中程序如下:DATASEGMENTNUM8DB93HNUM16DW0ABCDHASCBUFDB20DUP(
0)DATAENDSCODESEGMENTASSUMEDS:DATA,CS:CODE,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVDX,0MOVDL,NUM8;转换二进制数送DXMOVCX,8;置位数8L
EADI,ASCBUF;字符串首址→DICALLBTASC;调用子程序BTASCMOV[DI],BYTEPTR0DHMOV[DI+1],BYTEPTR0AHMOV[DI+2],BYTEPTR‘$’LEADX,ASCBUFMOVAH,9INT2
1HMOVDX,NUM16MOVCX,16;置位数16LEADI,ASCBUFCALLBTASCMOV[DL],BYTEPTR0DHMOV[DL+1],BYTEPTR0AHMOV[DL+2],BYTEPT
R‘$’;显示转换后的字符串LEADX,ASCBUFMOVAH,9INT21HBTASCPROCPUSHAX;保存AXMOVAL,0CMPCX,8;比较8位数JNEL1;直接转换16位数M
OVDH,DL;8位数转换送DHL1:ROLDX,,1;DX最高位移入CFRCLAL,1;CF移入AL最低位ADDAL,30HMOV[DI],ALINCDILOOPL1POPAXRETBTASCENDPCODEEND
SENDSTART返回本节datasegmentmessagedb"overflow!!!$"adb100bdb100cdb?dataendscodesegmentassumecs:code,ds:datast
art:movax,datamovds,axmoval,amovbl,baddal,bljochulijmpend1chuli:callyichuend1:movah,10chint21hyichuprocmovdl,offsetme
ssagemovah,9int21hretyichuendpcodeendsendstart10.7高级汇编语言技术10.7.1宏指令10.7.2宏指令的使用过程返回本章首页10.7.1宏指令在汇编语言程序设计过程中,可以将具有一定功能,需多次重复使用,且比较短的程序段定义成一条宏指令。使
用宏指令语句可以减少程序书写错误,缩短源程序长度,使源程序编写像高级语言一样清晰、简洁。特别是使用宏库后,可以提高编程效率。返回本节10.7.2宏指令的使用过程1.宏定义2.宏调用3.宏扩展1.宏定义(1)
带参宏定义宏指令名MACRO形参1,形参2,……宏体ENDM(2)无参宏定义宏指令MACRO宏体ENDM2.宏调用格式:宏指令名[实参1,实参2,……]例如:对上面的宏定义的三种调用形式为:┆PRINTBUF1┆PRINTBUF2┆PRINTBUF3
┆3.宏扩展┆+LEADX,BUF1+MOVAH,9+INT21H┆+LEADX,BUF2+MOVAH,9+INT21H┆+LEADX,BUF3+MOVAH,9+INT21H┆•例如:上面三次宏调用,其展开的形式为:返回本节