子程序设计和系统功能调用例题

合集下载

《IBM PC 80X86汇编语言程序设计》PPT电子课件教案-第六章 子程序设计

《IBM PC 80X86汇编语言程序设计》PPT电子课件教案-第六章 子程序设计

《IBM PC 80X86汇编语言程序设计》
冶金工业出版社
第6章
1、子程序的概念和特点
子程序:把在程序中多次出现,具有独立功能 的程序段写成程序模块,该模块可被多次调用, 称之为子程序。
特点:①可重复使用(调用) ②具有通用性(可通过入口参数实现) ③可浮动性(存放位置灵活) ④可递归性和可重入性
第6章
第六章 子程序设计
一、子程序的定义 二、子程序的结构形式
三、子程序的设计和调用 四、子程序的参数传递方法 五、子程序的嵌套和递归调用 六、子程序的设计举例 七、多模块程序设计 八、汇编语言和高级语言的混合编程
《IBM PC 80X86汇编语言程序设计》
冶金工业出版社
第6章
一、子程序的定义
1、子程序的概念和特点 2、子程序的定义 3、子程序的调用和返回
《IBM PC 80X86汇编语言程序设计》
冶金工业出版社
第6章
2、子程序的定义
子程序的定义是由过程定义伪指令PROC和ENDP 来完成的。其格式如下:
过程名 PROC [NEAR/FAR]

过程名 ENDP
其中PROC表示过程定义开始,ENDP表示过程定 义结束。过程名是过程入口地址的符号表示。
一般过程名同标号一样,具有三种属性,即段 属性、偏移地址属性以及类型属性。
《IBM PC 80X86汇编语言程序设计》
冶金工业出版社
第6章
3、子程序的调用和返回
❖ 调用
①段内直接调用
格式:CALL 子程序名
功能:将子程序返回地址(断点)入栈
SP←SP-2
(SP)←IP,
并转到子程序入口地址去执行子程序。
❖ 返回指令

操作系统习题答案(中国铁道出版社-刘振鹏-李亚平-王煜-张明)

操作系统习题答案(中国铁道出版社-刘振鹏-李亚平-王煜-张明)

⒈什么是硬件系统?什么是软件环境?它们之间有什么了解?答:计算机硬件是指计算机系统中由电子、机械和光电元件等组成的各种计算机部件和计算机设备。

这些部件和设备依据计算机系统结构的要求构成的有机整体,称为计算机硬件系统。

软件是计算机系统中的程序和有关的文件。

程序是计算任务的处理对象和处理规则的描述;文件是为了便于了解程序所需的资料说明。

硬件为软件提供具体实现的基础,软件是用户与硬件之间的接口界面。

⒉什么是操作系统?操作系统追求的主要目标是什么?答:操作系统是计算机系统中的一个系统软件,是能有效地组织和管理计算机系统中的硬件和软件资源,合理地组织计算机工作流程,控制程序的执行,并向用户提供各种服务功能,使得用户能够灵活、方便、有效地使用计算机,并使整个计算机系统能高效地运行的一组程序模块的集合。

操作系统追求的主要目标包括四个方面,分别是:方便性、有效性、可扩充性、开放性。

⒊在用户程序与硬件裸机之间,操作系统可以分为哪几个模块?答:***********************************************************⒋操作系统如何实现计算机操作的自动化?如何看待操作系统在计算机系统中的地位?答:**************************************************操作系统是配置在计算机硬件上的第一层软件,是对硬件系统的第一次扩充,支持其他所有软件的运行。

⒌操作系统分成哪几类?答:单道批处理系统、多道批处理系统、分时系统、实时系统、微机操作系统、多处理机操作系统、网络操作系统和分布式操作系统。

⒍从资源管理观点看,操作系统具有哪些功能?答:处理机管理、存储器管理、I/O设备管理、文件管理。

⒎讨论操作系统可以从哪些角度出发,如何统一看待它们?答:可以从软件的观点、计算机系统资源管理的观点、进程的观点、用户与计算机硬件系统之间的观点、虚机器观点、服务提供者观点。

微机原理试题(last)

微机原理试题(last)

微机原理试题(last)1.用ASSUME伪指令指定某个段分配给某个段寄存器后,还需通过MOV指令来给段寄存器赋值,其中(C )不能这样做,而是在程序初始化时自动完成的。

A.数据段寄存器DS B.堆栈段寄存器SSC.代码段寄存器CS D.附加段寄存器ES2.( A )不是变量的类型属性A.字符型 B.字型 C.字节型 D.双字型3.下列哪一个伪指令对符号名可以重复定义( A )A.= B. EQU C.DB D.PTR4.将下列左边各项与右边的名词对应起来,找出正确答案的序号填入括号内。

(1)使计算机执行某种操作的命令(D)(2)表示指令执行什么操作的符号(E)(3)存放指令机器码的存储器段区(A)(4)指出指令在程序中位置的符号(B)(5)将汇编语言源程序翻译成机器码程序的实用程序(C)A.代码段 B. 标号 C. 汇编程序 D. 指令 E. 助记符5.下面指令序列执行后完成的运算,正确的算术表达式是( C )MOV AL,BYTE PTR XSHL AL,1DEC ALMOV BYTE PTR Y,ALA.Y=2X+1 B. X=2Y+1 C. Y=2X-1 D.X=2Y-16. 对于无符号数,实现“>=”转移的指令是(A)A.JAE/JNB B. JBE/JNA C. JGE/JNL D. JC/JNLE7. 在程序设计的实际应用中往往存在要重复执行的某些操作的一类问题,这类问题由(C)来解决。

A.顺序结构程序 B. 分支结构程序C.循环结构程序D.以上都不是8. (A)不是子程序的参数传递方法。

A.立即数传递 B. 寄存器传递C.堆栈传递 D. 存储器传递9. DOS系统功能调用中,将子功能编号送入(A)寄存器。

A.AH B. AL C. BH D. BL10. 读取键盘字符并回显是DOS系统功能调用的( B )号调用。

A.0AH B. 01H C. 02H D. 09H11.求下列数的补码或真值(1)χ= +127D,[χ]补=?(2)χ= -127D,[χ]补=?(3)[χ]补=0111 1110B,χ=?(4)[χ]补=1000 0010B,χ=?答案:(1)0111 1111B (2)1000 0001B(3)χ= +126D (4)χ= -126D12. 已知x= +51D,y= -66D,用补码运算求x+y,x-y的值。

微机原理复习题

微机原理复习题

6、下列指令中,有语法错误的指令是 C)JMP WORD PTR[BX+8]
7、“先工作后判断”的循环程序结构中,循环执行的次数最 少是 次。 A)1 A)OF B)0 标志 (C)SF (D)ZF 。 (B)CF C)2 D)不定 8、DEC指令不影响
9、条件转移指令JNE的测试条件是 A)ZF=1 (B)CF=1 (C)ZF=0 (D)CF=0
14、输入/输出指令中的端口包含直接寻址和间接寻址两种方式, 其中直接寻址的端口地址范围是 ,间接寻址时必须使用寄 存器 ,寻址范围是 。 15、 已知AL=35H,BL=0DEH,对带符号数执行 ADD AL,BL后, CF= ,OF= 。 16、 寻址方式是指 ,指令MOV COUNT[SI],AX中,目的 操作数采用的是 寻址方式,该操作数在 段。 17、一个有20个字的数据区,它的起始地址为50B0: H,该数 据区的最后一个字单元的物理地址为5B71CH。
20、已知中断控制器8259A的IR0的中断型号为88H,则其IR5的 中断类型号为 。*** A)8DH B)88H C)82H D)不能确定,需另外设置
二、填空题
1 、 8088 具 有 根 地 址 线 。 在 访 问内 存 时 使用 地 址 线 ,可直接寻址 容量的内存范围;在访问外 设时使用地址线 ,共能寻址 输入输出端口。 执行一条指令所需要的时间被称为 周期,而总线 周期指的是 ,8088典型的总线周期由 个 T 组成。如果8088的CLK引脚接2MHz的时钟信号,那么每个 T状态的持续时间为 。 2、在立即寻址方式下,操作数存放在 段中;在直接寻
9、乘法指令中规定:字节运算时,乘积被默认存放在 寄 存器中。 10、定义了的变量名具有: 、 、 、 和 属性。 11、32位微处理器除算术逻辑部件和控制部件以外,还包含一 组 以及 等特殊的存储器。(数据cache和指令cache) 12、在半导体存储器中,RAM指的是 ,它可读可写,但断电 后信息一般会 ;而ROM指的是 ,正常工作时只能 从中 信息,但断电后信息 。以EPROM芯片2764为 例,其存储容量为8K×8位,共有 条数据线和 条地 址线。用它组成32KB的ROM存储区共需 片2764芯片。 13、主机与I/O间的数据传送的方式通常 有 、 、 。

《汇编语言程序设计》(第四版)教案及答案解析

《汇编语言程序设计》(第四版)教案及答案解析

《汇编语言程序设计》教案附:习题参考答案《汇编语言程序设计》(第4版)钱晓捷主编前言1.汇编语言是计算机能提供给用户的最快而又最有效的语言,也是能够利用计算机所有硬件特性并能直接控制硬件的唯一语言。

2.汇编语言程序设计是高等院校电子计算机硬、软件及应用专业学生必修的核心课程之一。

它不仅是计算机原理、操作系统等其它核心课程的必要先修课,而且对于训练学生掌握程序设计技术、熟悉上机操作和程序调试技术都有重要作用。

3.本教材共有十一章,其内容安排如下:(1).第一、二章为汇编语言所用的基础知识。

(2).第三章详细介绍80x86系列CPU的指令系统和寻址方式。

(3).第四章介绍伪操作、汇编语言程序格式及汇编语言的上机过程。

(4).第五、六章说明循环、分支、子程序结构和程序设计的基本方法。

(5).第七章说明宏汇编、重复汇编及条件汇编的设计方法。

(6).第八章叙述输入/输出程序设计方法,重点说明中断原理、中断过程及中断程序设计方式。

(7).第九章说明BIOS和DOS系统功能调用的使用方法。

(8).第十~十一章分别说明图形显示、发声及磁盘文件存储的程序设计方法,同时提供各种程序设计方法和程序实例。

附:教学参考书1.沈美明、温冬婵编著,IBM–PC汇编语言程序设计(第2版),清华大学出版社,2001年(教材)2.沈美明、温冬婵编著,IBM–PC汇编语言程序设计,清华大学出版社,1991年3.沈美明、温冬婵编著,IBM–PC汇编语言程序设计—例题习题集,清华大学出版社,1991年6月4.沈美明、温冬婵、张赤红编著,IBM–PC汇编语言程序设计—实验教程,清华大学出版社,1992年5.周明德,微型计算机IBM PC/XT(0520系列)系统原理及应用(修订版),清华大学出版社,19916.郑学坚、周斌,微型计算机原理及应用(第二版),清华大学出版社,19957.王士元、吴芝芳,IBM PC/XT[长城0520] 接口技术及其应用,南开大学出版社,19908.杨素行,微型计算机系统原理及应用,清华大学出版社,19959.戴梅萼、史嘉权,微型计算机技术及应用—从16位到32位(第二版),清华大学出版社,199610.张昆藏,IBM PC/XT微型计算机接口技术,清华大学出版社,199111.孟绍光,李维星,高档微机组成原理及接口技术(80386/80486/Pentium),学苑出版社,199312.吴秀清,周荷琴,微型计算机原理与接口技术,中国科学技术大学出版社目录第 1 章基础知识 (1)1.1进位计数制与不同基数的数之间的转换 (1)1.2二进制数和十六进制数的运算 (2)1.3计算机中数和字符的表示 (3)1.4几种基本的逻辑运算 (3)第 2 章 80X86计算机组织 (4)2.180X86微处理器 (4)2.2基于微处理器的计算机系统构成 (4)2.3中央处理机 (5)2.4存储器 (6)2.5外部设备 (7)第 3 章 80X86的指令系统和寻址方式 (8)3.180X86的寻址方式 (8)3.2程序占有的空间和执行时间 (10)3.380X86的指令系统 (10)第 4 章汇编语言程序格式 (27)4.1汇编程序功能 (27)4.2伪操作 (27)4.3汇编语言程序格式 (31)4.4汇编语言程序的上机过程 (34)第 5 章循环与分支程序设计 (37)5.1循环程序设计 (37)5.2分支程序设计 (38)5.3如何在实模式下发挥80386及其后继机型的优势 (38)第 6 章子程序结构 (40)6.1子程序的设计方法 (40)6.2子程序的嵌套 (41)6.3子程序举例 (41)第 7 章高级汇编语言技术 (43)7.1宏汇编 (43)7.2重复汇编 (44)7.3条件汇编 (45)第 8 章输入/输出程序设计 (46)8.1I/O设备的数据传送方式 (46)8.2程序直接控制I/O方式 (47)8.3中断传送方式 (47)第 9 章 BIOS和DOS中断 (50)9.1键盘I/O (50)9.2显示器I/O (52)9.3打印机I/O (53)9.4串行通信口I/O (54)第 10 章图形与发声系统的程序设计 (55)10.1显示方式 (55)10.2视频显示存储器 (55)10.3EGA/VGA图形程序设计 (56)10.4通用发声程序 (57)10.5乐曲程序 (58)第 11 章磁盘文件存取技术 (59)11.1磁盘的记录方式 (59)11.2文件代号式磁盘存取 (60)11.3字符设备的文件代号式I/O (61)11.4BIOS磁盘存取功能 (62)附录:《IBM—PC汇编语言程序设计》习题参考答案 (63)第一章.习题 (63)第二章.习题 (64)第三章.习题 (65)第四章.习题 (79)第五章.习题 (84)第六章.习题 (104)第七章.习题 (118)第八章.习题 (125)第九章.习题 (130)第十章.习题 (134)第十一章.习题 (145)第 1 章 基础知识【教学目的】本章内容是本课程的基础,通过本章学习,使学生明确汇编语言程序设计的学科性质、基本内容和学习意义,掌握数制的转换、数据的编码,了解本门课程的教学要求和学习方法。

汇编语言程序设计习题集111

汇编语言程序设计习题集111

汇编语言程序设计习题集111《汇编语言程序设计》习题一、选择题1. 机器数为10000000B, 它代表-127D,则它是(C )。

A. 补码B. 原码C. 反码D. 原码或反码2.[x1]原=10111101B, [x2]反=10111101B, [x3]补=10111101B (C )。

A. x1最小B. x2最小C. x3最小D. x2=x1=x33.计算机的内存“溢出”是指其运算结果()。

A .为无穷大B .超出了计算机内存储单元所能存储的数值范围C .超出了该指令所指定的结果单元所能存储的数值范围D .超出了一个字所能表示数的范围4. [x1]原=11001010B, [x2]反=11001010B, [x3]补=11001010B ,那么它们的关系是()。

A. x3>x1>x2B. x2>x3>x1C. x3>x2>x1D. x2>x1>x35. 在计算机中表示地址时使用(A )。

A 无符号数B 原码C 反码D 以上都不对6. 下面说法错误的是(D )。

A 8位二进制无符号数表示的最大十进制数是255B 8位二进制带符号数表示的最大十进制数是127C 计算机中无符号数最常用于表示地址D 计算机中小数点隐含在符号位之后,占一位7. 只有当与非门的输入变量A 、B 的值为()时,其输出才为0。

A 0,0B 0,1C 1,0D 1,18. 只有当或非门的输入变量A 、B 的值为()时,其输出才为1。

A 0,0B 0,1C 1,0D 1,19. 若逻辑运算Y=A+B, 当A=B=1时,Y 为()。

A 0B 1C 10D 210. 若门电路的两个输入量为1、1,输出量为0,不可能完成此功能的是()。

A “异或”门B “与非”门C “或非”门D “与”门11. 下列不正确的是()A A AB A B +=+ B _____AB A B =+C AB B AB A B ++=+D A B A B +=12.已知V AR 为字节变量,下面是关于①MOV BX, OFFSET V AR 和②LEA BX, V AR 指令的说明,正确的是()。

操作系统第二章课件第二章练习

操作系统第二章课件第二章练习

第2章操作系统的基本概念一、单项选择题1. 操作系统是计算机系统中的()软件。

A.应用B.系统C.支撑D.工具2. 在计算机系统中配置了批处理操作系统,则能够()。

A.提高资源使用效率B.及时响应外部事件C.是用户直接干预作业的执行D.实现计算机间的通信3. 设计实时操作系统适应首先考虑()。

A.系统效率B.交互能力C.可移植性D.可靠性4. 如用户要利用计算机系统直接调试和控制程序的执行,则应在其上配置()操作系统。

A.批处理B.实时C.分时D.单用户5. 访管指令是一条()指令。

A.特权B.只允许在目态执行的C.只允许在管态执行的D.在目态和管态均可执行的6. 单操作系统完成了用户请求的“系统功能调用”后,应让中央处理器()工作。

A.维持在管态B.从管态转换到目态C.维持在目态D.从目态转换到管态二、多项选择题1. 在任何计算机系统中()。

A.主存储器可被中央处理器直接访问B.当CPU处于管态时只能执行特权指令C.操作系统只负责管理软件资源D.操作系统能接受用户输入的命令并控制用户程序的执行E.操作系统能为应用程序提供比裸机强的功能支持2. 各种类型的操作系统各有所长,它们追求的设计目标也不同,例如()。

A.多到批处理系统是为了提高系统的资源用率B.分时系统允许用户直接与计算机系统交互C.实时系统首先要考虑实时性和可靠性D.网络操作系统必须实现激素算计之间的通信及资源共享E.分布时操作系统要让多台计算机协作完成一个共同的任务3. 程序状态字是用来控制指令执行顺序并且保留和知识与程序有关的系统状态。

所以,()。

A. 每个程序都应该有一个PSWB. 程序状态字寄存器是用来存放当前运行程序的PSWC. 在多道程序设计系统中应设置多个程序状态自己村起来分别存放个成粗的PSW,以便多道并行执行D. 在用户程序的PSW中应置为管态,以便实用访管指令E. 处理器总是按程序状态字寄存器中的PSW控制程序的执行三、填空题1.计算机系统是由计算机________和计算机________两大部分组成。

操作系统习题2.1

操作系统习题2.1

进程的同步是进程的_____关系、进程的 互斥是进程的______关系。
对信号量S只能通过_____操作进行,其物 理意义是:一个相当于申请资源一个相 当于释放资源。
在操作系统中,不可中断执行的操作称 为______。
_______调度是高级调度,_______调度是 低级调度。
如果系统中的所有作业是同时到达的,则 作业平均周转时间最短的作业调度算法 是______。
操作系统习题(2)
选择
系统功能调用是( ) A 用户编写的一个子程序 B 高级语言中的程序库 C 操作系统中的一条命令 D 操作系统向用户提供的接口
用户及其应用程序和应用系统是通过() 提供的支持和服务来访问系统资源完成 其操作的。
A 点击鼠标 B 键盘命令 C 系统调用 D 图像用户界面
在单处理机系统中实现并发技术后,()。
C (3T1+2T2+T3)/3
D (T1+2T2+3T3)/3
一种既有利于短小作业又兼顾到长作业的 作业调度算法是()。
A 先来先服务 B 轮转 C 最高响应比优先 D 均衡调度
就绪队列中有n个就绪进程等待使用一个 CPU,那么如果采用不同的调度算法,总 共可能有()种调度顺序。
An
B n^n
个记录。缓冲区的大小和记录一样。请 用信号量来保证文件的正确打印。
分析: 问题本身是生产者消费者问题 PA是生产者 PB既是生产者又是消费者 PC是消费者 其中涉及到的缓冲区有两种 所以分别对缓冲区进行管理 设置 empty1,full1,empty2,full2四个信号量 var empty1,full1,empty2,full2:semaphore:=1,0,1,0
A 进程相应的程序段的长度 B 进程总共需要运行时间多少 C 进程自身和调度策略 D 进程完成什么功能
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

例8.2.1试设计一程序,完成两个长补码的加法,其中两个长补码的长度是相同的,并且采用低地址存放低位,高地址存放高位的方式存储。

加法功能使用子程序实现,两个长补码的起始地址、长补码的长度(以字为单位)、运算结果的起始地址均由主程序以入口参数的形式传递给子程序;运算是否溢出使用一个字节标志来表示,00H表示运算无溢出,0FFH 表示运算溢出,子程序将此溢出标志以出口参数的形式传递给主程序。

本例中参数传递方式采用寄存器传递方式。

1)设计参数传递约定题目已指明参数传递为寄存器传递方式,这里只需要具体约定寄存器与参数间的对应关系。

在本例中,我们约定主程序通过SI、DI寄存器传递两个长补码的起始偏移量(认为两个长补码位于同一数据段,并且段基值保存到DS中),通过CX寄存器传递补码的长度,通过BX寄存器传递运算结果的起始偏移量(认为段基值已保存在DS中);并且,我们约定子程序通过DL寄存器传递溢出标志。

2)源程序设计参数传递约定设计完成后,我们开始源程序设计,主程序与子程序的相应代码如下所示。

DA TA SEGMENTV AR1 DW 5482H, 669EH, 02C7H, 14B2H, 0C254HV AR2 DW 8C2BH, 0C24CH, 0AB12H, 357AH, 41A5HLEN EQU $-V AR2SUM DW LEN DUP(0) ; 用于保存运算结果OVR DB ? ; 用于保存溢出标志DA TA ENDSSTACK1 SEGMENT STACK ; 子程序设计必须使用堆栈段DW 40H DUP(0)STACK1 ENDSCODE SEGMENTASSUME CS: CODE, DS: DA TA, SS: STACK1BEGIN: MOV AX, DA TAMOV DS, AXLEA SI, V AR1 ; 传递入口参数LEA DI, V AR2MOV CX, LENLEA BX, SUMCALL LONGADD ; 调用子程序MOV OVR, DL ; 保存出口参数MOV AH, 4CHINT 21HLONGADD PROCPUSHF ; FR、AX入栈,保护CPU现场PUSH AXCLC ; 清除CF标志,保证第一次执行ADC时等同于ADD L1: MOV AX, [SI]ADC AX, [DI] ; 完成当前字的加法,引入了上次加法的进位PUSHF ; 保护OF标志MOV [BX], AX ; 当前字的计算结果保存到指定位置ADD SI, 2 ; 修改SI、DI、BX,使它们指向下一个字ADD DI, 2ADD BX, 2POPF ; 恢复OF标志LOOP L1 ; 计数循环,完成所有字单元的加法后退出循环JO L2 ; 判断最后一次运算是否溢出MOV DL,0 ; 无溢出则将0送至DL保存,传递出口参数JMP L3L2: MOV DL,0FFH ; 有溢出则将0FFH送至DL保存,传递出口参数L3: POP AX ; 恢复CPU现场POPFRET ; 返回主程序LONGADD ENDPCODE ENDSEND BEGIN读者在上例中应注意,首先,主程序向子程序传递入口参数、取得出口参数都是按照约定来进行的;其次,读者应注意子程序中的现场保护与恢复,它们分别在子程序的首位部分用PUSH和POP指令来实现;第三,由于上例中采用寄存器来传递参数,当执行子程序时,各参数已在寄存器中就位,使我们在子程序中没有找到“取入口参数”的动作,但实际上入口参数在子程序中已经可以直接使用。

例8.2.2试设计一程序,完成例8.2.1中指定的功能,但本例中参数传递方式采用堆栈传递方式。

1)设计参数传递约定题目中已指定参数传递方式为堆栈传递方式,这里只需约定入口参数入栈的顺序与出口参数的出栈顺序。

我们约定主程序按照被加数起始偏移量、加数起始偏移量、被加数与加数的长度、运算结果起始偏移量的顺序将入口参数入栈,子程序则按照相应顺序来获取入口参数;并且,我们约定子程序的出口参数覆盖最先入栈的入口参数,因为只有一个出口参数,返回主程序后,主程序只需将出口参数出栈即可。

2)源程序设计参数传递约定设计完成后,我们开始源程序设计,主程序与子程序的相应代码如下所示。

DA TA SEGMENTV AR1 DW 5482H, 669EH, 02C7H, 14B2H, 0C254HV AR2 DW 8C2BH, 0C24CH, 0AB12H, 357AH, 41A5HLEN EQU $-V AR2SUM DW LEN DUP(0) ; 用于保存运算结果OVR DB ? ; 用于保存溢出标志DA TA ENDSSTACK1 SEGMENT STACK ; 子程序设计必须使用堆栈段DW 40H DUP(0)STACK1 ENDSCODE SEGMENTASSUME CS: CODE, DS: DA TA, SS: STACK1BEGIN: MOV AX, DA TAMOV DS, AXLEA SI, V AR1 ; 通过堆栈传递入口参数PUSH SILEA SI, V AR2PUSH SIMOV SI, LENPUSH SILEA SI, SUMPUSH SICALL LONGADD ; 调用子程序POP DX ; 出口参数出栈MOV OVR, DL ; 保存出口参数MOV AH, 4CHINT 21HLONGADD PROCPUSH BP ; BP作为现场加以保护MOV BP, SP ; 获取当前栈顶位置PUSHF ; 保护CPU现场PUSH AXPUSH BXPUSH CXPUSH SIPUSH DIMOV BX, [BP+4] ; 取得保存运算结果的起始偏移量MOV CX, [BP+6] ; 取得被加数、加数得长度MOV DI, [BP+8] ; 取得加数的起始偏移量MOV SI, [BP+10] ; 取得被加数的起始偏移量CLC ; 清除CF标志,保证第一次执行ADC时等同于ADD L1: MOV AX, [SI]ADC AX, [DI] ; 完成当前字的加法,引入了上次加法的进位PUSHF ; 保护OF标志MOV [BX], AX ; 当前字的计算结果保存到指定位置ADD SI, 2 ; 修改SI、DI、BX,使它们指向下一个字ADD DI, 2ADD BX, 2POPF ; 恢复OF标志LOOP L1 ; 计数循环,完成所有字单元的加法后退出循环JO L2 ; 判断最后一次运算是否溢出MOV [BP+10],0 ; 无溢出则将0送至堆栈保存,传递出口参数JMP L3L2: MOV [BP+10],0FFH ; 有溢出则将0FFH送至堆栈保存,传递出口参数L3: POP DI ; 恢复CPU现场POP SIPOP CXPOP BXPOP AXPOPFPOP BPRET 6; 返回主程序,仅清除3个入口参数,因最先入栈的入口参数已被出口参数覆盖LONGADD ENDPCODE ENDSEND BEGIN在本例中,堆栈中重要的状态如下图所示(每个方格表示一个字节)。

读者在本例中应注意,首先,主程序向子程序传递参数时,是通过入栈操作完成的,并且遵循了先前设计的约定顺序;其次,子程序从堆栈中取得入口参数是使用BP 寄存器来完成的,这是由于入口参数位于比返回地址更高的地址单元中,不便使用出栈操作来完成;第三,子程序向堆栈传递出口参数时,覆盖了主程序最先入栈的入口参数,因此返回时仅使用RET 指令清除了位于低地址端的三个入口参数。

另外,在程序设计中,如果采用堆栈传递参数,务必记得使用RET N 指令,在返回主程序的同时清除堆栈中的入口参数,如果这些入口执行子程序第二条指令MOV BP , SP 后堆栈的状态执行子程序中现场保护后堆栈的状态 子程序返回主程序后堆栈的状态参数不加以清除,就会越积越多,直至堆栈溢出。

8.3.3 系统调用示例在本小节中,我们将举出一些系统调用的示例,这些示例将使用上一小节中介绍的系统调用完成一些常用的字符、字符串的输入、输出功能。

例8.3.1设计一程序,完成如下功能:将光标移至新行行首,从键盘接收单个字符,在屏幕当前光标位置回显输入字符,若输入的是大写英文字符则转换为小写字符,若输入为非大写英文字符则不做任何处理,将处理后的字符在新行上显示,循环执行上述过程,直到接收到回车字符为止。

STACK1 SEGMENT STACKDW 40H DUP(0)STACK1 ENDSCODE SEGMENTASSUME CS: CODE, SS: STACK1BEGIN: CALL NEWLINE ; 光标置于下一行行首MOV AH, 01HINT 21HCMP AL, 0DH ; 判断是否为回车字符JNZ L1JMP L2 ; 若是回车字符则退出循环L1: CMP AL, ‘A’; 判断输入字符是否为大写字符JAE L3JMP L4L3: CMP AL, ‘Z’JBE L5JMP L4L5: SUB AL, 20H ; 若是大写字符则转换为小写字符L4: CALL NEWLINE ; 光标置于下一行行首MOV DL, AL ; 显示转换后的字符MOV AH, 02HINT 21HJMP BEGIN ; 循环控制L2: MOV AH, 4CHINT 21HNEWLINE PROC ; 实现回车换行的子程序PUSH AXPUSH DXMOV DL, 0DHMOV AH, 02HINT 21HMOV DL, 0AHMOV AH, 02HINT 21HPOP DXPOP AXRETNEWLINE ENDPCODE ENDSEND BEGIN在例8.3.1中,使用21H号调用的01H号子功能接收单个字符,使用02H号子功能显示单个字符。

NEWLINE子程序中显示了0DH与0AH两个字符,分别为回车字符与换行字符,这两个字符属于控制字符,只改变光标位置,不显示具体字符。

回车字符不改变光标所在行,只是将光标置于第0列(首列);换行字符则不改变光标所在列,只是将光标置于下一行同列位置,若光标已到屏幕底部,则使文本上滚一行。

因此,NEWLINE子程序的功能是将光标置于下一行的首列位置。

程序中的字符转换方法是将大写字符的ASCII码减去20H,这是因为大写字符的ASCII码范围为41H至5AH,小写字符的ASCII码范围为61H至7AH,对应的大小写字符间相差20H。

例8.3.2设计一程序,完成如下功能:从键盘接收一个字符串,并在接收时回显输入的字符串,输入字符串最大允许20个字符(不计回车字符),将字符串中的数字字符全部删除,并在新行上显示处理后的字符串。

DA TA SEGMENTMAXLEN DB 20 ; 0AH子功能入口参数,指定最大字符数INPTLEN DB ? ; 0AH子功能出口参数,返回实际输入的字符数STR1 DB 21 DUP(0) ; 0AH子功能的字符串缓冲区STR2 DB 21 DUP(0) ; 09H子功能的字符串缓冲区DA TA ENDSSTACK1 SEGMENT STACKDW 40H DUP(0)STACK1 ENDSCODE SEGMENTASSUME CS: CODE, DS: DA TA, SS:STACK1BEGIN: MOV AX, DA TAMOV DS, AXLEA DX, MAXLEN ; 输入字符串MOV AH, 0AHINT 21HXOR CX, CXMOV CL, INPTLEN ; 循环次数为实际输入的字符数LEA SI, STR1LEA DI, STR2LOP1: CMP [SI], 30H ; 判断当前字符是否为数字字符JAE L1JMP L2L1: CMP [SI], 39HJA L2JMP L3L2: MOV AL, [SI] ; 若为非数字字符则保存至STR2 MOV [DI], ALINC DIL3: INC SI ; 若为数字字符则不保存至STR2 LOOP LOP1MOV [DI], ‘$’; STR2以‘$’字符结尾CALL NEWLINE ; 回车换行LEA DX, STR2 ; 显示处理后的字符串MOV AH, 09HINT 21HMOV AH, 4CHINT 21HNEWLINE PROC ; 实现回车换行的子程序PUSH AXPUSH DXMOV DL, 0DHMOV AH, 02HINT 21HMOV DL, 0AHMOV AH, 02HINT 21HPOP DXPOP AXRETNEWLINE ENDPCODE ENDSEND BEGIN类似DOS功能调用09H的字符串显示子程序DOS功能调用09H是实现字符串显示的软中断。

相关文档
最新文档