版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第四节 汇编语言程序设计及举例z 概述z 顺序结构 z 分支程序z 循环程序z 字符串处理程序z 码转换程序z DOS系统功能调用z 宏汇编与条件汇编一、概述一、概述z1.编写步骤编写步骤z (1)分析问题,抽象出数学模型z (2)确定算法z (3)画程序流程图z (4)分配内存工作单元和寄存器。z (5)按程序流程图编制程序。z (6)上机调试,排错。起始框终止框工作框判断调子程序z2.程序质量判断程序质量判断z (1)执行时间z (2)占用内存空间z (3)语句行数z3.程序结构程序结构z 顺序z 分支z 循环z 子程序二、二、 顺序结构顺序结构z例4-1: 8086没有32位无符号数乘法
2、指令,需借助于16位无符号数乘法指令做4次乘法,然后把部分积相加, 。 z 16位z 16位z 部分积1z 部分积2z 部分积3z + 部分积4z 32位A BC DBDADBCAC设地址指针被乘数低16位BAX乘数低16位DSI存入缓冲区乘数高16位CDIB*D=部分积1被乘数高16位AAXA*D=部分积2部分积2低16位加部分积1高16位存入缓冲区B*C=部分积3进位加至部分积2高16位与前面对应16位相加保存进位部分积4与前面的和相加保存在缓冲区A*C=部分积4恢复进位返回说明:z(1)数据段:mulnum dw 0000,0ffffh,0000,0ffffh,4dup(?) 被乘数 乘
3、数 乘积z(2)堆栈段:z stack segment para stack stack db 100dup(?) stack ends NAME MULTIPLY_32BITDATA SEGMENTMULNUM DW 8000H,0001H,0FFFH,0001H ;定义被乘数B、A与乘数D、CPRODUCT DW 4 DUP(?) ;定义乘积,低字在前DATA ENDSSTACK SEGMENT PARA STACK STACKDB 100 DUP(?) ;初始化堆栈大小为100byteSTACK ENDS CODE SEGMENTASSUME CS: CODE,DS:DATA,SS:ST
4、ACKSTART PROC FARBEGIN: PUSH DS ; DS中包含的是程序段前缀的起始地址MOV AX,0PUSH AX ; 设置返回至DOS的段值和偏移量MOV AX, DATAMOV DS, AX ; 置段寄存器初值MOV BX, 0MULU32: MOV AX, MULNUMBX ; BAXMOV SI, MULNUMBX+4 ; DSIMOV DI, MULNUMBX+6 ; CDIMUL SI ; BDMOV PRODUCTBX, AX ; 保存部分积1MOV PRODUCTBX+2, DXMOV AX, MULNUMBX+2 ; AAXMUL SI ; ADADD AX
5、, PRODUCTBX+2ADC DX, 0 ; 部分积2的一部分与部分积1的相应部分相加MOV PRODUCTBX+2, AXMOV PRODUCTBX+4, DX ; 保存MOV AX, MULNUMBX ; BAXMUL DI ; BCADD AX, PRODUCTBX+2 ; 与部分积3的相应部分相加 ADC DX, PRODUCTBX+4MOV PRODUCTBX+2, AXMOV PRODUCTBX+4, DXPUSHF ; 保存后一次相加的进位标志MOV AX, MULNUMBX+2 ; AAXMUL DI ; ACPOPF;标志出栈ADC DX,0ADC AX, PRODUCT
6、BX+4 ; 与部分积4的相应部分相加ADC DX, 0MOV PRODUCTBX+4, AXMOV PRODUCTBX+6, DXRETSTART ENDPCODE ENDSEND BEGIN 分支程序的基本思想是根据逻辑判断的结果来形成程序的分支。分支有两分支和多分支。对于两分支,若条件P成立则执行A;否则执行B,如图4.2所示三、分支程序三、分支程序三、分支程序三、分支程序z z例: SIGEF:MOV AX,BUFFER OR AX, AX ;建立条件 JE ZERO ;为0转ZERO JNS PLUS ;为正转PLUS MOV BX,0FFH ;为负 JMP CONTI ZERO:M
7、OV BX,0 JMP CONTI PLUS:MOV BX,1 CONTI: y-1判断y0y1X0X=0四、循环程序四、循环程序z结构形式:z z 先执行,后判断 先判断,后执行z组成: (1) 初始化z (2) 循环体z (3) 修改参数z (4) 循环控制初始化循环控制循环体修改参数入口出口初始化循环控制循环体修改参数入口出口z1.用计数器控制循环用计数器控制循环z (1)减1计数器z (2)加1计数器例4-2:P.141在一串给定个数的数中寻找最大值,放至指定的存储单元,每个数为16位。 NAME SEARCH_MAX ;源程序名 DATA SEGMENT ;(1)数据段 BUFFER
8、 DW X1,X2,XN ;n个数据字 COUNT EQU $-BUFFER ;COUNT=2n MAX DW ? ;放结果(最大值) DATA ENDS STACK SEGMENT STACK STACK ;(2)堆栈段 DB 64 DUP(?) ;64个字节 TOP EQU $-STACK ;TOP为栈顶偏移 STACK ENDS CODE SEGMENT ;(3) 代码段 START PROC FAR ; 定义子程序 ASSUME CS:CODE,DS:DATA,SS:STACK BEGIN: PUSH DS ;(4)置子程序返回地址 MOV AX,0 PUSH AX MOV AX,DA
9、TA ;置DS MOV DS,AX MOV AX,STACK ;置SS MOV SS,AX MOV AX,TOP ;置SP MOV SP,AX MOV CX,COUNT ;(5) 循环初始化,CX=2n LEA BX,BUFFER ; BX为数据指针 MOV AX,BX ; 取第一个字 INC BX ; 指针指向下一个字 INC BX SHR CX ; CX=个数 DEC CX ; 个数减1 AGAIN: CMP AX,BX ;(6) 循环体,比较 JGE NEXT ; AX大,转NEXT MOV AX,BX ; 最大值AX NEXT: INC BX ;(7) 修改参数,指针加1 INC BX
10、 LOOP AGAIN ;(8)循环控制,CX-1CX,为0结束 MOV BX,AX ;存最大值 RET START ENDP CODE ENDS END START 2.2.用开关变量控制循环用开关变量控制循环z 一个循环体中有两个循环支路,设一个开关变量,控制进入哪个循环支路。z例:数据采集系统。z 采到的前5个数用一种函数(FUN1)处理,开关=0。z 采到的后7个数用另一种函数(FUN2)处理,开关=1。说明:z(1)数据:buffer dw 05,05,. ;12个数据 block dw 12 dup(?) ;存结果 count1 equ 5 ;个数 count2 equ 7 ;个数
11、z(2)初始化:源数据指针 bufferbxz 处理后数据指针 blocksiz count1+1,count2+1cxz 开关0dxz(3)循环主体: 判开关量dx=0? dx=0 call fun1z 5个数据处理完后dx=1,cx=count2+1 dx=1 call fun2z 每处理完一个数,修改指针bx,si mov dx,0 ;(1)循环初始化 开关dx=0mov cx,count1+1 ; cx为计数器 lea bx,buffer ; bx源指针leasi,block ; si目的指针again:mov ax,bx ;(2)循环主体 cmpdx,0jneanoth; 开关不为0
12、转anothcallfun1; 为0,函数1处理loopnextmovdx,1; 开关量转为1movcx,count2+1jmpagainnext:movsi,ax; 处理后保存incbx ; (3)修改参数incbxincsiincsijmpagainanoth:callfun2; 函数2处理loopnext ;(4)循环控制ret 2222223.3.多重循环多重循环z 一个循环中包含另一个循环,称多重循环。z 如:二维数组处理,二重循环。z注意:z (1)各重循环的初始控制条件及实现。z (2)内循环可嵌套在外循环中,也可几个内循环并列在外循环中,可从内循环跳到外循环,不可从外循环中直接
13、跳进内循环。z (3)要防止出现死循环。 z例:延时程序,多重循环实现软件延时。z DELAY:MOV DX,3FFH TIME:MOV AX,0FFFFH TIME1:DEC AX NOP JNE TIME1 DEC DX JNE TIME RETz 内循环控制变量AX,初值=FFFFHz 外循环控制变量DX,初值=3FFH五、字符串处理程序五、字符串处理程序z字符:ASCII码z说明:z (1)ASCII码数字,字母形成一个有序序列:z 09:30H39Hz AZ:41H5AHz az:61H 7AHz (2)一些I/O装置(键盘,显示器,打印机)采 用ASCII码传送。z (3)常用的控
14、制字符:0AH 换行(LF)z 0DH 回车(CR)z 08H 退格1.1.确定字符串长度确定字符串长度z 字符串长度不定,以某个特定字符为结束符。z例4-3:从头搜索字符串的结束符,统计长度。z 字符串地址指针:DIz 字符串长度: DLz 串结束字符: ALz (1)数据段:串放string开始单元z 串长度放LL单元z 结束符放CR单元z (2) 堆栈段:100个字节 长度=0CF=0?取串元素设置字符串指针返回长度+1存串元素YNz (3) 程序 lea di,string ;串地址偏移DI mov dl,0 ;串长度初始DL=0 mov al,cr ;结束符AL again:scas
15、b ;搜索串 je done;找到转DONE,停止搜索 inc dl ;未找到,长度加1 jmp again ;继续搜索 done:lea bx,ll mov bx,dl ;存长度 RETSTART ENDPCODE ENDSEND BEGIN2.2.加偶校验到加偶校验到ASCIIASCII字符字符zASCII码:7位二进制数,最高z 位可作为校验位。z偶校验:1的个数为偶数,最高z 位置“0”,否则置“1”。z例4-4:有一个ASCII字符串放z在STRING开始的单元,从串z中取出每一个字符,检查“1”z的个数,为偶数,则最高位z置“0”;为奇数,最高位置“1”。 取元素“1”为偶数?自行
16、与初始化返回最高位置1送回串中长度修改=0?NNYY说明:说明: lea si,string ;串指针:si mov cx,count ;串长度:cx again:lodsb ;取数,si+1si/LODSB块装入指令 把SI指向的存储单元读入累加器,LODSB就读入 AL,LODSW就读入AX中,然后SI自动增加或减小1或2. and al,al ;自行与,影响PF jpe next ;偶,转至next or al,80h ;奇,最高位置1 mov si-1,al ;送回 next:dec cx ;修改长度 jnz again ;0,转again六、码转换程序六、码转换程序z 十六进制,二进
17、制,BCD码,ASCII码z转换方法:z(1) 算术和逻辑运算指令,软件实现;z(2) 查表指令;z(3) 硬件译码。z1.十六进制十六进制ASCIIz说明:说明: z(1) 十六进制: 09 AF ASCII码:30H39H 41H46Hz 对 0 9,加上30H 对 A F,加上A-10 30H+0AH+07H=41H z(2) 地址指针:源(十六进制) bx 目的(ASCII) siz(3) cx=L1=2,每次循环转换一个字节两位十六进制数:低位与高位 拆开:1) ANDAL,0FH ;留下低四位 2) MOVCL,4 SHRAL,CL ;原高四位 低四位z1.十六进制十六进制ASCI
18、Iagain:mov al,bx ;取十六进制数 mov dl,al ;保存 and al,0fh ;留下低四位 call change ;低四位ASCII mov al,dl ;取数 push cx mov cl,4 ;移位次数 shr al,cl ;原高四位 低四位 pop cx call change ;高四位ASCII inc bx loop again一位十六进制数 ASCII码子程序: change:proc cmp al,10 jl add_0 ;09转add_0 add al,A-0-10 ;AF add_0:add al,0 mov si,al inc si ret chan
19、ge endp2.ASCII压缩压缩BCDz 长度L2 长度L1 buffer string 压缩BCD ASCII码 非压缩BCDz说明:说明:z (1)对非压缩BCD码,只要将ASCII的高4位屏蔽(AND)即可z (2)对压缩BCD码,要处理两个ASCII码,先为低位BCD码,后为高位BCD码,组合组合起来。 434H33H38H39H234H98H404030809data segment l2 dw 4buffer db 34h,33h,38h,39h ;ASCIIl1 dw ? string db 4dup(?) ;存BCD码data endsstack segment stack
20、 stack db 100dup(?)stack ends 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 ;BCD码区长度 lea bx,buffer lea si,string again:mov al,bx ;取ASCII码 and al,0fh ;化为BCD码 mov dl,al ;保存 inc bx ;指向下一个
21、mov al,bx ;取ASCII码 and al,0fh ;化为BCD码 push cx mov cl,4 shl al,cl ;左移四位 pop cx or al,dl ;组合两位BCD码 mov si,al ;保存 inc bx ;修改指针 inc si loop again retstart endpcode ends end begin3.3.二进制到二进制到ASCII串串z例4-6:P.179,把在内z存变量NUMBER中的16位z二进制数,每一位转换z为相应的ASCII码,存入z串变量STRING中。z分析:分析: z(1) 数据 zbuffer dw 4f78h ;16位二进制
22、数 zstring dw 16dup(?) ;存ASCII码 取要转换数C=“1”?左移1位0填满串返回存入1修改地址指针完成否?YNYN初始化z(2) 代码段startproc farbegin:push dsmov ax ,0push axmov ax ,datamov ds ,axmov es ,axlea di,string ;串指针dimov cx,length string ;串长度push dipush cxmov al,30h;0的ASCII码repstosb;建立串为全0popcxpopdimov al,31h;1的ASCII码mov bx,num;取数 again:rclb
23、x,1 ;左移一位,相应位进CFjncnext ;为0转nextmov di,al ;为1,1的ASCII码送串 next:incdiloop againretstartendp codeends 2424244.BCD二进制二进制z 压缩BCD码4位二进制z方法: z(1)(千位10)+百位)10+十位)10+个位z(2)千位控制加1000的次数,百位控制加100 的次数,十位控制加10的次数,再加上个位。 z注意:注意:所有运算都用二进制z例:采用第一种方法。 (千位10)+百位)10+十位)10+个位z说明:z(1)数据 dnum dw 9999h ;BCD码 bnum dw ? ;二进
24、制数 z(2)分离 mov ax,dnum mov di,ax mov dx,ax mov bx,ax and bx,000fh ;个位bx and dx,00f0h mov cl,4 shr dx,cl ;十位di and di,0f00h mov cl,8 shr di,cl ;百位di and ax,0f000h mov cl,12 shr ax,cl ;千位axz(3)乘以10,x10=x2+x8 add ax,ax mov cx,ax add ax,ax add ax,ax add ax,cx ;千位乘10 add ax,di ;加上百位 z 也可采用循环结构进行。z方法: 十进制数
25、 z Y=anXn+ +a1X1+a0 X=10 = (anX+an-1)X+ +a1)X+a0z 初值 Y=an,i=n-1 Y=YX+ai i=i-1 结束条件:i0 5.二进制二进制 BCDz 十六位二进制数转换成BCD码。z方法1: 找出二进制数中所包含的10000, 1000,100,10的个数,即BCD码。z方法2: 二进制数Bz B=bm 2m+ +b1 21+b0 = (bm 2+bn-1) 2+ +b1) 2+a0z 初值 B=0,i=m-1 B=B2+bi i=i-1 结束条件:i0z 乘法和加法用十进制运算十进制运算,结果为BCD码。 z 例例:采用方法1,16位二进制5
26、位非压缩BCD码z说明:(1)数据段 bnum dw 270fh ;16位二进制数 a_strg db 5dup(?) ;5个单元存BCD码 (2) mov ax,bnum lea bx,a_strg mov dl,0 ;计数清0 again1:sub ax,2710h ;减10000 js next1 ;9999,DX不变z btobcd proc far cmp dx,9999 jbe tran ;dx9999,置CF=1,退出 jmp exit tran: tran:mov ax,0 ;结果(BCD)清0 mov cx,16 ;16位 again:clc rcl dx,1 ;循环左移bi
27、CF adc ax,ax ;B2+bi daa ;十进制调整,ax中为BCD loop again clc exit:ret btobcd endp 252525七、七、DOSDOS系统功能调用系统功能调用zDOS(Disk Operating System)z核心:核心:z 有关I/O驱动、磁盘读写以及文件管理子程序,编了号供汇编语言的源程序调用。z方法:方法:z (1) 子程序号(或称系统功能调用号)送AHz (2) 入口参数指定寄存器z (3) INT 21Hz (4) 根据出口参数分析功能调用执行情况1. 显示显示AH 功能 入口参数 2 显示一个字符 DL=字符 9 显示一个字符串
28、DS:DX=串地址,串以$结束z 例:在CRT上显示一个字符。 MOV DL,OUTPUT_CHAR MOV AH,2 INT 21Hz 例:功能调用9,连续显示字符串。 mov dx,offset buffer mov ah,9 int 21hz 例:P.150,功能调用9,在CRT上连续显示0059。 z分析:分析:z cx:循环次数z bl:要显示的两位十进制数0059z si:缓冲区指针bufferz movcx,1000z movbl,0z lea si,buffer z一次循环: pushbxgoon: movdl,0dh mov ah,2 ;输出回车符 int 21hmovdl,0ah mov ah,2 ;输出换行处理 int 21h popbx mov al,bl;(2) bl+1bl inc aldaacmpal,60hjcnextmoval,0 znext:movbl,al ;(3) 高四位ASCII码 pushbx movdl,al pushcx movcl,4 shral,cl or al,30h;把AL十进制转换为ASCII movsi,al incsi moval,dl ;(4) 低四位ASCII码 andal,0fh; AL寄存器的低4位清零 or al,30h;把AL个位转换为ASCII mo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 销售部门年度工作总结
- 科技公司专利代理协议(3篇)
- 数学主题演讲5分钟(34篇)
- 技术工程师岗位职责(33篇)
- 工程技术员个人年度工作总结范文
- 2024年铝锻压材项目资金需求报告代可行性研究报告
- 茶文化与茶艺鉴赏 教案 项目三 明茶礼-茶艺礼仪
- 智慧视觉AR交互装置技术要求征求意见稿
- 上海市市辖区(2024年-2025年小学五年级语文)统编版质量测试(上学期)试卷及答案
- 深圳2020-2024年中考英语真题专题06 阅读匹配(原卷版)
- 沪科版(2024)八年级全一册物理第一学期期中学业质量测试卷 2套(含答案)
- 化工和危险化学品生产经营单位二十条重大隐患判定标准释义(中化协)
- 愚公移山英文 -中国故事英文版课件
- 课件交互设计
- 社区获得性肺炎教学查房
- 浅析语言和言语的关系及其对外语教学的启示.doc
- 精神病医院住院患者护理评估单
- 生活中的音乐教案
- 辩论赛评分表(完整版)-
- 电子商务支付与安全课程标准
- 海水淡化装置项目投资商业计划书
评论
0/150
提交评论