您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 第4章汇编语言程序语言程序设计举例
第四节汇编语言程序设计及举例概述顺序结构分支程序循环程序字符串处理程序码转换程序DOS系统功能调用宏汇编与条件汇编一、概述1.编写步骤(1)分析问题,抽象出数学模型(2)确定算法(3)画程序流程图(4)分配内存工作单元和寄存器。(5)按程序流程图编制程序。(6)上机调试,排错。起始框终止框工作框判断调子程序2.程序质量判断(1)执行时间(2)占用内存空间(3)语句行数3.程序结构顺序分支循环子程序二、顺序结构例4-1:8086没有32位无符号数乘法指令,需借助于16位无符号数乘法指令做4次乘法,然后把部分积相加,。16位×16位部分积1部分积2部分积3+部分积432位A│BC│DB×DA×DB×CA×C设地址指针被乘数低16位B→AX乘数低16位D→SI存入缓冲区乘数高16位C→DIB*D=部分积1被乘数高16位A→AXA*D=部分积2部分积2低16位加部分积1高16位存入缓冲区B*C=部分积3进位加至部分积2高16位与前面对应16位相加保存进位部分积4与前面的和相加保存在缓冲区A*C=部分积4恢复进位返回说明:(1)数据段:mulnumdw0000,0ffffh,0000,0ffffh,4dup(?)被乘数乘数乘积(2)堆栈段:stacksegmentparastack‘stack’db100dup(?)stackendsNAMEMULTIPLY_32BITDATASEGMENTMULNUMDW8000H,0001H,0FFFH,0001H;定义被乘数B、A与乘数D、CPRODUCTDW4DUP(?);定义乘积,低字在前DATAENDSSTACKSEGMENTPARASTACK‘STACK’DB100DUP(?);初始化堆栈大小为100byteSTACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTARTPROCFARBEGIN:PUSHDS;DS中包含的是程序段前缀的起始地址MOVAX,0PUSHAX;设置返回至DOS的段值和偏移量MOVAX,DATAMOVDS,AX;置段寄存器初值MOVBX,0MULU32:MOVAX,MULNUM[BX];B→AXMOVSI,MULNUM[BX+4];D→SIMOVDI,MULNUM[BX+6];C→DIMULSI;B×DMOVPRODUCT[BX],AX;保存部分积1MOVPRODUCT[BX+2],DXMOVAX,MULNUM[BX+2];A→AXMULSI;A×DADDAX,PRODUCT[BX+2]ADCDX,0;部分积2的一部分与部分积1的相应部分相加MOVPRODUCT[BX+2],AXMOVPRODUCT[BX+4],DX;保存MOVAX,MULNUM[BX];B→AXMULDI;B×CADDAX,PRODUCT[BX+2];与部分积3的相应部分相加ADCDX,PRODUCT[BX+4]MOVPRODUCT[BX+2],AXMOVPRODUCT[BX+4],DXPUSHF;保存后一次相加的进位标志MOVAX,MULNUM[BX+2];A→AXMULDI;A×CPOPF;标志出栈ADCDX,0ADCAX,PRODUCT[BX+4];与部分积4的相应部分相加ADCDX,0MOVPRODUCT[BX+4],AXMOVPRODUCT[BX+6],DXRETSTARTENDPCODEENDSENDBEGIN分支程序的基本思想是根据逻辑判断的结果来形成程序的分支。分支有两分支和多分支。对于两分支,若条件P成立则执行A;否则执行B,如图4.2所示三、分支程序三、分支程序例:SIGEF:MOVAX,BUFFERORAX,AX;建立条件JEZERO;为0转ZEROJNSPLUS;为正转PLUSMOVBX,0FFH;为负JMPCONTIZERO:MOVBX,0JMPCONTIPLUS:MOVBX,1CONTI:…y←-1判断y←0y←1X0X0X=0四、循环程序结构形式:先执行,后判断先判断,后执行组成:(1)初始化(2)循环体(3)修改参数(4)循环控制初始化循环控制循环体修改参数入口出口初始化循环控制循环体修改参数入口出口1.用计数器控制循环(1)减1计数器(2)加1计数器例4-2:P.141在一串给定个数的数中寻找最大值,放至指定的存储单元,每个数为16位。NAMESEARCH_MAX;源程序名DATASEGMENT;(1)数据段BUFFERDWX1,X2,…XN;n个数据字COUNTEQU$-BUFFER;COUNT=2×nMAXDW?;放结果(最大值)DATAENDSSTACKSEGMENTSTACK‘STACK’;(2)堆栈段DB64DUP(?);64个字节TOPEQU$-STACK;TOP为栈顶偏移STACKENDSCODESEGMENT;(3)代码段STARTPROCFAR;定义子程序ASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:PUSHDS;(4)置子程序返回地址MOVAX,0PUSHAXMOVAX,DATA;置DSMOVDS,AXMOVAX,STACK;置SSMOVSS,AXMOVAX,TOP;置SPMOVSP,AXMOVCX,COUNT;(5)循环初始化,CX=2nLEABX,BUFFER;BX为数据指针MOVAX,[BX];取第一个字INCBX;指针指向下一个字INCBXSHRCX;CX=个数DECCX;个数减1AGAIN:CMPAX,[BX];(6)循环体,比较JGENEXT;AX大,转NEXTMOVAX,[BX];最大值→AXNEXT:INCBX;(7)修改参数,指针加1INCBXLOOPAGAIN;(8)循环控制,CX-1→CX,为0结束MOV[BX],AX;存最大值RETSTARTENDPCODEENDSENDSTART2.用开关变量控制循环一个循环体中有两个循环支路,设一个开关变量,控制进入哪个循环支路。例:数据采集系统。采到的前5个数用一种函数(FUN1)处理,开关=0。采到的后7个数用另一种函数(FUN2)处理,开关=1。说明:(1)数据:bufferdw05,05,….;12个数据blockdw12dup(?);存结果count1equ5;个数count2equ7;个数(2)初始化:源数据指针buffer→bx处理后数据指针block→sicount1+1,count2+1→cx开关0→dx(3)循环主体:判开关量dx=0?dx=0callfun15个数据处理完后dx=1,cx=count2+1dx=1callfun2每处理完一个数,修改指针bx,simovdx,0;(1)循环初始化开关dx=0movcx,count1+1;cx为计数器leabx,buffer;bx源指针leasi,block;si目的指针again:movax,[bx];(2)循环主体cmpdx,0jneanoth;开关不为0转anothcallfun1;为0,函数1处理loopnextmovdx,1;开关量转为1movcx,count2+1jmpagainnext:mov[si],ax;处理后保存incbx;(3)修改参数incbxincsiincsijmpagainanoth:callfun2;函数2处理loopnext;(4)循环控制ret223.多重循环一个循环中包含另一个循环,称多重循环。如:二维数组处理,二重循环。注意:(1)各重循环的初始控制条件及实现。(2)内循环可嵌套在外循环中,也可几个内循环并列在外循环中,可从内循环跳到外循环,不可从外循环中直接跳进内循环。(3)要防止出现死循环。例:延时程序,多重循环实现软件延时。DELAY:MOVDX,3FFHTIME:MOVAX,0FFFFHTIME1:DECAXNOPJNETIME1DECDXJNETIMERET内循环控制变量AX,初值=FFFFH外循环控制变量DX,初值=3FFH五、字符串处理程序字符:ASCII码说明:(1)ASCII码数字,字母形成一个有序序列:0~9:30H~39HA~Z:41H~5AHa~z:61H~7AH(2)一些I/O装置(键盘,显示器,打印机)采用ASCII码传送。(3)常用的控制字符:0AH换行(LF)0DH回车(CR)08H退格1.确定字符串长度字符串长度不定,以某个特定字符为结束符。例4-3:从头搜索字符串的结束符,统计长度。字符串地址指针:DI字符串长度:DL串结束字符:AL(1)数据段:串放string开始单元串长度放LL单元结束符放CR单元(2)堆栈段:100个字节长度=0CF=0?取串元素设置字符串指针返回长度+1存串元素YN(3)程序leadi,string;串地址偏移→DImovdl,0;串长度初始DL=0moval,cr;结束符→ALagain:scasb;搜索串jedone;找到转DONE,停止搜索incdl;未找到,长度加1jmpagain;继续搜索done:leabx,llmov[bx],dl;存长度RETSTARTENDPCODEENDSENDBEGIN2.加偶校验到ASCII字符ASCII码:7位二进制数,最高位可作为校验位。偶校验:1的个数为偶数,最高位置“0”,否则置“1”。例4-4:有一个ASCII字符串放在STRING开始的单元,从串中取出每一个字符,检查“1”的个数,为偶数,则最高位置“0”;为奇数,最高位置“1”。取元素“1”为偶数?自行与初始化返回最高位置1送回串中长度修改=0?NNYY说明:leasi,string;串指针:simovcx,count;串长度:cxagain:lodsb;取数,si+1→si/LODSB块装入指令把SI指向的存储单元读入累加器,LODSB就读入AL,LODSW就读入AX中,然后SI自动增加或减小1或2.andal,al;自行与,影响PFjpenext;偶,转至nextoral,80h;奇,最高位置1mov[si-1],al;送回next:deccx;修改长度jnzagain;≠0,转again六、码转换程序十六进制,二进制,BCD码,ASCII码转换方法:(1)算术和逻辑运算指令,软件实现;(2)查表指令;(3)硬件译码。1.十六进制→ASCII说明:(1)十六进制:0~9A~FASCII码:30H~39H41H~46H对0~9,加上30H对A~F,加上‘A’-1030H+0AH+07H=41H(2)地址指针:源(十六进制)bx目的(ASCII)si(3)cx=L1=2,每次循环转换一个字节两位十六进制数:低位与高位拆开:1)ANDAL,0FH;留下低四位2)MOVCL,4SHRAL,CL;原高四位低四位1.十六进制→ASCIIagain:moval,[bx];取十六进制数movdl,al;保存andal,0fh;留下低四位callchange;低四位→ASCIImoval,dl;取数pushcxmovcl,4;移位次数shral,cl;原高四位低四位popcxcallchange;高四位→ASCIIincbxloopagain一位十六进制数ASCII码子程序:change:proccmpal,10jladd_0;0~9转add_0addal,’A’-’0’-10;A~Fadd_0:addal,’0’mov[si],alincsiretchangeendp2.ASCII→压缩BCD长度L2长度L1bufferstring压缩BCDASCII码非压缩BCD说明:(1)对非压缩BCD码,只要将ASCII的高4位屏蔽(AND)即可(2)对压缩BCD码,要处理两个ASCII码,先为低位BCD码,后为高位BCD码,组合起来。434H33H38H39H234H98H404030809datasegmentl2
本文标题:第4章汇编语言程序语言程序设计举例
链接地址:https://www.777doc.com/doc-2109832 .html