第4章汇编语言 程序设计03.ppt_第1页
第4章汇编语言 程序设计03.ppt_第2页
第4章汇编语言 程序设计03.ppt_第3页
第4章汇编语言 程序设计03.ppt_第4页
第4章汇编语言 程序设计03.ppt_第5页
已阅读5页,还剩70页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

1、,4.6 汇编语言程序设计及举例,4.6.1 概述,编写汇编语言程序的步骤 数学模型确定算法流程图分配内存寄存器编制程序 判断程序质量的标准 执行时间,所占内存,语句行数 程序流程图,程序流程图,顺序程序结构,条件程序结构,分支程序结构,Y,N,一般语句,If else 语句,Switch 语句,工作框,判断框,箭头表示程序走向,程序流程图,循环控制结构 1,循环控制结构 2,N,N,Y,Y,while 语句,do -while 语句,编写完整的汇编语言程序,用8086的16位无符号数乘法指令实现两个32位无符号数的乘法运算。,算法分析:8086没有32位无符号数乘法指令,需借助于16位无符号

2、数乘法指令做4次乘法,然后把部分积相加,如下图所示。,4.6.2 算术运算程序设计,完整的汇编语言程序如下:,NAME MULTIPLY_32BIT DATA SEGMENT MULNUM DW 8000H,0001H, 0FFFH, 0001H,4 DUP(?) DATA ENDS STACK SEGMENT PARA STACK STACK DB 100 DUP(?) STACK ENDS,CODE SEGMENT ASSUME CS: CODE,DS:DATA,SS:STACK START PROC FAR BEGIN: PUSH DS ; DS中包含的是程序段前缀的段地址 MOV AX

3、,0 PUSH AX ; 设置返回至DOS的段值和偏移量 MOV AX, DATA MOV DS, AX ; 置段寄存器初值 LEA BX, MULNUM MULU32: MOV AX, BX ; BAX MOV SI, BX+4 ; DSI MOV DI, BX+6 ; CDI,MUL SI ; BD MOV BX + 8, AX ; 保存部分积1 MOV BX + 0AH, DX MOV AX, BX+2 ; AAX MUL SI ; AD ADD AX, BX + 0AH ADC DX, 0 ; 部分积2的一部分与部分 ; 积1的相应部分相加 MOV BX + 0AH, AX MOV B

4、X + 0CH, DX ; 保存 MOV AX, BX ; BAX MUL DI ; BC ADD AX, BX + 0AH ;与部分积3的相应部分相加 ADC DX, BX + 0CH,MOV BX + 0AH, AX MOV BX + 0CH, DX PUSHF ; 保存后一次相加的进位标志 MOV AX, BX + 0AH ; AAX MUL DI ; AC POPF ADC AX, BX + 0CH ; 与部分积4的相应部分相加 ADC DX, 0 MOV BX + 0CH, AX MOV BX + 0EH, DX RET START ENDP CODE ENDS END BEGIN,

5、例 试编写程序段,实现符号函数。,4.6.3 分支程序设计,相应的程序段为;,一段程序有时重复执行多次,就牵涉到循环程序结构,其组成部分为:,4.6.4 循环程序设计,(1) 用计数器控制循环,DATA SEGMENT ARRAY DW 8 ; 元素个数 DW 230, -1437, 26, -31, 0, 3458, 0, 10 POST DW 0 NEGA DW 0 ZERO DW 0 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX, DATA MOV DS, AX XOR AX, AX ; 用AX作为正数的计数器

6、XOR BX, BX ; 用BX作为负数的计数器 XOR DX, DX ; 用DX作为零的计数器,MOV CX, ARRAY ; 用CX来进行循环计数 JCXZ DONE ; 考虑数组的元素个数为0的情况 LEA DI, ARRAY+2 ; 用指针DI来访问整个数组 AGAIN: CMP WORD PTRDI, 0 ; 与0做比较 JG HIGH ; 大于0,为正数 JE EQUAL ; 等于0 INC BX ; 小于0,为负数,负数个数增1 JMP NEXT HIGH: INC AX ; 正数个数增1 JMP NEXT EQUAL: INC DX ; 0的个数增1 NEXT: INC DI

7、INC DI LOOP AGAIN,DONE: MOV POST, AX ; 把各类的统计数保存到内存单元中 MOV NEGA, BX MOV ZERO, DX MOV AX, 4C00H ; 结束程序返回DOS INT 21H CODE ENDS END START,(2) 按问题的条件控制循环,程序段如下: MOV CX,16 ; 16次循环 MOV SI,0 ; SI中存放0的个数 MOV DI,0 ; DI中存放1的个数 MOV AX,VAL AGAIN: SHL AX, 1 JC NOZERO ; 为1,转走 INC SI ; 为0,SI加1 JMP NEXT NOZERO: INC

8、 DI ; 为1,DI加1 NEXT: LOOP AGAIN MOV X, SI MOV Y, DI,4.5.4 字符串处理程序设计,计算机经常要处理字符,常用的字符编码是ASCII码。在使用ASCII码字符时,要注意以下几点: (1) ASCII码的数字和字符形成一个有序序列。例如数字09的ASCII码为30H39H,大写字母 AZ的ASCII码为41H5AH等。 (2) 计算机并不区分可打印的和不可打印的字符,只有I/O装置(例如显示器、打印机)才加以区分。 (3) 一个I/O装置只按ASCII码处理数据。例如要打印数码7,必须向它送7的ASCII码37H,而不是响铃符07H。若按数字键9

9、,键盘送至主机的是9的ASCII码39H。,(4) 许多ASCII装置(例如键盘、显示器、打印机等)并不用整个ASCII字符集。例如,有的忽略了许多控制字符和小写字母。 (5) 不同的设备对ASCII控制字符的解释往往不同,在使用中需要注意。 (6) 一些广泛使用的控制字符为: 0AH 换行(LF) 0DH回车(CR) 08H退格 7BH删除字符(DEL) (7) 基本ASCII字符集的编码为7位,在微型计算机中就用一个字节(最高位为零)来表示。,1. 确定字符串的长度 系统中字符串的长度是不固定的。通常以某个特殊字符作为结束标志,例如有的用回车符(CR),有的用字符。在对字符串操作时往往要确

10、定它的长度。 例4-3从头搜索字符串的结束标志,统计搜索的字符个数,其流程图如图4-6所示。,namelength_of_string datasegment stringdbabcduvwxyz, 0dh count equ $ - string lldb? crequ0dh dataends stacksegment parastackstack db100 dup(?) stackends codesegment assumecs:code,ds:data,es:data,ss:stack,Startprocfar begin: pushds movax,0 pushax movax,d

11、ata movds,ax moves,ax leadi, string;设串的地址指针 movdl,0;置串长度初值为0 moval, cr;串结束标志AL mov cx, count + 10 cld again: scasb;搜索串,jedone;找到结束标志,停止 incdl;串长度加1 dc cx jne again jmperror done: leabx, ll movbx,dl ret error : hlt startendp codeends endbegin,例,将表中数据从乱序 25、46 、3 、75 、5 、30 到升序 3 、5 、25 、30 、46 、75,4.

12、5.6 排序,方法一 全比较法 若表数据项为 N,要进行 N-1 次排序操作 第一次,经比较将最小数放入表顶 第二次,经比较将次小数放入表次顶 . 第N-2次,经比较将次大数放入表次底 第N-1次,经比较将最大数放入表底,注:每次找最小的数为内循环,比较 N 1 次, 共需处理 N 1 次为外循环。,方法二 标志位识别法 设排序标志 F 若标志 F = -1 进入比较排序程序 (冒泡法) 若标志 F = 0 数己排好,退出比较排序程序 注: 对 N 项数,外循环次数 N-1,汽泡图 (从下向上比大小),原数据,第一次,第二次,第三次,重排一次,内 循 环,外循环,流程图,标志(BL) = -1

13、,开 始,(BL) = 0,结束,(BL) = 0 标志 (CX) = N 1 计数 (SI) = N 1 指针,j-1 j,j-1 j,(BL) = -1,(SI)=(SI)-1 (CX)=(CX)-1,(CX) = 0,Y,Y,Y,数据段定义 DAT SEGMENT ;段名 DAT BUF DB 25,46,3,75,5,30 COUNT EQU $ - BUF ;数据个数 DAT ENDS,代码段编程 COD SEGMENT ;段名为 CODE ASSUME CS: COD, DS: DAT SORD PROC FAR ;过程名为 SORD START: PUSH DS MOV AX,

14、0 PUSH AX MOV AX,DAT MOV DS,AX ;过程定义标准写法,代码段编程 MOV BL,0FFH ;标志( BL ) = -1 AG0:CMP BL,0 ;AG0 为外循环 JZ EXIT MOV BL,0 ;假定此次排序无数据交换 MOV CX,COUNT - 1 ;( CX ) = N 1 MOV SI,COUNT - 1 ;SI 指向表底,代码段编程 AG1:MOV AL, SI ;AG1 为内循环 CMP AL, SI - 1 ;两相邻单元比较 JAE UNCH ; SI SI-1 不交换 XCHG AL, SI - 1 ; SI-1 SI 交换 MOV SI,AL

15、 ; SISI-1交换 MOV BL,0FFH ; 有交换, 未排好, ; 重排,(BL)= -1 UNCH:,代码段编程 UNCH:DEC SI ;内循环中下一个相邻数比较 DEC CX JNZ AG1 ;一个数排好(内循环) JMP AG0 ; 所有数排好(外循环) EXIT: RET ; 过程返回 SORD ENDP ; 过程结束 COD ENDS ; 代码段结束 END START ; 汇编结束,5.6.4 子程序设计,子程序是程序设计中经常使用的程序结构,通过把一些固定的、经常使用的功能做成子程序的形式,可以使源程序及目标程序大大缩短,提高程序设计的效率和可靠性。,在主程序与子程序中

16、经常要进行参数传递。参数传递一般有三种方法: 利用寄存器。这是一种最常见方法,把所需传递的参数直接放在主程序的寄存器中传递给子程序。 利用存储单元。主程序把参数放在公共存储单元,子程序则从公共存储单元取得参数。 利用堆栈。主程序将参数压入堆栈,子程序运行时则从堆栈中取参数。,DATA SEGMENT NUMBIN DB 0E7H ; 待转换的单字节二进制数 STRING DB 10 DUP(20H) ; 定义显示缓冲区 DB 0DH, 0AH ; 定义回车换行符 DB $ ; 定义结束符 DATA ENDS STACK SEGMENT PARA STACK STACK DB 100 DUP(?

17、) STACK ENDS CODE SEGMENT ASSUME CS: CODE,DS:DATA,SS:STACK START PROC FAR,BEGIN: PUSH DS MOV AX,0 PUSH AX MOV AX, DATA MOV DS, AX ; 置段寄存器初值 LEA DI, STRING XOR AH, AH ; AH清零 MOV AL, NUMBIN MOV BL, 100D DIV BL ; AX除以BL,商在AL中,余数在AH中 CALL BCDTOASC ; 调用转换程序,入口参数: ; AL=BCD数 MOV AL, AH ; 取余数送AL XOR AH, AH,

18、MOV BL, 10D DIV BL CALL BCDTOASC MOV AL, AH CALL BCDTOASC CALL DISPASC ; 调用显示程序 RET START ENDP BCDTOASC PROC ; BCD码到ASCII码转换程序 ADD AL, 30H MOV DI, AL ; 保存ASCII字符 INC DI ; 指向下一个单元 RET BCDTOASC ENDP,DISPASC PROC ; 显示子程序 LEA DX, STRING MOV AH, 09H INT 21H RET DISPASC ENDP CODE ENDS END BEGIN,5.5 汇编语言程序

19、与DOS的接口,5.5.1 DOS和BIOS的功能调用,1DOS系统功能调用的一般步骤,DOS为磁盘操作系统(Disk Operating System)的简称。DOS提供了极为丰富的子程序,能够实现控制键盘、显示器、读写文件、串行通信等一系列功能。,使用DOS系统功能调用的一般过程:见下图所示。,系统功能调用的方法,(1)键盘输入 (1号调用),功能:等待从键盘输入一个字符并将输入字符的ASCII码送入寄存器AL中,同时在显示器上显示该字符,碰到CTRL+Break则退出。,2DOS系统功能调用的一般步骤,(2)显示单个字符 (2号调用),功能:将DL中的字符送显示器显示,若为CTRL+Br

20、eak的ASCII码则退出。,(3) 显示字符串 (9号调用),功能:将当前数据区中以 $结尾的字符串送显示器显示。,(4) 键盘输入字符串 (10号调用),功能:从键盘上往指定缓冲区中输入字符串并送显示器显示。,例1 在CRT上连续输出字符09,nameoutput_char_0_9 stacksegmentpara stackstack db100 dup(?) stackends codesegment assumecs: code,ss: stack startprocfar begin: pushds movax,0 pushax movbl,0 pushbx goon: movd1

21、,20h;把空格字符DL movah,2,int21h;输出空格字符 popbx moval,bl incal daa;增量后进行十进制调整 andal,0fh movbl,al pushbx oral,30h;转换为ASCII码 movd1,al movah,2 int21h;输出一个09之间的字符 movcx,0ffffh;为便于观察,插入一定的延时,again:deccx jneagain jmpgoon start endp codeends endbegin,2. 在CRT上连续显示0059,nameoutput_char_00_59 stacksegmentpara stackst

22、ack db100 dup(?) stackends datasegment bufferdb3 dup(?) dataends codesegment assumecs: code,ds: data,ss: stack startprocfar begin: pushds movax,0 pushax movax,data,movds,ax movcx,1000;设置最大的循环次数 movbl,0 leasi,buffer pushbx goon: movdl,0dh movah,2;输出回车符 int21h movdl,0ah movah,2 int21h popbx moval,bl,i

23、ncal daa cmpal,60h;AL增加到60了吗 jcnext;未达到,转去显示 moval,0;已到60,置为0 next: movbl,al pushbx movdl,al pushcx movcl,4 shral,cl oral,30h;把AL中十位数,转换为ASCII码 movsi,al,incsi moval,dl andal,0fh oral,30h;把AL中的个位数,转换为ASCII码 movsi,al incsi moval, movsi,al movdx,offset buffer movah,9 int21h;输出字符串 movcx,0ffffh again: de

24、ccx,jneagain popcx deccx jedone movsi,offset buffer jmpgoon done:ret startendp codeends endbegin,1. 宏指令的用途 (1) 在汇编语言的源程序中,若有的程序段要多次使用,为了使在源程序中不重复书写这个程序段,可以用一条宏指令来代替。由宏汇编程序在汇编时产生所需要的代码。,4.6.9 宏汇编,MACRO、ENDM 宏定义伪指令,宏定义 宏调用,宏名标识符 MACRO 宏体 ENDM,宏名标识符 ,4.6.9 宏汇编,宏定义伪指令的应用,用宏指令代替需要重复书写的程序段 具有接收参量的能力 形式参量不

25、仅可出现在操作数部分,也可以出现在操作码部分,宏定义伪指令的应用,无参数宏定义及宏调用 有参数宏定义及宏调用,定义: SHIF MACRO MOV CL,4 SHL AX,CL ENDM,调用: MOV DX,2000H SHIF MOV BX ,AX,定义: SHIF MACRO CN,R MOV CL,CN SHL R,CL ENDM,调用: MOV DX,2000H SHIF 4,AX SHIF 5,BL MOV BX ,AX,主要宏定义伪指令,(1) MACRO、ENDM,宏名标识符 MACRO 宏体 ENDM,(2) PURGE,PURGE 宏名标识符,,一个宏定义名,可以用伪指令P

26、URGE来取消,一个PURGE可以取消多个宏定义,主要宏定义伪指令,(3) LOCAL,LOCAL 形参表,宏定义体内允许使用标号。例如,在AL中有1位十六进制数码要转换为ASCII码,则可以用以下宏定义: CHANGE MACRO CMPAL,10 JLADD_0 ADDAL,A-0-10 ADD_0ADDAL,0 ENDM,若在一个程序中多次使用这条宏指令,则在汇编展开时,标号ADD_0就会出现重复定义的错误,这是不允许的。 CHANGE MACRO LOCAL ADD_0 CMPAL,10 JLADD_0 ADDAL,A-0-10 ADD_0ADDAL,0 ENDM 注意: LOCAL必须是MACRO伪操作后的第一个语句,MACRO与LOCAL之间不允许有注释和分号标志。,主要宏定义伪指令,(4) REPT,REPT 宏体 ENDM,这个伪指令可以重复执行在它的指令体部分所包含的语句。重复执行的次数,由表达式的值所决定,功能,例如: 把110分配给十个连续的存储单元。 X = 0 REPT10 X = X+1 DBX ENDM 利用这个伪指令可以对某个存储区赋值(建立一个表)。,主要宏定

温馨提示

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

最新文档

评论

0/150

提交评论