资源描述:
《汇编语言程序设计03》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、4.6汇编语言程序设计及举例4.6.1概述编写汇编语言程序的步骤数学模型→确定算法→流程图→分配内存寄存器→编制程序判断程序质量的标准执行时间,所占内存,语句行数程序流程图程序流程图顺序程序结构条件程序结构分支程序结构...YN一般语句If–else语句Switch语句工作框判断框箭头表示程序走向程序流程图循环控制结构1循环控制结构2NNYYwhile语句do--while语句编写完整的汇编语言程序,用8086的16位无符号数乘法指令实现两个32位无符号数的乘法运算。算法分析:8086没有32位无符号数乘法指令
2、,需借助于16位无符号数乘法指令做4次乘法,然后把部分积相加,如下图所示。ABB×DCDA×DB×CA×C+×部分积1部分积2部分积3部分积4最后乘积AB×CD4.6.2算术运算程序设计完整的汇编语言程序如下:NAMEMULTIPLY_32BITDATASEGMENTMULNUMDW8000H,0001H,0FFFH,0001H,4DUP(?)DATAENDSSTACKSEGMENTPARASTACK‘STACK’DB100DUP(?)STACKENDS例如,求:00018000H*00010FFFH=0000
3、000197FE8000HABCDCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTARTPROCFARBEGIN:PUSHDS;DS中包含的是程序段前缀的段地址MOVAX,0PUSHAX;设置返回至DOS的段值和偏移量MOVAX,DATAMOVDS,AX;置段寄存器初值LEABX,MULNUMMULU32:MOVAX,[BX];B→AXMOVSI,[BX+4];D→SIMOVDI,[BX+6];C→DIMULSI;B×DMOV[BX+8],AX;保存部分积1MOV[BX+0
4、AH],DXMOVAX,[BX+2];A→AXMULSI;A×DADDAX,[BX+0AH]ADCDX,0;部分积2的一部分与部分;积1的相应部分相加MOV[BX+0AH],AXMOV[BX+0CH],DX;保存MOVAX,[BX];B→AXMULDI;B×CADDAX,[BX+0AH];与部分积3的相应部分相加ADCDX,[BX+0CH]MOV[BX+0AH],AXMOV[BX+0CH],DXPUSHF;保存后一次相加的进位标志MOVAX,[BX+0AH];A→AXMULDI;A×CPOPFADCAX,[BX
5、+0CH];与部分积4的相应部分相加ADCDX,0MOV[BX+0CH],AXMOV[BX+0EH],DXRETSTARTENDPCODEENDSENDBEGIN程序中根据各种可能出现的情况及相应的处理方法分成若干支路,运行时,根据不同情况有选择地执行相应处理程序。例试编写程序段,实现符号函数。当x>0时当x=0时当x<0时4.6.3分支程序设计相应的程序段为;SIGN:MOVAX,BUFFER;(BUFFER)=XANDAX,AX;做一次“与”运算,以便把X;的特征反映到标志位MOVBX,0;预置X=0的标志
6、0到BXJENEXT;若X确实为0,则转NEXTJNSPLUS;X为正数,则转PLUSMOVBX,-1;X为负数,则-1送BXJMPNEXTPLUS:MOVBX,1NEXT:……一段程序有时重复执行多次,就牵涉到循环程序结构,其组成部分为:1.循环体即要求重复执行的程序段部分,包括循环工作部分和循环控制部分。2.循环初态循环开始时往往要置初态,赋初值,包括循环工作部分初态和结束条件初态。4.6.4循环程序设计3.循环结束条件在循环程序中必须给出循环结束条件,否则就会进入死循环,结束条件有好多种,最常见的有:(1
7、)用计数器控制循环(2)按问题的条件控制循环(3)用开关量控制循环分类统计字数组ARRAY中正数、负数和零的个数,并分别存入内存字变量POST、NEGA和ZERO中,数组元素个数保存在数组的第一个字中。分析:将字变量与0比较,然后判断是大于0(JG)、等于0(JE)还是小于0(JL),以分别对相应的计数器加1。(1)用计数器控制循环DATASEGMENTARRAYDW8;元素个数DW230,-1437,26,-31,0,3458,0,10POSTDW0NEGADW0ZERODW0DATAENDSCODESEGM
8、ENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXXORAX,AX;用AX作为正数的计数器XORBX,BX;用BX作为负数的计数器XORDX,DX;用DX作为零的计数器MOVCX,ARRAY;用CX来进行循环计数JCXZDONE;考虑数组的元素个数为0的情况LEADI,ARRAY+2;用指针DI来访问整个数组AGAIN:CMPWORDPTR