汇编语言程序设计基本程序设计.ppt
《汇编语言程序设计基本程序设计.ppt》由会员分享,可在线阅读,更多相关《汇编语言程序设计基本程序设计.ppt(182页珍藏版)》请在三一办公上搜索。
1、本章概述 本章主要介绍汇编语言程序设计的基本方法。教学目标 熟练掌握微型机的汇编语言程序设计的基本方法。学习内容 简单程序设计 分支程序设计 循环程序设计 子程序设计,第九章 基本程序设计,一、简单程序(顺序程序)设计,1.简单程序的结构例如:将 VAR1、VAR2和VAR3 三个连续单元的内容相加,结果存入 RESULT单元中。SSEGSEGMENTPARA STACK STACKDB128DUP(?)SSEGENDSDSEGSEGMENTPARA PUBLIC DATAVAR1DB?;保存第一个数VAR2DB?;保存第二个数VAR3DB?;保存第三个数RESULTDB?;保存运算结果DSE
2、GENDS,CODESEGMENTPARAPUBLICCODEASSUMECS:CODE,DS:DSEG,SS:SSEGMAINPROCFARPUSHDSXORAX,0PUSHAXMOVAX,DSEGMOVDS,AXMOVBX,OFFSET VAR1;设地址指针MOVAL,BX;取第一个数送AL寄存器INCBX;修改地址指针ADDAL,BX;加入第二个数INCBX;修改地址指针ADDAL,BX;加入第三个数INCBX;修改地址指针MOVBX,AL;保存结果RETMAINENDPCODEENDSENDMAIN;,简单程序设计首先是要学会选择适当的指令构建程序。构建一个程序可选择的指令很多,只要正
3、确就行。初学者在程序模版的基础上,更改主要指令就可以了。上例中有8六条指令是直接与题目要求有关的:MOVBX,OFFSET VAR1MOVAL,BXINCBXADDAL,BXINCBXADDAL,BXINCBXMOVBX,AL,例如:将 DATA1 中的字节数据拆开,分别存于 DATA1 和 DATA2 单元中。假设设 DATA1 单元中的数为:A6 H,程序操作结果为:DATA2内容变成 0A H DATA3内容变成 06 HSSEG SEGMENTSTACK DB256 DUP()SSEG ENDSDSEG SEGMENTDATA1 DB0A6 HDATA2 DB?DATA3 DB?DSE
4、G ENDS,CSEGSEGMENTASSUMECS:CSEG,DS:DSEG,SS:SSEG1STARTPROCFARPUSHDSMOVAX,0PUSHAXMOVAX,DSEGMOVDS,AXMOVAL,DATA1;取数 A6HSHRAL,1;SHRAL,1;SHRAL,1;SHRAL,1;右移 4 位 MOVDATA2,AL;存第一个结果MOVAL,DATA1;取数A6H ANDAL,0FH;形成第二个数MOVDATA3,AL;保存RETSTARTENDPCSEGENDSENDSTART,2.查表程序设计例如 设在内存中有一个阶乘表(0!7!),DATA单元中有一个已知数X(设该数范围 为
5、 0 7).查表求该数的阶乘值x!。,STACK1 SEGMENT STACK DB256DUP()STACK1 ENDSDATA1SEGMENT TABLEDW1,1,2,6,24,120DW720,5040;阶乘表RESULTDW?;保存结果 X!DATA DB?;存已知数XDATA1 ENDS,用 DB定义阶乘表,可否?,CSEGSEGMENTASSUMECS:CSEG,DS:DATA1,SS:STACK1BEGIN PROCFARPUSHDSMOVAX,0PUSHAXMOVAX,MOVDS,AXMOVBH,0MOVBL,DATA LEASI,TABLEMOVAX,SI BXMOV RE
6、TBEGINENDPCSEGENDSENDBEGIN,DATA1,ADD BX,BX,RESULT,AX,3.汇编语言程序输入输出的实现 每一个最简单的程序都有基本的输入输出能力。一般,汇编语言程序的输入输出操作是通过对操作系统的子程序调用实现的。在DOS操作系统中,提供了功能丰富的子程序,包括输入输出管理、内存管理、文件操作、磁盘读写控制等,DOS操作系统将它们称为系统功能调。,DOS系统功能调用中的子功能有上百个,每一个子功能的具体作用、入口参数、出口参数都可通过查表获得。应用程序通过系统功能调用,能方便地完成输入输出操作。在汇编语言程序中,利用中断指令 INT 21H 实现对操作系统系统
7、功能调用中的子功能的调用。这里先介绍其中几个最常用的子功能。,1 单个字符输入子功能(1号子功能)P 这个子功能完成从键盘输入一个字符,将所输入字符的ASCII码送AL寄存器中,同时在显示器上显示这个字符。程序中的具体操作如下:(1)子功能号 1 送入 AH寄存器中;(2)执行 INT 21H 指令,调用此子功能,系统等待键盘输入,如果输入了一个字符,结果可以在AL寄存器中得到输入字符的ASCII码。MOV AH,1INT 21H 程序段执行完毕后,在AL寄存器中得到输入字符的ASCII码。,2单个字符输出显示子功能(2号子功能)P 这个子功能可以将一个字符送到显示器上显示出来。程序中的具体操
8、作要求如下:(1)子功能号 2 送入 AH寄存器中;(2)将被显示字符的ASCII码存入DL寄存器中;(3)执行 INT 21H 指令,调用2号子功能,将字符显示屏幕上。例如,有如下程序段:MOVDL,41H;41H 是字符”A”的 ASCII 码MOVAH,02HINT21H 程序段执行完毕后,在屏幕上显示字符A。,3 字符串输出显示子功能(9号子功能)P83 这个子功能将一个字符串显示在屏幕上。该字符串在内存中的起始地址由 DS:DX 指定.以“$”作为字符串结束标志。程序中的具体操作要求如下:(1)功能号 09H 送入 AH 寄存器中;(2)将待显示字符串的存储地址的段基值和偏移量分别送
9、人DS 段寄存器和 DX 寄存器中;(3)执行 INT 21H 指令,调用 9 号子功能,将字符串显示屏幕上。,例如,有如下程序段:STR1 DBCOMPUTERDB$LEA DX,OFFSET STR1;置字符串的偏移地址 MOV AH,09HINT 21H程序执行完时,将在屏幕上显示字符串“COMPUTER”。,4 程序终止子功能(4CH号子功能)P 这个子功能程序的作用是使系统从应用程序的运行状态返回DOS状态。例如:MOVAX,4C00H INT21H 程序执行完毕,程序从当前的运行状态返回DOS。,例 用汇编语言编程实现在屏幕上显示字符串“Hello World”。DATA SEGM
10、ENTSzHello DB Hello,world,0dh,0ah,$DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART1:MOV AX,DATA;装入数据段的段地址 MOV DS,AXMOV AH,9;字符串输出MOV DX,OFFSET SzHello;字符串的地址INT 21HMOV AH,4CH INT 21H;返回DOSCODE ENDSEND START1,从这个程序中,可以看到汇编语言源程序的另一种写法,在这里没有定义过程,直接在代码段编写程序。程序将数据段段地址装入DS后,在后面的字符串显示时,就能正确寻址到字符串在数据段中的位置
11、,通过9号功能调用输出该字符串。在程序的最后,利用DOS的功能调用,返回DOS状态。,二、分支程序设计,1.分支程序的结构示例 2.简单分支程序3.多分支程序,1.分支程序的结构示例,分支程序结构有两种形式:双分支 多分支 特点:运行方向是向前的在某种条件下,有能执行多个分支中的一个分支,计算分段函数 Y=设 X 存于 DATA 中,Y 存于 RESULT 中。START:MOVAL,DATAORAL,ALJZZEROMOVRESULT,0FFHHLTZERO:MOVRESULT,0HLT,计算分段函数 Y=程序的另一种写法。START:MOVAL,DATAANDAL,ALJZZEROMOVA
12、L,0FFHZERO:MOVRESULT,ALHLT程序设计的方法是多种多样的!,2.简单分支程序,分支:依据不同的条件,选择不同的程序段,实现对被加工对象的不同处理。实现分支的关键:选择合适的指令影响状态标志。CF、ZF、SF、OF、PF、AF 选用恰当的跳转指令判断标志,实现分支。有条件转移指令与无条件转移指令相互配合。,简单分支程序结构,简单分支程序结构,汇编语言编程中,常用的分支判断:,比较两数是否相等(设两数在 AL 和 BL 中):,CMP AL,BLJE K1,比较两数是否相等(设两数在 AL 和 BL 中):,CMP AL,BLJNE K2,CMP AL,BLJNE K3,判断
13、某数是否为0(设该数在 AL 中):,AND AL,ALJZ N1,比较两个无符号数的大小(设两数在 AL 和 BL 中):,CMP AL,BLJAE M1,CMP AL,BLJB M2,例.设行李重量为 P,行李托运费为 M,行李托运计费规定如下:行李重量小于等于20公斤时,单价为2元;超过20公斤时,超出部分按每公斤3元计算。设 P 存于 DATA 单元,M 存于 RESULT 单元。编程,计算行李费。,KD1,题意分析:当 P 大于 50 时,M=2*50+(P 50)*3=P*2+P-50;否则,M=2*P,程序代码如下(1):,MAIN PROCFARMOVAL,DATA;取重量送A
14、LCMPAL,50JBEKD1;小于等于50,转KD1MOVBL,AL;ADDAL,BL;P+P 送 ALMOVCL,AL;2P 送 CLMOVAL,BL;P 送 AL,SUBAL,50;P-50ADDAL,CL;2P+P-50 送 ALMOVRESULT,AL;存结果RETKD1:ADDAL,AL;p+p 存入 AL MOVRESULT,AL;存结果RETMAIN ENDP,KD1,上述程序可以优化:,KD1,KD2,程序代码如下(2):,MAIN PROCFARMOVBL,DATAMOVAL,BLADDAL,BLMOVCL,AL;CL=2PMOVAL,BL;AL=PCMPAL,50JBEK
15、D2;小于等于50,转KD2,SUBAL,50;AL=P-50ADDAL,CL;MOVCL,ALKD2:MOVAL,CL;MOVRESULT,ALRETMAIN ENDP,KD2,上述程序进一步优化(3):,KD2,KD3,MAIN PROCFARMOVAL,DATA;AL=PMOVBL,ALCMPAL,50JBEKD3SUBAL,50;AL=P-50ADDAL,BL;AL=AL+PKD3:ADDAL,BL;AL=AL+PMOVRESULT,AL;存结果RETMAIN ENDP,KD3,判断某数的某位(或某几位)是否为1或为0(设该数在 AL 中):,例如 在DATA 单元中有一个带符号的八位
16、数,求其绝对值存于 RESULT 中。,MAINPROCMOVAL,DATAANDAL,80HMOVAL,DATAJZLL1NEGALLL1;MOVRESULT,ALRETMAINENDP,MAINPROCMOVAL,DATATESTAL,80HJZKK1NEGALKK1:MOVRESULT,ALRETMAINENDP,例.从键盘输入 0 9 中的任意一个数 X,判断此数是否在这个范围内,若是,则将该数的立方值送入变量 Y 中,显示“INPUT CORRECT!”;否则,显示“I NPUT ERROR!”。题目涉及的知识点:1)汇编语言程序输入输出的实现。利用系统功能调用的 1#子功能,输入的
17、实际上是ASCII字符。2)查表技术,包括在内存中建表,在程序中查表。3)分支程序设计,两次比较和判断。4)显示字符串。,K1,K2,DSEGSEGMENTINPUTDB“PLEASE INPUT X(09):$”TABDW0,1,8,27,64,125;立方表DW 216,343,512,729XDB?;YDW0CORDB0DH,OAH,”INPUT CORRECT!$”ERRDB0DH,0AH,”INPUT ERROR!$”DSEGENDSSSEGSEGMENTSTACKDW64 DUP(0)SSEGENDS,CSEGSEGMENTASSUME CS:CSEG,SS:SSEG,DS:DSE
18、GSTART PROCFARPUSHDSSUBAX,AXPUSHAXMOVAX,DSEGMOVDS,AXLEADX,INPUT;MOVAH,9;INT21H;显示提示信息,MOVAH,1INT21H;输入字符CMPAL,0;是否小于”0”JBK1;CMPAL,9;是否大于”9”JAK1;ANDAL,0FH;分离出低四位MOVX,AL;暂存于 XSHLAL,1;MOVBL,AL;MOVBH,0;形成查表索引值MOVAX,TABBX;查表MOVY,AX;立方值存入 Y,LEADX,COR;MOVAH,9 INT21H;显示RETK1:LEADX,ERR;MOVAH,9 INT21H;显示RETST
19、ARTENDPCODEENDSENDSTART,JMPK2,K2:,MOVAH,1INT21H;输入字符CMPAL,0;是否小于”0”JBK1;CMPAL,9;是否大于”9”JAK1;ANDAL,0FH;分离出低四位MOVX,AL;暂存于 XSHRAL,1;MOVBL,AL;MOVBH,0;形成查表索引值MOVAX,TABBX;查表MOVY,AX;立方值存入 Y,LEADX,COR;K2:MOVAH,9 INT21H;显示RETK1:LEADX,ERR;JMPK2STARTENDPCODEENDSENDSTART,3.多分支程序,具有二个以上分支的程序称为多分支程序。例 编写计算下面函数值的程
20、序:1 X 0Y=0 X=0-1 X 0 设输入数据为 X、输出数据 Y,且皆为字节变量。程序流程图如下所示。,多 分支运算程序流程图,Y=1,X 0,X=?,Y=0,Y=-1,X=0,X0,BEGIN PROCFARMOVAL,VAR1;取数 X ORAL,ALJNSADR1;正数(SF1)转JZADR2;为(ZF=1)转MOVBL,0FFH;X为负数时 JMPDONEADR2:MOVBL,0;X为0 时 JMPDONEADR1:MOVBL,1;X为正数时DONE:MOVVAR2,BLRET BEGINENDP,此程序有错!,BEGIN PROCFARMOVAL,VAR1;取数 X ORAL
21、,ALJNSADR1;正数(SF1)转MOVBL,0FFH;X为负数时 JMPDONEADR1:JZADR2;为(ZF=1)转 MOVBL,1;X为正数时 JMPDONEADR2:MOVBL,0;X为0 DONE:MOVVAR2,BLRET BEGINENDP,BEGIN PROCFAR MOVAL,VAR1 CMPAL,0 JGEBIGR;大于等于转 MOVAL,0FFH;X为负数EQUL:MOVVAR2,AL RETBIGR:JE EQUL;X 等于 0 转 MOVAL,1;X 大于 0 JMPEQULBEGIN ENDP,例:试编一程序,求三个带符号字数据中的最大值,并将最大值存入 MA
22、X 字单元中。设三个带符号数分别存放在三个字变量X、Y、Z中存储。,程序流程图,STACKSEGMENT STACK DB 200 DUP(0)STACKENDSDATASEGMENTX DW 00ABHY DW 5Z DW 200MAXDW?DATAENDSCODESEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKSTART:PUSHDSMOVAX,0PUSHAX MOVAX,DATA MOVDS,AX,MOVAX,X;取数X送 AX CMPAX,Y;XY?JGL1;大于则转 MOVAX,Y;Y 大 CMPAX,Z;YZ?JGEXIT;Y 大则转,AX存大数L2:
23、MOVAX,Z;至此 Z大,送入AX JMPEXITL1:CMPAX,Z;XZ?JLEL2;X=Z 转EXIT:MOVMAX,AX;AX 存大数 RETCODE ENDS END START,4.用地址表(或转移表)实现多路分支,利用简单分支程序组合实现的多分支程序,要经过多次判断才能确定进入哪个分支运行,当程序分支过多时,这种判断花费的时间就可能较长。在多分支程序设计中,常用 地址表 或 转移表 法。地址表法是指:把转移到各分支程序的入口地址集中存放在一张表中,该表称为分支地址表。各分支转移程序的入口地址在表中的位置(离表首地址的位移量)作为条件。当进行多分支条件判断时,把当前条件位移量加上
24、表首地址作为转移地址,转到表的相应位置,取出所转向的子程序的入口地址,达到多分支的目的。,例:设计多分支程序,实现从键盘输入09之间的数码,根据输入的情况,转入到相应的分支程序运行,显示响应的提示信息:输入0时显示:The number is zero输入1时显示:The number is one输入9时显示:The number is nine,利用地址表法设计分支程序,根据输入的情况,转入到相应的分支程序运行。在不同的分支中显示不同的字符串。设 各分支程序的入口地址分别确定为:ADDR0、ADDR1、ADDR2、ADDR9。在数据段定义一张地址表,其起始地址为ADDRTABLE,将各分支
25、程序的入口地址存于表中。程序中利用DOS的1号功能调用,从键盘输入0到9之间的数据。,从键盘输入0到9之间的数据,求对应的键盘输入的数值,地址表实现多分支的程序流程图,计算转移表表项地址送入DI,查表取分支程序的入口地址送入BX,开 始,置地址MESG0,=0,结 束,置地址MESG1,=1,置地址MESG9,=9,利用JMP BX指令转入对应分支,显示字符串,DATA SEGMENT ADDRTABLE DWADDR0;地址表 DWADDR1.DWADDR9 MESG0DBThe number is zero,0dh,0ah,$;待显示的字符串MESG1 DB The number is o
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 程序设计 基本

链接地址:https://www.31ppt.com/p-6475891.html