1 / 108

第6章 汇编语言程序设计

第6章 汇编语言程序设计. 6.1汇编源程序的编程格式 汇编源程序有两种编程格式:一种格式只能生成扩展名为 EXE 的可执行文件,称为 EXE 文件的编程格式;另一种格式可以生成扩展名为 COM 的可执行文件,称为 COM 文件的编程格式。 6.1.1 EXE 文件的编程格式 EXE 文件的编程格式允许源程序使用多个逻辑段,在实模式下,每个逻辑段的目标块不超过64 KB, 适合于编写大型程序。. 开 始. 6.1.2 COM 文件的编程格式 COM 文件的编程格式必须必须符合以下规定: (1)源程序只允许使用一个逻辑段,即代码段,不允许设置堆栈段;

Download Presentation

第6章 汇编语言程序设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第6章 汇编语言程序设计 6.1汇编源程序的编程格式 汇编源程序有两种编程格式:一种格式只能生成扩展名为EXE的可执行文件,称为EXE文件的编程格式;另一种格式可以生成扩展名为COM的可执行文件,称为COM文件的编程格式。 6.1.1 EXE文件的编程格式 EXE文件的编程格式允许源程序使用多个逻辑段,在实模式下,每个逻辑段的目标块不超过64KB,适合于编写大型程序。 开 始

  2. 6.1.2 COM 文件的编程格式 COM文件的编程格式必须必须符合以下规定: (1)源程序只允许使用一个逻辑段,即代码段,不允许设置堆栈段; (2)程序使用的数据,可以集中设置在代码段的开始或末尾; (3)在代码段偏移地址(有效地址)为100H的单元,必须是程序的启动指令; (4)代码段目标小于64KB。

  3. 6.1.3 EXE文件和COM文件的内存映像 EXE文件包括两部分:一部分为装入模块,另一部分为“重定位信息”。调入后生成PSP(程序段前缀) DOS自动给DS,ES,FS和GS赋值,使DS=ES=存放PSP的段基址,FS=GS=0,并使CS:IP=用户程序的启动地址,SS:SP指向用户堆栈段的栈顶,在这以后,DOS才把控制权交给用户程序。 COM文件没有重定位信息,因此比EXE文件的体积小的多。DOS装载COM文件时,也生成PSP,然后从偏移地址100H开始依次存放用户程序。DOS自动赋值使CS=DS=ES=SS=PSP段基址,FS=GS=0,并使IP=100H,SP=FFFEH。

  4. 6.1.4 程序段前缀 6.1.5返回DOS的其他方法 对于COM文件有三种方法: (1)直接执行INT20H; (2)调用INT21H的0号功能。 (3)执行RET指令

  5. 对于EXE文件: (1)调用INT 21H的4CH功能 (2)执行INT 20H,首先把执行过程包含在一个远过程中; 其次在给DS赋值前,用3条指令把PSP首单元的物理地址压入栈顶,即:PUSH DS MOV AX,0 PUSH AX,最后程序在需要返回DOS的地方执行一条RET指令。 6.1.6 源程序堆栈段的设置

  6. 6.2 DOS系统功能调用 • 对8086系列机来说,MS-DOS操作系统是最主要的操作系统。MS-DOS操作系统除了具有较为完整的文件管理功能之外,同时还为各种应用程序、外围设备等提供软件接口。它由三部分组成:IO.SYS、MSDOS.SYS以及COMMAND.COM。 • DOS系统功能调用的方法一般可分为以下几步: • ① 设置所要调用功能的入口参数。 • ② 在AH寄存器中存入所要调用功能的功能号。 • ③ INT 21H指令自动转入中断子程序入口。 • ④ 相应中断子程序运行完毕,可按规定取得出口参数。 返回本节

  7. 6.2 常用的DOS系统功能调用 • 1.单字符输入(1号调用) • 2.单字符显示(2号调用) • 3.打印输出(5号调用) • 4.结束调用(4CH号调用) • 5.显示字符串(9号调用) • 6.字符串输入(10号调用)

  8. 1.单字符输入(1号调用) • 格式:MOV AH,1 •  INT 21H • 功能:从键盘输入字符的ASCII码送入寄存器AL中,并送显示器显示。 • 2.单字符显示(2号调用) • 格式:MOV DL,待显示字符的ASCII码 • MOV AH,2 •  INT 21H • 功能:将DL寄存器中的字符送显示器显示,如果DL中为〈CTRL〉+〈BREAK〉的ASCII码,则退出。

  9. 3.打印输出(5号调用) • 格式:MOV DL,待打印字符的ASCII码 • MOV AH,5 •  INT 21H • 功能:将DL寄存器中的字符送打印机打印。 • 4.结束调用(4CH号调用) • 格式:MOV AH,4CH •   INT 21H • 功能:终止当前程序并返回调用程序。

  10. 5.显示字符串(9号调用) • 格式:LEA DX,待显示字符串首偏移地址 • MOV AH,9 •  INT 21H • 功能:将当前数据区中以‘$’结尾的字符串送显示器显示。 • 6.字符串输入(10号调用) • 格式:LEA DX,缓冲区首偏移地址 • MOV AH,10 • INT 21H • 功能:从键盘上输入一字符串到用户定义的输入缓冲区中,并送显示器显示。

  11. 【例3.25】若要在屏幕上显示字符串“Example of string display!”,则程序如下: • DATA SEGMENT • STR DB 0DH,0AH,‘Example of string display!$’ • DATA ENDS • STACK SEGMENT STACK • DB 100 DUP(0) • STACK ENDS • CODE SEGMENT • ASSUME DS:DATA,CS:CODE,SS:STACK

  12. BEGIN: MOV AX ,DATA • MOV DS,AX • LEA DX,STR • MOV AH ,9 • INT 21H • MOV AH,4CH • INT 21H • CODE ENDS • END BEGIN 返回本节

  13. 综合举例 • 【例3.27】已知一数据段中的数据为: • DATA SEGMENT • A DW M • BUF DB ‘AB’,0DH,0AH • C EQU 500H • B DW 0FFAAH • D DD BUF • M DB 2DUP(1) ,2DUP(2,’B’) • DATA ENDS • 请画出该数据段数据存储的形式。 返回本章首页

  14. 该数据段在主存中的存储形式如左图所示。

  15. 【例3.28】阅读下列程序,指出此程序所完成的功能以及在显示器上显示的内容。 • DATA SEGMENT • NUM DB 01000101B • BUF DB 0DH,0AH,‘(NUM)=’ • STR DB 4 DUP(?) • DATA ENDS • STACK SEGMENT STACK • DB 200 DUP(0) • STACK ENDS • CODE SEGMENT • ASSUME DS:DATA,SS:STACK,CS:CODE

  16. START: MOV AX,DATA • MOV DS,AX • LEA DI,STR • MOV AL,NUM • MOV CL,4 • SHR AL,CL • OR AL,30H • MOV [DI],AL • INC DI • MOV AL,NUM • AND AL,0FH • OR AL,30H • MOV [DI],AL

  17. INC DI • MOV BYTE PTR [DI],‘H’ • INC DI • MOV BYTE PTR [DI],‘$’ • LEA DX,BUF • MOV AH,9 • INT 21H • MOV AH,4CH • INT 21H • CODE ENDS • END START

  18. 【例3.29】从键盘上输入一串字符到输入缓冲区,然后将输入的字符串在显示器上以相反的顺序显示。【例3.29】从键盘上输入一串字符到输入缓冲区,然后将输入的字符串在显示器上以相反的顺序显示。 • DATA SEGMENT • INFO1 DB 0DH,0AH,‘INPUT STRING:$’ • INFO2 DB 0DH,0AH,‘OUTPUT STRING:$’ • BUFA DB 81 • DB ?

  19. DB 80 DUP(0) • BUFB DB 81 DUP(0) • DATA ENDS • STACK SEGMENT • DB 200 DUP(0) • STACK ENDS • CODE SEGMENT • ASSUME DS:DATA,SS:STACK,CS:CODE • START: MOV AX,DATA • MOV DS,AX

  20. LEA DX,INFO1 • MOV AH,9 ; 9号调用,显示输入提示信息 • INT 21H • LEA DX,BUFA • MOV AH,10; 10号调用,键盘输入字符串到缓 冲区BUFA • INT 21H • LEA SI,BUFA+1 • MOV CH,0 ; 取字符长度→CX • MOV CL,[SI] • ADD SI,CX ;SI 指向字符串尾部 • LEA DI,BUFB ;DI指向字符串变量BUFB

  21. NEXT: MOV AL,[SI] • MOV [DI],AL • DEC SI • INC DI • LOOP NEXT • MOV BYTE PTR [DI],‘$’ • LEA DX,INFO2 • MOV AH,9; 9号调用,显示输出 提示信息 • INT 21H

  22. LEA DX,BUFB • MOV AH,9 ;反向显示字符串 • INT 21H • MOV AH,4CH • INT 21H • CODE ENDS • END START 返回本节

  23. 6.3 BIOS键盘输入功能调用 调用模式: MOV AH,功能号 设置入口参数 INT n 分析出口参数 BIOS键盘输入功能使用INT 16H 1 功能号00H:读取键入的一个字符,无回显,响应CTRL_C,无键入则等待。 入口参数:无 出口参数:AL=输入字符的ASCII码 2 功能号01H:查询键盘缓冲区 入口参数:无 出口参数:Z=0,表示有键入,否则无键入

  24. 3 功能号02H:读取当前转换状态 入口参数:无 出口参数:AL=键盘状态字(P94) 4 功能号10H:读扩展键盘,无回显,响应CTRL_C。 入口参数:无 出口参数:同00H 5 功能号11H:查询键盘缓冲区 6 功能号12H:读取扩展键盘的转换状态。

  25. 6.4 文本方式BIOS屏幕功能调用 6.4.1 显示器 6.4.2 文本方式BIOS屏幕调用 调用指令 INT 10H 1 功能号00H:设置屏幕显示方式 2功能号01H:设置光标形状 3功能号02H:预置光标位置 4功能号03H:读取光标的当前位置 5功能号05H:设置当前显示页 6功能号06H:窗口上滚 7功能号07H:窗口下滚 8功能号08H:读取光标所在位置的字符及其属性 9功能号09H:从光标所在位置开始,显示若干个相同的字符

  26. 10功能号0AH:从光标所在位置开始,显示若干个相同的字符10功能号0AH:从光标所在位置开始,显示若干个相同的字符 11功能号0EH:显示一个字符 12功能号13H:显示字符串

  27. 6.5 程序设计方法 • 1 概述 • 2 顺序程序设计 • 3 分支程序设计 • 4 循环程序设计 • 5 子程序设计 • 6 模块化程序设计 • 7 高级汇编语言技术 开 始

  28. 程序设计方法 1 概述 • (1) 汇编语言程序设计的一般步骤 • (2) 流程图 返回本章首页

  29. 汇编语言程序设计的一般步骤 • 汇编语言程序设计一般有以下几个步骤: • 1.分析问题,确定算法 • 2.绘制流程图 • 3.根据流程图编制程序 • 4.调试程序 返回本节

  30. 流程图 • 1.流程图的概念 • 流程图是由特定的几何图形、指向线、文字说明来表示数据处理的步骤,形象描述逻辑控制结构以及数据流程的示意图。流程图具有简洁、明了、直观的特点。 2.流程图符号表示 (1)起止框:表示程序的开始和结束。 • 起止框

  31. (2)判断框 (3)处理框 (4)调用框

  32. (5)指向线 (6)连接框 返回本节

  33. 2 顺序程序设计 • 下面举例说明顺序程序的设计。 • 【例4.1】试编写一程序计算以下表达式的值。 • w=(v-(x*y+z-540))/x    • 式中x、y、z、v均为有符号字数据。 • 设x、y、z、v的值存放在字变量X、Y、Z、V中,结果存放在双字变量W之中,程序的流程图如图4.1所示。 返回本章首页

  34. 图4.1 顺序运算程序流程图

  35. 源程序如下: • DATA SEGMENT • X DW 200 • Y DW 100 • Z DW 3000 • V DW 10000 • W DW 2 DUP(?) • DATA ENDS • STACK SEGMENT STACK • DB 200 DUP(0) • STACK ENDS • CODE SEGMENT • ASSUME DS:DATA,CS:CODE,SS:STACK

  36. START: MOV AX,DATA • MOV DS,AX ;DATA→AX • MOV AX,X • IMUL Y ;(X)*(Y)→DX:AX • MOV CX,AX • MOV BX,DX ;(DX:AX)→(BX:CX) • MOV AX,Z • CWD ;(Z)符号扩展 • ADD CX,AX • ADC BX,DX ;(BX:CX)+(DX:AX)→(BX:CX) • SUB CX,540 • SBB BX,0 ;(BX:CX)-540→(BX:CX) • MOV AX,V

  37. CWD ;(V)符号扩展 • SUB AX,CX • SBB DX,BX;(DX:AX)-(BX:CX)→(DX:AX) • IDIV X ;(DX:AX)/X • MOV W,AX ;商→W • MOV W+2,DX ;余数DX→W+2 • MOV AH,4CH • INT 21H • CODE ENDS ;退出DOS 状态 • END START

  38. 【例4.2】 • 【例4.2】已知某班学生的英语成绩按学号(从1开始)从小到大的顺序排列在TAB表中,要查的学生的学号放在变量NO中,查表结果放在变量ENGLISH中。编写程序如下:

  39. STACK SEGMENT STACK • DB 200 DUP(0) • STACK ENDS • DATA SEGMENT • TAB DB 80,85,86,71,79,96 • DB 83,56,32,66,78。84 • NO DB 10 • ENGLIST DB? • DATA ENDS • CODE SEGMENT

  40. ASSUME DS:DATA,SS:STACK,CS:CODE • BEGIN: MOV AX,DATA • MOV DS ,AX • LEA BX,TAB • MOV AL,NO • DEL AL • XLAT TAB • MOV ENGLISH,AL • MOV AH,4CH • INT 21H • CODE ENDS • END BEGIN

  41. 6.5 分支程序设计 • (1) 用条件转移指令实现程序分支 • (2) 用跳转表实现多路分支 返回本章首页

  42. (1) 用条件转移指令实现程序分支 • 【例4.3】编写计算下面函数值的程序: • 1 X>0 • Y= 0 X=0 • -1 X • 设输入数据为X、输出数据Y,且皆为字节变量。程序流程图如图4.2所示。 • 程序如下:

  43. DATA SEGMENT • X DB -10 • Y DB ? • DATA ENDS • STACK SEGMENT STACK • DB 200 DUP(0) • STACK ENDS • CODE SEGMENT • ASSUME DS:DATA,SS:STACK,CS:CODE • START: MOV AX,DATA

  44. MOV DS,AX • CMP X,0 ;与0进行比较 • JGE A1 ;X≥0转A1 • MOV Y,-1 ;X <0时,-1→Y • JMP EXIT • A1: JG A2 ;X>0转A2 • MOV Y,0 ;X=0时,0→Y • JMP EXIT • A2: MOV Y,1 ;X>0,1→Y • EXIT: MOV AH,4CH • INT 21H • CODE ENDS • END START

  45. MOV DS,AX • CMP X,0 ;与0进行比较 • JGE A1 ;X≥0转A1 • MOV Y,-1 ;X <0时,-1→Y • JMP EXIT • A1: JG A2 ;X>0转A2 • MOV Y,0 ;X=0时,0→Y • JMP EXIT • A2: MOV Y,1 ;X>0,1→Y • EXIT: MOV AH,4CH • INT 21H • CODE ENDS • END START

  46. 图4.2 分支运算程序流程图

  47. 【例4.4】 • 【例4.4】试编一程序,求三个带符号字数据中的最大值,并将最大值存入MAX字单元中。 • 设三个带符号数分别在三个字变量X、Y、Z中存储。程序流程图如图4.3所示

  48. 图4.3 [例4.4]程序流程图

  49. 程序如下: • STAC SEGMENT STACK • DB 200 DUP(0) • STACK ENDS • DATA SEGMENT • X DW 00ABH • Y DW –5 • Z DW 200 • MAX DW ? • DATA ENDS • CODE SEGMENT

  50. ASSUME DS:DATA,SS:STACK,CS:CODE • START: MOV AX,DATA • MOV DS,AX • MOV AX,X • CMP AX,Y ;X>Y? • JG L1 • MOV AX,Y ;Y>Z? • CMP AX,Z • JG EXIT • L2: MOV AX,Z • JMP EXIT

More Related