《微机原理及接口技术》全套ppt电子课件教案-第四章 汇编语言程序设计2_第1页
《微机原理及接口技术》全套ppt电子课件教案-第四章 汇编语言程序设计2_第2页
《微机原理及接口技术》全套ppt电子课件教案-第四章 汇编语言程序设计2_第3页
《微机原理及接口技术》全套ppt电子课件教案-第四章 汇编语言程序设计2_第4页
《微机原理及接口技术》全套ppt电子课件教案-第四章 汇编语言程序设计2_第5页
已阅读5页,还剩84页未读 继续免费阅读

下载本文档

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

文档简介

第四节 汇编语言程序设计及举例,概述,顺序结构,分支程序,循环程序,字符串处理程序,码转换程序,DOS系统功能调用,一、概述,1.编写步骤 (1)分析问题,抽象出数学模型 (2)确定算法 (3)画程序流程图,工作框,判断,调子程序,(4)分配内存工作单元和寄存器。 (5)按程序流程图编制程序。 (6)上机调试,排错。,起始框,终止框,2.程序质量判断 (1)执行时间 (2)占用内存空间 (3)语句行数3.程序结构 顺序 分支 循环 子程序,二、 顺序结构,例4-1:P.139,两个32位无符号数乘法,乘积为64位。,设地址指针,被乘数低16位BAX,乘数低16位DSI,存入缓冲区,乘数高16位CDI,B*D=部分积1,被乘数高16位AAX,A*D=部分积2,部分积2低16位加部分积1高16位,存入缓冲区,B*C=部分积3,进位加至部分积2高16位,与前面对应16位相加,保存进位,部分积4与前面的和相加,保存在缓冲区,A*C=部分积4,恢复进位,返回,说明:,(1) 数据段:data segmentmulnum dw 0000,0ffffh,0000,0ffffh,4dup(?)data ends,被乘数,乘数,乘积,(2)堆栈段:stack segment para stack stack db 100dup(?) stack ends,(3) 码段:,code segment assume cs:code,ds:data,ss:stack,es:data code ends,Assume语句指明了码段、数据段、堆栈段和附加段是哪些段,1) 定义了一个远过程,将段和IP压入堆栈,子程序返回,start proc far push ds mov ax,0 push ax retstart endp,连接程序为每个用户程序建立了一个程序段前缀,开始处(0单元)安排了一条返回DOS的指令,而且程序段前缀的段地址赋给了DS。,2) 接着三条指令,mov ax,datamov ds,axmov es,ax,设置DS,ES。3) bx为地址指针 bxbx+3: 32位被乘数 bx+4bx+7: 32位乘数 bx+8bx+0fh:放乘积,4) 16位乘法mul AX:被乘数 si或di:乘数 dx.ax :32位乘积,lea bx,mulnummulu32:mov ax,bx mov si,bx+4 mov di,bx+6 mul si mov bx+8,ax mov bx+0ah,dx,bx:数据指针,B*D,Bax Dsi Cdi,保存部分积1,mov ax,bx+2 mul si add ax,bx+0ah adc dx,0 mov bx+0ah,ax mov bx+0ch,dx mov ax,bx mul di add ax,bx+0ah adc dx,bx+0ch,Aax,A*D,B*C,Bax,部分积2低位加,部分积1的高位,保存,与部分积3加,mov bx+0ah,ax mov bx+0ch,dx pushf mov ax,bx+2 mul di add ax,bx+0ch adc dx,0 popf adc dx , 0 mov bx+0ch,ax mov bx+0eh,dx 20,A*C,Aax,保存后一次进位位,与部分积4加,保存,例: 有符号数相乘,(1) 符号处理 (2) 绝对值相乘,说明:,(1) 调用无符号数乘法子程序前的被乘数,乘数,乘积的符号处理。,bx为地址指针,置乘积符号位初值,Bax Adx Dsi Cdi,mov sign,0lea bx,mulnummov ax,bxmov dx,bx+2mov si,bx+4mov di,bx+6,cmp dx,0 jns other not ax not dx add ax,1 adc dx,0 not sign mov bx, ax mov bx+2,dx,检验被乘数符号,改变乘积符号位,为负取补,暂存被乘数,为正转other,other:cmp di,0 jns gomul not si not di add si,1 adc di,0 not sign gomul:call mulu32,检验乘数符号,改变乘积符号位,为负取补,调用无符号乘法程序,为正转gomul,(2) 调用子程序后,根据乘积的符号对乘积作处理。,检验乘积符号,为负取补,为正转done,cmp sign,0 je donenot word ptr bx+8not word ptr bx+0ahnot word ptr bx+0chnot word ptr bx+0ehadd word ptr bx+8,1adc word ptr bx+0ah,0 adc word ptr bx+0ch,0 adc word ptr bx+0eh,0done: ret start endp,三、分支程序,例:SIGEF:MOV AX,BUFFER OR AX, AX JE ZERO JNS PLUS MOV BX,0FFFFH JMP CONTIZERO:MOV BX,0 JMP CONTI PLUS:MOV BX,1CONTI: ,为负,建立条件,为0转ZERO,为正转PLUS,四、循环程序,组成: (1) 初始化 (2) 循环体 (3) 修改参数 (4) 循环控制,结构形式:,1.用计数器控制循环 (1)减1计数器 (2)加1计数器,例4-2:P.141在一串给定个数的数中寻找最大值,放至指定的存储单元,每个数为16位。,源程序名,COUNT=2n,n个数据字,放结果(最大值),(1)数据段,NAME SEARCH_MAXDATA SEGMENTBUFFER DW X1,X2,XNCOUNT EQU $-BUFFERMAX DW ? DATA ENDS,STACK SEGMENT STACK STACK DB 64 DUP(?) TOP EQU $-STACK STACK ENDS,TOP为栈顶偏移,64个字节,(2)堆栈段,CODE SEGMENTSTART PROC FAR ASSUME CS:CODE,DS:DATA,SS:STACKBEGIN: PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV AX,TOP MOV SP,AX,(4)置子程序返回地址,定义子程序,(3)代码段,置DS,置SS,置SP,MOV CX,COUNT LEA BX,BUFFER MOV AX,BX INC BX INC BX SHR CX DEC CX,AGAIN: CMP AX,BX JGE NEXT MOV AX,BX NEXT: INC BX INC BX LOOP AGAIN,MOV BX,AX RET START ENDP CODE ENDS END START 21,取第一个字,(5) 循环初始化,CX=2n,指针指向下一个字,(6) 循环体,比较,个数减1,2,CX=个数,AX大,转NEXT,最大值AX,(7) 修改参数,指针加1,(8)循环控制,CX-1CX,为0结束,存最大值,BX为数据指针,2.用开关变量控制循环,一个循环体中有两个循环支路,设一个开关变量,控制进入哪个循环支路。例:数据采集系统。 采到的前5个数用一种函数(FUN1)处理,开关=0。 采到的后7个数用另一种函数(FUN2)处理,开关=1。,说明:,(1)数据:data segmentbuffer dw 5,5,5,5,5,5,5,5,5,5,5,5block dw 12 dup(?)count1 equ 5count2 equ 7data ends,12个数据,个数,存结果,(2)初始化: 源数据指针 bufferbx 处理后数据指针 blocksi count1+1,count2+1cx 开关0dx(3)循环主体: 判开关量dx=0? dx=0 call fun1 5个数据处理完后dx=1,cx=count2+1 dx=1 call fun2 每处理完一个数,修改指针bx,si,mov dx,0mov cx,count1+1 lea bx,bufferleasi,blockagain:movax,bx cmpdx,0jneanothcallfun1loopnextmovdx,1movcx,count2+1jmpagainnext:movsi,axincbxincbxincsiincsijmpagainanoth:callfun2loopnextret,(1)循环初始化 开关dx=0cx为计数器bx源指针si目的指针,(2)循环主体,开关量转为1,为0,函数1处理,处理后保存,(3)修改参数,函数2处理,(4)循环控制,开关不为0转anoth,3.多重循环,一个循环中包含另一个循环,称多重循环。 如:二维数组处理,二重循环。注意: (1) 各重循环的初始控制条件及实现。 (2) 内循环可嵌套在外循环中,也可几个内循环并列在外循环中,可从内循环跳到外循环,不可从外循环中直接跳进内循环。 (3) 要防止出现死循环。,例:延时程序,多重循环实现软件延时。,DELAY:MOV DX,3FFH TIME:MOV AX,0FFFFH TIME1:DEC AX NOP JNE TIME1 DEC DX JNE TIME RET,内循环控制变量AX,初值=FFFFH,外循环控制变量DX,初值=3FFH,五、字符串处理程序,字符:ASCII码说明: (1) ASCII码数字、字母形成一个有序序列: 09:30H 39H AZ:41H 5AH az:61H 7AH (2) 一些I/O装置(键盘,显示器,打印机)采 用ASCII码传送。 (3) 常用的控制字符:0AH 换行(LF) 0DH 回车(CR),1.确定字符串长度,字符串长度不定,以某个特定字符为结束符。例4-3:从头搜索字符串的结束符,统计长度。,(1) 数据段,namelength_of_string data segmentstring db abcduvwxyz,0dhll db ?cr equ 0dh data ends,字符串string,cr:结束符,串长度放ll 单元,(2) 寄存器安排 字符串地址指针:DI 字符串长度: DL 串结束字符: AL,(3) 程序 lea di,string mov dl,0 mov al,cr again:scasb je done inc dl jmp again done:lea bx,ll mov bx,dl22,串地址偏移DI串长度DL=0结束符AL,找到,搜索串,未找到,长度加1,继续搜索,存长度,2.加偶校验到ASCII字符,ASCII码: 7位二进制数,最高位可作为校验位。,偶校验: 数据位1的个数为偶数,最高位置“0”,否则置“1”。,例4-4:有一个ASCII字符串放在STRING开始的单元,从串中取出每一个字符,检查“1”的个数,为偶数,则最高位置“0”;为奇数,最高位置“1”。,说明: lea si,stringmov cx,countagain:lodsb and al,al jpe next or al,80h mov si-1,alnext:dec cx jnz again,串指针:si串长度:cx,取数,si+1si,自行与,影响PF,奇,最高位置1,送回,偶,六、码转换程序,十六进制、二进制、BCD码、ASCII码 转换方法:(1) 算术和逻辑运算指令,软件实现;(2) 查表指令;(3) 硬件译码。,1.十六进制 ASCII例4-5:P.146,说明: (1) 十六进制: 09 AF ASCII码:30H39H 41H46H 对 0 9,加上30H 对 A F,加上A-10(2) 地址指针:源(十六进制) bx 目的(ASCII) si(3) cx=L1=2,每次循环转换一个字节两位十六进制数:低位与高位 拆开:1) ANDAL,0FH,2) MOVCL,4 SHRAL,CL,低四位,原高四位低四位,数据段,data segmentl1dw 2string db 14h,9Ahl2 dw ? bufferdb2*2dup(?)data ends,串长度l1,放串长度l2,十六进制数,放ASCII,again:mov al,bx mov dl,al and al,0fh call change mov al,dl push cx mov cl,4 shr al,cl pop cx call change inc bx loop again,取十六进制数,低四位ASCII,高四位ASCII,一位十六进制数 ASCII码子程序: change:proc cmp al,10 jl add_0 add al,A-0-10 add_0:add al,0 mov si,al inc si ret change endp,09转add_0,AF,09,2.ASCII压缩BCD,说明: (1)对非压缩BCD码,只要将ASCII的高4位屏蔽(AND)即可。 (2)对压缩BCD码,要处理两个ASCII码,先为低位BCD码,后为高位BCD码,组合起来。,data segment l2 dw 4buffer db 34h,33h,38h,39hl1 dw ? string db 2dup(?)data endsstack segment stack stack db 100dup(?)stack ends,ASCII,存BCD码,code segment assume cs:code,ds:data,es:data,ss:stack start proc far begin: push ds mov ax,0 push ax mov ax,data mov ds,ax mov es,ax,mov cx,l2 shr cx,1 mov l1,cx lea bx,buffer lea si,string again:mov al,bx and al,0fh mov dl,al inc bx mov al,bx and al,0fh,BCD码区长度,取ASCII码,化为BCD码,取下一个ASCII码,化为BCD码,push cx mov cl,4 shl al,cl pop cx or al,dl mov si,al inc bx inc si loop again retstart endpcode ends end begin,左移四位,组合两位BCD码,保存,修改指针,3.二进制到ASCII串,例4-6:P.179,把在内存变量NUMBER中的16位二进制数,每一位转换为相应的ASCII码,存入串变量STRING中。,分析: (1) 数据 buffer dw 4f78h ;16位二进制数 string dw 16dup(?) ;存ASCII码,(2) 代码段startprocfarbegin:pushdsmovax ,0pushaxmovax ,datamovds ,axmoves ,axlea di,string mov cx,length stringpushdipushcx,串指针di,串长度,moval,30hrepstosbpopcxpopdimoval,31hmovbx,num again:rclbx,1jncnextmovdi,alnext:incdiloopagainretstartendp codeends 23,建立串为全0,1的ASCII码,取数,左移一位,相应位进CF,为0,为1,1的ASCII码送串,4. BCD二进制,压缩BCD码4位二进制方法: (1)(千位10)+百位)10+十位)10+个位(2)千位控制加1000的次数,百位控制加100 的次数,十位控制加10的次数,再加上个位。 注意:所有运算都用二进制,例:采用第一种方法。 (千位10)+百位)10+十位)10+个位说明:(1)数据 dnum dw 9999h ;BCD码 bnum dw ? ;二进制数,(2)分离 mov ax,dnum mov di,ax mov dx,ax mov bx,ax and bx,000fh,and dx,00f0hmov cl,4shr dx,cl,and di,0f00h mov cl,8shr di,cl,and ax,0f000hmov cl,12shr ax,cl,十位dX,百位di,千位ax,个位bx,(3)乘以10,x10=x2+x8,add ax,axmov cx,axadd ax,axadd ax,axadd ax,cxadd ax,di,x8AX,x2CX,千位乘10,加上百位,也可采用循环结构进行。方法: 十进制数 Y=anXn+ +a1X1+a0 X=10 = (anX+an-1)X+ +a1)X+a0 初值 Y=an,i=n-1 Y=YX+ai i=i-1 结束条件:i0,5.二进制 BCD,十六位二进制数转换成BCD码。方法1: 找出二进制数中所包含的10000, 1000,100,10的个数,即BCD码。方法2: 二进制数B B=bm 2m+ +b1 21+b0 = (bm 2+bn-1) 2+ +b1) 2+a0 初值 B=0,i=m-1 B=B2+bi i=i-1 结束条件:i0 乘法和加法用十进制运算,结果为BCD码。,例:采用方法1,16位二进制5位非压缩BCD码,(2) mov ax,bnum lea bx,a_strg mov dl,0 ;计数清0,说明:(1)数据段 bnum dw 270fh ;16位二进制数 a_strg db 5dup(?) ;5个单元存BCD码,again1:sub ax,2710h js next1 inc dl jmp again1 next1:.,万位,包含10000的个数,9999,DX不变,btobcd proc far cmp dx,9999 jbe tran stc jmp exit tran:,9999,置CF=1,退出,tran:mov ax,0 mov cx,16 again:clc rcl dx,1 adc ax,ax daa loop again clc exit:ret btobcd endp 24,16位,结果(BCD)清0,循环左移biCF,B2+bi,十进制调整ax中为BCD,七、列,列:由数据单元(一个或多个字节)组成,称为元素,在存储器中顺序存放。 (1) 顺序是连续的。 (2) 顺序是链接的,每个元素由数据和指向下一元素的指针构成。列操作:查找(搜索,查询)、增加、删除、分类、排序,(一)无序列,1.加一个项至一个无序列 例1:缓冲区有一无序列,列长度放缓冲区第一字节,加一项。,说明:(1)数据元素: buffer db 10,abcdefghij db ? ;列最后 key db $ ;要加项(2)循环结构,数据指针:DI 长度:CX 关键字:AL,lea di,buffer mov ch,0 mov cl,di inc di mov al,key repnz scasb je done mov di,al inc buffer done:ret,指向列第一个元素,长度送cx,搜索关键字,不相等,项入列末,搜索停止,长度加1,2.从一个无序列中删去一个元素,例2:缓冲区有一无序列, 列长度放缓冲区第一个字节,另有一单元放删去元素。,说明:(1)数据元素: buffer db 10,abcdefghij key db f ;要删项(2)循环结构 数据指针:DI 长度:CX 关键字:AL,lea di,buffer mov ch,0 mov cl,di inc di mov al,key repne scasb jne done dec buffer mov si,di dec si xchg si,di rep movsb done:ret,指向列第一个元素,长度送cx,搜索关键字,找到,列长度减1,未找到结束,要删元素地址为目的di下一元素地址为源si,要删元素后的元素依次上移,3.找无序列中的最大值和最小值,例3:缓冲区有一无序列,列长度放缓冲区第一个字节,找最小值放MINVAL单元,最大值放MAXVAL单元。说明:(1)有符号数比较用JG大于转移,JL小于转移(2)数据 buffer db 10,22,-12,80,-6,-70,-9,127,-10,0,40 minval db ? maxval db ?,(3)lea bx,buffer mov ch,0 mov cl,bx inc bx mov al,bx mov minval,al mov maxval,al inc bx dec cx,指向第一个元素,长度送cx,地址指针bx,送al,minvalmaxval,bx指向第二个元素,调整循环次数,again:mov al,bx cmp al,minval je next jg a1 mov minval,al jmp next a1:cmp al,maxval jl next mov maxval,al next: inc bx dec cx jne again ret,把小的值送minval,与最小值比较,把大的值送maxval,与最大值比较,相等,大,小,(二)排序,无序列查找,比较慢,因要一项项顺序进行。 有序列,升序,降序,可提高效率。气泡分类法(Bubble Sort) 两两比较法,第一次: en,en-1比较,enen-1,不交换,否则交换 en-1,en-2比较,en-1en-2,不交换,否则交换 en-2,en-3比较,en-1en-2,不交换,否则交换,22-1280-6-70-9127-10040,e1 e2en-1 en,127,-10,-9,-10,e2,e1比较,e2e1,不交换,否则交换,e1最小值,-6,-70,-70,80,-70,-12,第二次: en,en-1比较,enen-1,不交换,否则交换 . e3,e2比较,e3e2,不交换,否则交换,e2第二小 .第n-1次: en,en-1比较,enen-1,不交换,否则交换,-70,22,(2)小循环J初值为n,循环一次,减1,N减至小于I时结束小循环。,(1)大循环I初值为2循环一次加1,即:第一次,从en至e2第二次,从en至e3 .第n-1次,en,算法说明,(3) 设一个交换标志,初值为N(即小循环J的初值) 在一次大循环中,若未发生交换,交换标志不变,发生交换,将此时小循环J赋给标志。 每次大循环结束时检查交换标志=N,则结束排序。因为交换标志=N表示:一次也没有发生交换本次大循环交换发生在en与en-1间,程序说明:(1)数组中的10个数据, 每个为2个字节。 buffer dw 22,-12,80,-6, -70, -9,127,-10,0,40 count equ $-buffer(2)寄存器分配 dx:大循环变量I,初值=2 cx:小循环变量J,初值=N bx:交换标志=J si: 地址指针,mov dx,2 ;大循环变量I conti:mov cx,count dec cx dec cx ;小循环变量J mov bx,cx ;交换标志 mov si,cx again:mov ax,buffersi cmp ax,buffersi-2 jge next xchg ax,buffersi-2 ;交换 mov si,ax mov bx,cx ;置交换标志 next:dec si dec si dec cx dec cx cmp cx ,dx ;JI jge again ;No,转again cmp bx,count-2 ;J eN/2,则下一次取区间eN/2eN与X比较,取e3N/4(3) 若XeJ X=eJ XeJ XeJ XeJ,(1) 数组10个,每个为2个字节。string dw -80,-50,-20,0, 30,40,100,2000, 10000, 25000 count equ $-buffer ptrn dw ? char dw 2020 ocunt: 20(2) 寄存器分配 si:区间上限L di:区间下限R bx:序号 ax:关键字2020,mov dx,1 ;dx作为搜索次数 conti:mov bx,si ;bx表示 J add bx,di ;上限+下限 shr bx,1 ;J=(上限+下限)/2 cmp ax,bx ;关键字与eJ比较 je found ;相等,找到转found pushf cmp bx,si ;J是否与区间上限相等 je nofod ;相等,找不到关键字,转 popf jle less ;XeJ,转less mov si,bx ;以J作为下一次的区间上限 jmp next less: mov di,bx ;以

温馨提示

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

评论

0/150

提交评论