微机原理及接口技术微机原理第04章3.ppt_第1页
微机原理及接口技术微机原理第04章3.ppt_第2页
微机原理及接口技术微机原理第04章3.ppt_第3页
微机原理及接口技术微机原理第04章3.ppt_第4页
微机原理及接口技术微机原理第04章3.ppt_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

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

文档简介

1、第4章,第4章:例源程序文件wjl301.asm,my_data segment again: Mov al,si array1 db 05,a2H,00,10H,85H Inc si n equ 5 Cmp al, 50 array2 db n dup(?) Jbe next my_data ends Mov di, al my_code segment Inc di assume cs:my_code next: dec cx assume ds:my_data jnz again begin: mov ax, my_data mov ah,4ch mov ds, ax int 21h L

2、ea si, array1 my_code ends Lea di, array2 end begin Mov cx, n,4.2.3. 程序开始,为了指明程序开始执行的位置,需要使用一个标号(例题中采用了begin标识符) 连接程序会根据程序起始点正确地设置CS和IP值 连接程序没有设置DS、SS和ES值。程序如果使用数据段或附加段,必须明确给DS、SS或ES赋值 大多数程序需要数据段,程序的执行开始应是: start:mov ax,data;data表示数据段的段地址 mov ds,ax;设置DS,4.2.3. 程序终止,应用程序执行结束,应该将控制权交还操作系统 汇编语言程序设计中,一般

3、利用DOS功能调用的4CH子功能实现返回DOS ,它需要的入口参数是AL返回数码(通常用0表示程序没有错误) 于是,应用程序的终止代码就是: mov ax,4c00h int 21h,从上述程序中,我们可总结出如下结论: SEGMENT和ENDS前面必须有标号,而且在相互配对的段,它们前面要使用相同的标号。 ASSUME语句可使汇编器知道CS、DS、SS指向哪个段,但它只在汇编时起作用,在运行时CPU并不知道除CS外的其它段地址,所以必须在程序中用指令进行赋值。 首条被执行的语句有一个标号,在程序的结尾使用END后跟上这个标号,用以标出这个程序的开始执行处。,第4章:小结,4.2.4 过程定义

4、伪指令,把功能相对独立的程序段单独编写和调试,作为一个相对独立的模块供程序使用,就形成子程序 子程序可以实现源程序的模块化,可简化源程序结构,可以提高编程效率 主程序(调用程序)需要利用CALL指令调用子程序(被调用程序) 子程序需要利用RET指令返回主程序,汇编语言中,子程序要用一对过程伪指令PROC和ENDP声明,格式如下: 过程名PROC NEAR|FAR ;过程体 过程名ENDP 可选的参数指定过程的调用属性。没有指定过程属性,则采用默认属性near NEAR属性(段内近调用)的过程只能被相同代码段的其他程序调用 FAR属性(段间远调用)的过程可以被相同或不同代码段的程序调用,4.2.

5、4 过程定义伪指令,4.2.4:子程序编写注意事项,(1)子程序要利用过程定义伪指令声明 (2)子程序最后利用RET指令返回主程序,主程序执行CALL指令调用子程序 (3)子程序开始应该保护使用到的寄存器内容,子程序返回前相应进行恢复 (4)子程序应安排在代码段的主程序之外,最好放在主程序执行终止后的位置(返回DOS后、汇编结束END伪指令前),也可以放在主程序开始执行之前的位置,4.2.4:子程序编写注意事项(续),(5)子程序允许嵌套和递归 (6)子程序可以与主程序共用一个数据段,也可以使用不同的数据段(注意修改DS),还可以在子程序最后设置数据区(利用CS寻址) (7)子程序的编写可以很

6、灵活,例如具有多个出口(多个RET指令)和入口,但一定要保证堆栈操作的正确性 (8)处理好子程序与主程序间的参数传递问题 (9)提供必要的子程序说明信息,例4-19 用过程实现多字节BCD码相加。 DATA SEGMENT FIRST DB 10,20,30,40 SECOND DB 50,60,70,80 SUM DB 4 DUP (?) DATA ENDS STACK SEGMENT STA DB 20 DUP (?) TOP EQU LENGTH STA STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA, ASSUME SS:STACK,ES:

7、DATA,4.2.4 子程序编写,START:MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,STACK MOV SS,AX MOV AX,TOP MOV SP,AX MOV SI,OFFSET FIRST MOV BX,OFFSET SECOND MOV DI,OFFSET SUM MOV CX,04 CLD CLC ADITI:CALL AAA LOOP ADITI MOV AH,4CH INT 21H,4.2.4 子程序编写,AAA PROC NEAR LODSB ADC AL,BX DAA STOSB INC BX RET AAA ENDP CODE EN

8、DS END START,4.2.4 子程序编写,第4章:含数据区的子程序,;子程序HTOASC:十六进制数转换为ASCII码 HTOASCproc push bx mov bx,offset ASCII and al,0fh xlat CS:ASCII;换码:ALCS:BXAL pop bx ret ;数据区 ASCIIdb 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h db 41h,42h,43h,44h,45h,46h HTOASCendp,第4章:多出口子程序,;子程序HTOASC:十六进制数转换为ASCII码 HTOASCproc and al,0f

9、h cmp al,9 jbe htoasc1 add al,37h;是A F,加37H ret;子程序返回 htoasc1:add,30h;是0 9,加30H ret;子程序返回 HTOASCendp,4.3 宏指令,宏(MACRO)是源程序中具有独立功能的一段程序代码。它只需在源程序中定义一次,就可以多次用一条宏指令来调用它。 宏定义: 宏名MACRO 形参表 ;宏定义体 ENDM 宏名是符合语法的标识符,同一源程序中该名字定义唯一。宏定义体中不仅可以是硬指令序列,还可以是伪指令语句序列 形式参数的设置可根据需要而定, 可用一个或多个, 也可以没有。当有多个形式参数时,参数之间必须以逗号隔开

10、。 宏指令定义一般放在程序的开头。,经宏定义定义后的宏指令就可以在源程序中调用,这种对宏指令的调用称宏调用 宏调用的格式为: 宏指令名实际参数(每一项之间用逗号隔开) 当源程序被汇编时,汇编程序将对每个宏调用作宏展开。 宏展开就是用宏定义体取代源程序中的宏指令名,而且用实在参数一一取代宏定义的形式参数。,4.3 宏指令,例1 宏定义可以无变元 宏定义:SAVEREG MACRO PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI PUSH DI ENDM 宏调用: SAVEREG 宏展开: 将宏定义体的内容(具有独立功能的代码段)全部列出。,宏定义开始,宏定义体,宏

11、定义结束,宏指令,4.3 宏指令,例2 宏定义带形式参数 宏定义: FOO MACRO P1, P2, P3 MOV AX, P1 P2 P3 ENDM 宏调用: FOO WORD_VAR, INC, AX 宏展开: MOV AX, WORD_VAR INC AX,4.3 宏指令,例4-24 宏定义带形式参数 宏定义: SHIFT MACRO N, REG, CC MOV CL, N S;宏定义 mov ah,2;宏定义体 mov dl,char int 21h endm dispchar ?;宏调用(宏指令) +mov ah,2;宏展开 +mov dl,? +int 21h,第4章:宏的实例

12、4,dispmsgmacro message;宏定义 mov ah,9;宏定义体 lea dx,message int 21h endm dispmsg string;宏调用(宏指令) +mov ah,9;宏展开 +lea dx,string +int 21h,子程序调用工作方式:,XA,yB,CALL Q,xC,yD,CALL Q,主程序,Q: . . . RET,子程序Q(x,y),执行时调用,4.3 子程序调用和宏调用工作方式的区别,宏调用工作方式:,Q A,B,Q C,D,主程序,汇编时展开,Q(A,B),Q(C,D),Q MACRO x,y,ENDM,4.3 子程序调用和宏调用工作方

13、式的区别,第4章:宏与子程序的比较,比较,仅是源程序级的简化:宏调用在汇编时进行程序语句的展开,不需要返回;不减小目标程序,执行速度没有改变 通过形参、实参结合实现参数传递,简捷直观、灵活多变,还是目标程序级的简化:子程序调用在执行时由CALL指令转向、RET指令返回;形成的目标代码较短,执行速度减慢 需要利用寄存器、存储单元或堆栈等传递参数,宏,子程序,第4章:宏与子程序的比较结论,宏与子程序具有各自的特点,程序员应该根据具体问题选择使用那种方法 通常,当程序段较短或要求较快执行时,应选用宏;当程序段较长或为减小目标代码时,要选用子程序,比较结论,宏,子程序,4.4 DOS与BIOS调用,汇

14、编程序提供给汇编语言程序员的功能非常有限 程序员需要利用ROM-BIOS和操作系统提供的资源 系统功能调用是程序设计的一个重要方面,计算机的硬件环境必须在操作系统的管理下才能工作。 裸机:缺少操作系统的计算机。 操作系统可分为:磁盘操作系统(DOS)、Windows、Linux等。 DOS的管理功能:管理I/O设备、磁盘和文件。 DOS常用的软件中断命令:INT 20HINT 3FH。调用时,只要给定入口参数,写一条中断指令INT n即可。,4.4 DOS与BIOS调用,DOS常用的软中断命令,4.4:系统功能调用步骤,通常按照如下4个步骤进行: 在AH寄存器中设置系统功能调用号 在指定寄存器

15、中设置入口参数 用中断调用指令( INT i8)执行功能调用 根据出口参数分析功能调用执行情况,4.4.1 DOS系统功能调用,DOS软件中断中, INT 21H功能最强 DOS利用21H号中断提供给用户近百个系统功能,主要包括设备管理、目录管理和文件管理三个方面的功能 使用: 详见P108 表4-7 重点掌握: 输出一个字符,02H号功能调用 输出一个字符串,09H号功能调用 返回DOS系统,4CH号功能调用,4.4.1:01H号DOS功能调用,键盘输入单字符并显示 功能调用号:AH01H 入口参数:无 功能调用:INT 21H 出口参数:无,mov ah,1;设置功能调用号 int 21h

16、;功能调用 功能:系统等待键盘输入。当程序员按一下键时,系统 首先检查是否是Ctrl+Break键,如果是则退出,否则将 键入的ASCII码送入AL中,并在屏幕上显示。,4.4.1:02H号DOS功能调用,输出一个字符 功能调用号:AH02H 入口参数:DL欲显示字符的ASCII码 功能调用:INT 21H 出口参数:无,;显示一个问号“ ?” mov ah,02h;设置功能调用号 mov dl,?;设置入口参数 int 21h;功能调用,4.4.1:例1 回车换行的子程序,crlfproc push ax;保护寄存器 push dx mov ah,2 mov dl,0dh;回车功能的ASCI

17、I码是0DH int 21h mov ah,2 mov dl,0ah;换行功能的ASCII码是0AH int 21h pop dx;恢复寄存器 pop ax ret crlfendp,4.4.1:05H号DOS功能调用,打印一个字符 功能调用号:AH05H 入口参数:DL欲打印字符的ASCII码 功能调用:INT 21H 出口参数:无,;打印一个问号“ ?” mov ah,05h;设置功能调用号 mov dl,?;设置入口参数 int 21h;功能调用,无回显键盘输入单字符 功能与1号功能调用基本相同,惟一的差别是键入的字符不送屏幕显示。,4.4.1:08H号DOS功能调用,4.4.1:09H

18、号DOS功能调用,输出一个字符串 功能调用号:AH09H 入口参数: DS:DX欲显示字符串在内存中的首地址(逻辑地址形式:DS段地址,DX偏移地址) 内存中的字符串以ASCII码形式保存,最后必须添加一个“$”结尾(并不显示) 功能调用:INT 21H 出口参数:无,4.4.1:例2 提示按任意键继续,;在数据段定义要显示的字符串 msgkeydb Press any key to contiune,$ ;在代码段编写程序 mov ah,9 mov dx,offset msgkey ;设置入口参数: ;DS数据段地址(假设已经设置好) ;DX字符串的偏移地址 int 21h,4.4.1:0A

19、H号DOS功能调用,字符串输入 功能调用号:AH0AH 入口参数:DX数据区的偏移首地址 功能调用:INT 21H 出口参数:无 执行之前要在DS数据段定义一个缓冲区,其定义格式为: 缓冲区名 DB 缓冲区大小,?,缓冲区大小 DUP(?),给出该缓冲区最多可以存放的字节数,包括回车符,由程序自动回填实际输入的字节数(不包括回车),应与前面的缓冲区大小一致,【例4-26】定义一个缓冲区用来存放键入的字符串 BUF DB 50 DB ? DB 50 DUP(?);最多可键入49个字符,最后一个必为回车符 . MOV DX,OFFSET BUF MOV AH,0AH INT 21H,4.4.1:0

20、BH号DOS功能调用,检查键盘工作状态 功能调用号:AH0BH 入口参数:无 功能调用:INT 21H 出口参数:无 执行功能:检查是否有键盘输入,有键按下,返回AL=0FFH,无键按下,返回AL=00H.,【例4-27】 MOV BL,09H LOP:ADD AL,BL MOV AH,0BH INT 21H ADD AL,01H JNZ LOP ;无键入,则跳转 RET,4.4.1:4CH号DOS功能调用,返回DOS 功能调用号:AH4CH 入口参数:无 功能调用:INT 21H 出口参数:无,MOV AH,4CH INT 21H 功能:结束当前正在执行的程序,并返回操作 系统,屏幕上显示操

21、作系统提示符。,4.4.2 ROM-BIOS功能调用,BIOS(Base Input Output System)存放在系统主板上一块ROM中,硬件接口对应的中断服务程序和相关的底层系统调用都固化在这块芯片中。 BIOS调用是面向设备的,DOS调用是面向应用的。 ROM-BIOS也以中断服务程序的形式,向程序员提供系统的基本输入输出程序 ROM-BIOS功能更加基本,且与操作系统无关 当DOS没有启动或不允许使用DOS功能调用时,可以使用ROM-BIOS功能调用,4.4.2 ROM-BIOS功能调用,输出一个字符: 功能调用号:AH0EH 入口参数:AL欲显示字符的ASCII码 通常BX0 功

22、能调用:INT 10H 出口参数:无,2. 显示的BIOS调用( 10H号系统调用) (1)设置显示器显示模式(00H号子功能) 使用方法: MOVAH,00H MOVAL,显示模式编号 INT10H,4.4.2 ROM-BIOS功能调用,(3)置光标位置(02H) 功能:设置光标当前位置,也就是下一次字符显示的位置,仅在文本显示模式下可用。 使用方法: MOVAH,02H MOVBH,页号 (当前页号可用0FH子功能获得) MOVDH,行号 MOVDL,列号 INT10H,4.4.2 ROM-BIOS功能调用,DATA SEGMENT BUF DB 30 ACTL DB ? STR DB 3

23、0 DUP(?) MESS DB Whats you name?, 0DH, 0AH, $ DMESS DB 0DH, 0AH, Hello, $ DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA START:MOV AX, DATA MOV DS, AX,例题:简单人机对话的实现(NAME) 屏幕显示:Whats you name? 用户键入:Liping 屏幕显示:Helloliping!,LEA DX, MESS MOV AH, 9 INT 21H ;显示“Whats you name?” LEA DX, BUF MOV AH, 10 IN

24、T 21H ;从键盘接收用户输入的信息 MOV AL, ACTL ;取得键入字符串的实际长度 CBW MOV SI, AX LEA BX, STR MOV BX+SI, BYTE PTR ! ;在键入的字符串后加! MOV BX+SI+1, BYTE PTR $ ;在!后加$,以便显示 LEA DX, DMESS ;显示Hello! MOV AH, 9 INT 21H LEA DX, STR ;显示键入的字符串 MOV AH , 9 INT 21H MOV AH , 4CH INT 21H CODE ENDS END START,为运行汇编语言程序,至少要在磁盘上提供以下文件: (1) 编辑程

25、序,如EDIT.COM; (2) 汇编程序,如MASM.EXE; (3) 连接程序,如LINK.EXE; (4) 调试程序,如DEBUG.EXE。,4.5: 汇编语言程序的开发过程,4.5: 汇编语言程序的开发过程,源程序:文件名.asm,目标模块:文件名.obj,可执行文件:文件名.exe,错误,开发过程1:源程序的编辑,源程序文件要以ASM为扩展名 源程序文件的形成(编辑)可以通过任何一个文本编辑器实现: DOS中的全屏幕文本编辑器EDIT 其他程序开发工具中的编辑环境 Windows中的记事本Notepad EDIT wjl301.asm,开发过程2:源程序的汇编(MASM 6.x),汇

26、编是将源程序翻译成由机器代码组成的目标模块文件的过程 MASM 6.x提供的汇编程序是ML.EXE: ML /c wjl301.asm 如果源程序中没有语法错误,MASM将自动生成一个目标模块文件(wjl301.obj);否则MASM将给出相应的错误信息。这时应根据错误信息,重新编辑修改源程序后,再进行汇编,开发过程2:源程序的汇编(MASM 5.x),MASM 5.x提供的汇编程序是MASM.EXE: MASM wjl301.asm; 如果利用分号“;”结尾命令,则汇编程序不再提示输入模块文件名、列表文件名等,直接采用默认的文件名。 默认采用源程序文件相同的主文件名,扩展名则是相应类型文件的

27、扩展名,例如模块文件(.obj)和列表文件(.lst)等,开发过程2:源程序的汇编(生成列表文件),汇编过程中,可以通过参数选择生成列表文件(.LST)。列表文件是一种文本文件,含有源程序和目标代码,对我们学习汇编语言程序设计和发现错误很有用 汇编程序ML.EXE和MASM.EXE都可带其他参数,为了生成列表文件,各自的命令是: ML /Fl wjl301.asm MASM /l wjl301.asm; 该命令除产生模块文件wjl301.obj(和可执行文件wjl301.exe)外,还将生成列表文件wjl301.lst,开发过程3:目标模块的连接,连接程序能把一个或多个目标文件和库文件合成一个

28、可执行程序(.EXE、.COM文件): LINK wjl301.obj; 如果没有严重错误,LINK将生成一个可执行文件(wjl301.exe);否则将提示相应的错误信息。这时需要根据错误信息重新修改源程序文件后再汇编、链接,直到生成可执行文件 ML.EXE汇编程序(MASM 6.x)可自动调用LINK连接程序,实现汇编和连接的依次进行 ML wjl301.asm,开发过程4:可执行程序的调试,经汇编、连接生成的可执行程序在操作系统下只要输入文件名就可以运行: wjl301 操作系统装载该文件进入主存,并开始运行 如果出现运行错误,可以从源程序开始排错,也可以利用调试程序帮助发现错误 采用DE

29、BUG.EXE调试程序: DEBUG wjl301.exe,汇编语言程序设计步骤:,明确任务, 确定算法。 绘流程图。 分配存储空间和工作单元。 根据流程图编写汇编语言程序。 上机调试程序。,4.6:汇编语言程序设计基础,在程序设计中,程序的效率是程序设计好坏的重要指标,对于汇编语言程序我们可以考虑以下几方面作为程序运行效率的衡量标准: 程序的执行时间。在8086/8088指令手册中每条指令的运行时间都有明确的定义。根据这些时间,我们可算出程序的运行时间。 程序所占有的字节数。有一些计算机系统,可能应用于工业控制或工业过程检测,不需要过多的硬件资源,比如存储单元,所以就要求我们的程序有尽可能少的字节数,以满足缩减硬件资源的要求。 程序

温馨提示

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

评论

0/150

提交评论