1.08k likes | 1.22k Views
第6章 汇编语言程序设计. 6.1汇编源程序的编程格式 汇编源程序有两种编程格式:一种格式只能生成扩展名为 EXE 的可执行文件,称为 EXE 文件的编程格式;另一种格式可以生成扩展名为 COM 的可执行文件,称为 COM 文件的编程格式。 6.1.1 EXE 文件的编程格式 EXE 文件的编程格式允许源程序使用多个逻辑段,在实模式下,每个逻辑段的目标块不超过64 KB, 适合于编写大型程序。. 开 始. 6.1.2 COM 文件的编程格式 COM 文件的编程格式必须必须符合以下规定: (1)源程序只允许使用一个逻辑段,即代码段,不允许设置堆栈段;
E N D
第6章 汇编语言程序设计 6.1汇编源程序的编程格式 汇编源程序有两种编程格式:一种格式只能生成扩展名为EXE的可执行文件,称为EXE文件的编程格式;另一种格式可以生成扩展名为COM的可执行文件,称为COM文件的编程格式。 6.1.1 EXE文件的编程格式 EXE文件的编程格式允许源程序使用多个逻辑段,在实模式下,每个逻辑段的目标块不超过64KB,适合于编写大型程序。 开 始
6.1.2 COM 文件的编程格式 COM文件的编程格式必须必须符合以下规定: (1)源程序只允许使用一个逻辑段,即代码段,不允许设置堆栈段; (2)程序使用的数据,可以集中设置在代码段的开始或末尾; (3)在代码段偏移地址(有效地址)为100H的单元,必须是程序的启动指令; (4)代码段目标小于64KB。
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。
6.1.4 程序段前缀 6.1.5返回DOS的其他方法 对于COM文件有三种方法: (1)直接执行INT20H; (2)调用INT21H的0号功能。 (3)执行RET指令
对于EXE文件: (1)调用INT 21H的4CH功能 (2)执行INT 20H,首先把执行过程包含在一个远过程中; 其次在给DS赋值前,用3条指令把PSP首单元的物理地址压入栈顶,即:PUSH DS MOV AX,0 PUSH AX,最后程序在需要返回DOS的地方执行一条RET指令。 6.1.6 源程序堆栈段的设置
6.2 DOS系统功能调用 • 对8086系列机来说,MS-DOS操作系统是最主要的操作系统。MS-DOS操作系统除了具有较为完整的文件管理功能之外,同时还为各种应用程序、外围设备等提供软件接口。它由三部分组成:IO.SYS、MSDOS.SYS以及COMMAND.COM。 • DOS系统功能调用的方法一般可分为以下几步: • ① 设置所要调用功能的入口参数。 • ② 在AH寄存器中存入所要调用功能的功能号。 • ③ INT 21H指令自动转入中断子程序入口。 • ④ 相应中断子程序运行完毕,可按规定取得出口参数。 返回本节
6.2 常用的DOS系统功能调用 • 1.单字符输入(1号调用) • 2.单字符显示(2号调用) • 3.打印输出(5号调用) • 4.结束调用(4CH号调用) • 5.显示字符串(9号调用) • 6.字符串输入(10号调用)
1.单字符输入(1号调用) • 格式:MOV AH,1 • INT 21H • 功能:从键盘输入字符的ASCII码送入寄存器AL中,并送显示器显示。 • 2.单字符显示(2号调用) • 格式:MOV DL,待显示字符的ASCII码 • MOV AH,2 • INT 21H • 功能:将DL寄存器中的字符送显示器显示,如果DL中为〈CTRL〉+〈BREAK〉的ASCII码,则退出。
3.打印输出(5号调用) • 格式:MOV DL,待打印字符的ASCII码 • MOV AH,5 • INT 21H • 功能:将DL寄存器中的字符送打印机打印。 • 4.结束调用(4CH号调用) • 格式:MOV AH,4CH • INT 21H • 功能:终止当前程序并返回调用程序。
5.显示字符串(9号调用) • 格式:LEA DX,待显示字符串首偏移地址 • MOV AH,9 • INT 21H • 功能:将当前数据区中以‘$’结尾的字符串送显示器显示。 • 6.字符串输入(10号调用) • 格式:LEA DX,缓冲区首偏移地址 • MOV AH,10 • INT 21H • 功能:从键盘上输入一字符串到用户定义的输入缓冲区中,并送显示器显示。
【例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
BEGIN: MOV AX ,DATA • MOV DS,AX • LEA DX,STR • MOV AH ,9 • INT 21H • MOV AH,4CH • INT 21H • CODE ENDS • END BEGIN 返回本节
综合举例 • 【例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 • 请画出该数据段数据存储的形式。 返回本章首页
【例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
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
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
【例3.29】从键盘上输入一串字符到输入缓冲区,然后将输入的字符串在显示器上以相反的顺序显示。【例3.29】从键盘上输入一串字符到输入缓冲区,然后将输入的字符串在显示器上以相反的顺序显示。 • DATA SEGMENT • INFO1 DB 0DH,0AH,‘INPUT STRING:$’ • INFO2 DB 0DH,0AH,‘OUTPUT STRING:$’ • BUFA DB 81 • DB ?
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
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
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
LEA DX,BUFB • MOV AH,9 ;反向显示字符串 • INT 21H • MOV AH,4CH • INT 21H • CODE ENDS • END START 返回本节
6.3 BIOS键盘输入功能调用 调用模式: MOV AH,功能号 设置入口参数 INT n 分析出口参数 BIOS键盘输入功能使用INT 16H 1 功能号00H:读取键入的一个字符,无回显,响应CTRL_C,无键入则等待。 入口参数:无 出口参数:AL=输入字符的ASCII码 2 功能号01H:查询键盘缓冲区 入口参数:无 出口参数:Z=0,表示有键入,否则无键入
3 功能号02H:读取当前转换状态 入口参数:无 出口参数:AL=键盘状态字(P94) 4 功能号10H:读扩展键盘,无回显,响应CTRL_C。 入口参数:无 出口参数:同00H 5 功能号11H:查询键盘缓冲区 6 功能号12H:读取扩展键盘的转换状态。
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:从光标所在位置开始,显示若干个相同的字符
10功能号0AH:从光标所在位置开始,显示若干个相同的字符10功能号0AH:从光标所在位置开始,显示若干个相同的字符 11功能号0EH:显示一个字符 12功能号13H:显示字符串
6.5 程序设计方法 • 1 概述 • 2 顺序程序设计 • 3 分支程序设计 • 4 循环程序设计 • 5 子程序设计 • 6 模块化程序设计 • 7 高级汇编语言技术 开 始
程序设计方法 1 概述 • (1) 汇编语言程序设计的一般步骤 • (2) 流程图 返回本章首页
汇编语言程序设计的一般步骤 • 汇编语言程序设计一般有以下几个步骤: • 1.分析问题,确定算法 • 2.绘制流程图 • 3.根据流程图编制程序 • 4.调试程序 返回本节
流程图 • 1.流程图的概念 • 流程图是由特定的几何图形、指向线、文字说明来表示数据处理的步骤,形象描述逻辑控制结构以及数据流程的示意图。流程图具有简洁、明了、直观的特点。 2.流程图符号表示 (1)起止框:表示程序的开始和结束。 • 起止框
(2)判断框 (3)处理框 (4)调用框
(5)指向线 (6)连接框 返回本节
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所示。 返回本章首页
源程序如下: • 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
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
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
【例4.2】 • 【例4.2】已知某班学生的英语成绩按学号(从1开始)从小到大的顺序排列在TAB表中,要查的学生的学号放在变量NO中,查表结果放在变量ENGLISH中。编写程序如下:
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
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
6.5 分支程序设计 • (1) 用条件转移指令实现程序分支 • (2) 用跳转表实现多路分支 返回本章首页
(1) 用条件转移指令实现程序分支 • 【例4.3】编写计算下面函数值的程序: • 1 X>0 • Y= 0 X=0 • -1 X • 设输入数据为X、输出数据Y,且皆为字节变量。程序流程图如图4.2所示。 • 程序如下:
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
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
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
【例4.4】 • 【例4.4】试编一程序,求三个带符号字数据中的最大值,并将最大值存入MAX字单元中。 • 设三个带符号数分别在三个字变量X、Y、Z中存储。程序流程图如图4.3所示
程序如下: • 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
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