汇编第6章 子程序设计
汇编语言程序设计

6)组合运算符(属性修改运算符) ① PTR运算符:运算符PTR可以指定或修改存储器操作数的 类型。注意,这种修改是临时性的,仅在该语句内有效。 下面是使用PTR运算符的例子: 例10 INC BYTE PTR[BX] 该语句的目的操作数是内存单元,用寄存器作为地址指 针。如果仅仅使用[BX]来表示该操作数,则汇编该语句时 ,不能确定该存储单元是字节单元还是字单元。因此,必 须使用BYTE PTR说明它为字节操作数(若为字操作数, 则使用WORD PTR说明)。
4)分析运算符:分析运算符有:SEG、OFFSET、TYPE、 LENGTH和SIZE。 ① SEG运算符:利用SEG运算符可以得到一个标号或变量的段 基值。下面的指令将ARRAY的段基值送给DS寄存器。 例4 MOV AX,SEG ARRAY MOV DS,AX ② OFFSET运算符:利用OFFSET运算符可以得到一个标号或 变量的偏移量。下面的指令将STRING的偏移地址送给DX。 例5 MOV DX,OFFSET STRING ③ TYPE运算符:运算符TYPE的运算结果是一个数值,这个数 值与操作数类型的对应关系见表4-1。
4.1.3
汇编语言的表达式
(3)表达式。表达式是操作数常见的形式,它由常数、变量 、标号通过操作运算符连接而成。 汇编语言中有:算术运算符、逻辑运算符和关系运算符等 。 1)算术运算符:常用的有:+(加)、–(减)、*(乘)、/ (除)和MOD(模运算)等,算术运算的结果是一个数值 。 例1 MOV AX,VARX+2 表示VARX的地址加2后对应的存储字单元内容送给AX。 2)逻辑运算符:AND(逻辑“与”)、OR(逻辑“或”) 、NOT(逻辑“非”)和XOR(逻辑“异或”)。逻辑运算 用于数值表达式中对数值进行按位逻辑运算,并得到一个数 值结果。 例2 MOV AL,0FH AND 35H 表示将0FH与35H按位相与后得到05H送给AL, 这条指令 与MOV AL, 05H 等效。
《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,
并转到子程序入口地址去执行子程序。
❖ 返回指令
汇编语言程序设计(第四版)【课后答案】

汇编语言程序设计第四版【课后习题答案】第1章汇编语言基础知识〔习题1.1〕简述计算机系统的硬件组成及各部分作用。
〔解答〕CPU:包括运算器、控制器和寄存器组。
运算器执行所有的算术和逻辑运算;控制器负责把指指令逐条从存储器中取出,经译码分析后向机器发出各种控制命令,并正确完成程序所要求的功能;寄存器组为处理单元提供所需要的数据。
存储器:是计算机的记忆部件,它用来存放程序以及程序中所涉及的数据。
外部设备:实现人机交换和机间的通信。
〔习题1.2〕明确下列概念或符号:主存和辅存,RAM和ROM,存储器地址和I/O端口,KB、MB、GB和TB。
〔解答〕主存又称内存是主存储器的简称,主存储器存放当前正在执行的程序和使用的数据,CPU可以直接存取,它由半导体存储器芯片构成其成本高、容量小、但速度快。
辅存是辅助存储器的简称,辅存可用来长期保存大量程序和数据,CPU需要通过I/O接口访问,它由磁盘或光盘构成,其成本低、容量大,但速度慢。
RAM是随机存取存储器的英语简写,由于CPU可以从RAM读信息,也可以向RAM写入信息,所以RAM也被称为读写存储器,RAM型半导体存储器可以按地址随机读写,但这类存储器在断电后不能保存信息;而ROM中的信息只能被读出,不能被修改,ROM型半导体通常只能被读出,但这类存储器断电后能保存信息。
存储器由大量存储单元组成。
为了区别每个单元,我们将它们编号,于是,每个存储单元就有了一个存储地址,I/O接口是由一组寄存器组成,为了区别它们,各个寄存器进行了编号,形成I/O地址,通常称做I/O端口。
KB是千字节、MB是兆字节、GB是吉字节和TB是太字节,它们都是表示存储器存储单元的单位。
〔习题1.3〕什么是汇编语言源程序、汇编程序、目标程序?〔解答〕用汇编语言书写的程序就称为汇编语言源程序;完成汇编工作的程序就是汇编程序;由汇编程序编译通过的程序就是目标程序。
〔习题1.4〕汇编语言与高级语言相比有什么优缺点?〔解答〕汇编语言与高级语言相比的优点:由于汇编语言本质就是机器语言,它可以直接地、有效地控制计算机硬件,因而容易产生运行速度快,指令序列短小的高效目标程序,可以直接控制计算机硬件部件,可以编写在“时间”和“空间”两方面最有效的程序。
汇编语言程序设计

《汇编语言程序设计》课程教学大纲学时:32 学分:2理论学时:24 实验学时:8面向专业:电科、电信、通信课程代码:B2700009先开课程:C语言程序设计课程性质:必修执笔人:王艳春审定人:陈龙猛、张金政第一部分:理论教学部分一、说明1、课程的性质、地位和任务本课程属于专业基础课,是电科、电信和通信专业学生必修的核心课程之一,是进一步学习微机原理、操作系统等课程的基础。
掌握它有助于提高学生对计算机系统的设计、研究、开发和应用能力。
汇编语言是一种面向机器、实践性很强的程序设计语言,必须结合一种实际的计算机来组织教学。
因此,本课程选择最广泛使用的IBM PC作为具体的机型来介绍。
通过课堂教学和上机实践,培养学生用汇编语言进行编程的思路、方法,养成良好的程序设计习惯,并了解底层I/O 驱动软件的编程方法,熟悉源程序汇编、链接和调试运行的步骤和方法,掌握dos、BIOS功能的调用方法及使用debug工具的调试手段,为后续课的学习打下扎实的基础。
2、课程教学和教改基本要求课程的目的与教学基本要求:本课程主要介绍汇编语言和宏汇编的基本概念,80X86CPU的指令系统和寻址方式;介绍汇编语言程序格式、伪操作和上机全过程。
通过实际例子,详细叙述顺序、分支、循环、子程序等基本程序结构以及程序设计的基本方法和技巧。
学习这门课程,应达到以下几个要求:①掌握汇编语言的基本理论知识和有关概念;掌握用汇编语言编写源程序的基本原则、方法和技巧;②具有阅读,分析汇编语言程序的能力;③通过上机实践,能够熟练地掌握汇编语言程序的编辑、汇编、连接、运行过程及debug工具的调试手段。
课堂授课采用多媒体教学,采用由浅入深、循序渐进学习步骤,主要讲解设计思想、实现技巧,通过提问题引导学生思考,提高学生的学习兴趣,从而加深学生对理论课的理解,提高学生的动手能力。
二、教学内容与课时分配第一章基础知识(2学时)1.1 机器语言及汇编语言的产生1.2 汇编语言的组成1.3 存储器1.4 指令和数据1.5 存储单元及CPU对存储器的读写1.6 三大总线1.7 主板、接口卡及各类存储器芯片1.8 内存地址空间教学的重点与难点:指令和数据在内存或磁盘上没有区别;内存地址空间。
汇编语言程序设计

段寄存器赋值
在DOS环境下运行程序时,DOS的装载程序对寄 存器CS:IP、SS:SP作正确的初始化,而将段寄存 器DS、ES初始化为程序段前缀PSP的起点,而不是用 户所需的地址。因此段寄存器DS、ES的赋值还要有程 序本身来完成。如 MOV AX,DATA MOV DS,AX 注意这里的MOV 指令,其源操作数是段名,它是把 段名对应段的基地址送给目的操作数,这是传送指令 中的一个特殊情况。
汇编语言程序语句的格式
注释域以分号打头,注释部分是编程者对指令的作 用所作的言简意赅的说明。汇编语言不对这部分汇编。
• 汇编语言中的标号或名字或其他变量名(统称标识符)
必须是由字母或特殊字符打头的字母数字串,中间不能 有空格。合法的字符包括:字母 A~Z 或 a~z ;数字 0~9 ; 特殊字符有问号(?)、圆点(.)、@、下横线(_) 和美元符号($),圆点只能作为第一个字符。 标号和名字的长度不超过31个字符,超过部分均被删 去。 标识符不能和保留字重名
MASM.EXE是用于8088/8086、80286、80386等CPU的微机上的一种宏汇编 程序。它支持多模块的程序设计,由它生成的目标程序可直接和其他模块的汇编 语言程序的目标程序相连接,也可直接和其它高级语言程序的目标程序模块相连 接。
8088/8086汇编语言程序的上机操作过程:
1)根据任务要求,应用指令系统给定的指令编制程序; 2)利用编辑软件如EDIT等将程序输入计算机,程序名后缀*.asm; 3)应用MASM.EXE对.asm程序进行汇编,得到*.obj和*.lst文件; 4)应用LINK.EXE程序对.obj文件进行连接定位,得到*. exe文件; 5)执行*. exe文件,应用文件进行调试、查看文件执行情 况。
C语言程序设计各章练习题

《C 语言程序设计》各章练习题2016年12月汇编第1-3章 C 语言基础、编程规范、顺序结构程序设计编程题1:设a 和b 均为int 型变量,编写一个程序,通过键盘读入a,b 的值,然后交换a,b 的值。
要求屏幕显示“输入2个整数,用空格隔开”的提示语句,并且输出交换前a,b 的值,交换后a,b 的值。
附加要求:(1)允许定义第3个变量,实现交换;(2)不允许定义第3个变量,实现交换。
第4章选择结构程序设计编程题2:根据下列函数关系写程序,要求提示输入x 的值,输出y 的值。
编程题2:根据下列函数关系写程序,要求提示输入x 的值,输出y 的值。
编程题3:求 ax 2+bx+c=0方程的解。
(只输出b 2-4ac>=0的求解结果,小于0,输出“不予求解!”)第5章 循环结构程序设计编程题4:编程计算∑=ni i 1。
要求提示键盘输入n ,如n 为负数,不予计算,直接返回。
编程题5:编程序计算n !,要求n 从键盘输入,如n 小于0,不予计算。
编程题6:从键盘输入一个数n ,判断n 是否是素数。
编程题6:编写程序输出1~100之间的偶数,要求屏幕显示时5个偶数一行,每个数占5位,右对齐。
编程题7:编程计算100到1000之间有多少个数其各位数字之和是5,并将其输出。
编程题8:求满足下列条件的三位数n,它除以11(整数相除)所得到的商等于n的各位数字的平方和,且其中至少有二位数字相同的数。
编程题9:有一些十进制整数对ab和cd具有如下特性:ab×cd=ba×dc,其中a≠b且c≠d。
如:12×42=21×24。
请编程找出30~50之间满足上述等式所有m,n值,并按上述等式的格式输出。
(×用*表示)编程题10:从键盘上输入一个整数,然后把这个整数的各位逆序输出。
例如,输入123456,输出654321。
第6章数组编程题11:有一个已排好序的数组int a[11]={-5,-3,0,6,8,12,16,28,66,88};,要求输入一个数后,按原来排序的规律将它插入数组中。
《计算机科学概论》第6章 程序设计语言

传统的程序设计概念
2.数据结构
抽象的描述:数据的概念形态或布局。 通俗的理解:
当相同类型或不同类型的一组数据结合在一起使用时,可以使 用某种方式将它们组织起来,这种数据的组织方式就叫做数据结构。
一种常用的数据结构----数组,数组有: 同构数组(homogeneous array) 异构数组(heterogeneous array)
字符(character)类型 用来指称符号组成的数据 比较、查找、连接等运算
布尔(Boolean)类型 指称只有真和假两种值的数据项
传统的程序设计概念
1.变量和数据类型-说明变量的一般形式:
数据类型 变量名; 例如: int Height;
int Height, Width; int height = 100;
例如:Z = X + Y; Z := X + Y;
运算符优先(operator precedence) 赋值语句中的表达式的运算次序是借助运算符的优先级实现的 例如:2*4+6/2
重载(overloading):一个运算符的多重使用称为运算符的重载 例如: “abc” + “ok” 结果是:“abcok”
历史回顾
程序设计范型
程序设计范型代表了在构建问题的解决方法时的不同方法。 范型影响了整个软件的开发过程。我们应该称为软件开发范型。
历史回顾
程序设计范型
历史回顾
程序设计范型- 命令型范型 (过程型)
是一种传统的程序设计方法 这种范型告诉我们的程序设计方法是:先找到解决问题的算法,
然后用命令序列表示这个算法。 C、Pascal、BASIC…
过程的目的是要产生一个值,而不是一个动作。 例如:
《汇编语言》作业答案

3545233.doc 制作:江家宝《IBM—PC汇编语言程序设计》课后作业参考答案目录第一章:基础知识 ........................................................................................ 2第二章:80×86计算机组织......................................................................... 2第三章:80×86的指令系统和寻址方式..................................................... 3第四章:汇编语言程序格式........................................................................ 7第五章:循环与分支程序设计.................................................................... 9第六章:子程序结构 ................................................................................ 12第七章:高级汇编语言技术.................................................................... 20第八章:输入输出程序设计.................................................................... 22第九章:BIOS和DOS中断 (23)3545233.doc 制作:江家宝第一章:基础知识1.1、用降幂法和除法将下列十进制数转换为二进制数和十六进制数:(3) 4095 答:(3) 4095 =1111 1111 1111B=FFFH1.2、将下列二进制数转换为十六进制数和十进制数:(1) 10 1101 答:(1) 10 1101B=2DH=451.3、将下列十六进制数转换为二进制数和十进制数:(4) 1234 答:(4) 1234H=1 0010 0011 0100B=46601.4、完成下列十六进制数的运算,并转换为十进制数进行校核:(3) ABCD-FE 答:(3) ABCD-FEH=AACFH=437271.5、下列各数均为十进制数,请用8位二进制补码计算下列各题,并用十六进制数表示其运算结果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int i=0; void func(){ i++; } int main(){ func();
;ax相当于i ;调用s子程序
;i++
return 0;
}
程序 DISPLAY2.ASM
汇编语言程序设计
四. 现场保护与恢复
要保护的寄存器:应该是在子程序 中将被使用,返回调用程序后仍然 需要使用其原有内容的那些寄存器。 即保护调用程序和子程序两者在使 用上发生冲突的那些寄存器。但在 编程时,一时很难弄清哪些是有冲 突的寄存器,一种较为简单的方法 是把所有的寄存器均加以保护。 一般在子程序中进行寄存器保护较 好。即在子程序的开始部分,先进 行相关寄存器(主要是在子程序中 使用的各寄存器)的保护。然后再 进行子程序的处理操作。在执行完 子程序后,返回前,先恢复各寄存 器内容后,再返回调用程序。
汇编语言程序设计
code segment main proc far …… call subp …… ret main endp subp proc near ……
code1 segment main proc far …… call far ptr subp …… ret main endp code1 ends
newchar:
add_to:
mov int sub jl cmp jl sub cmp jl cmp jge mov shl mov add pop loop ret endp
exit: hexibin
binidec dec_div proc mov mov div mov mov add mov int ret dec_div endp
; 1610
Crlf proc near push ax push dx mov dl, 0dh ; mov 162 ah,2 int 21h ; 210 mov dl, 0ah mov ah,2 int 21h pop dx pop ax ret Crlf endp
ends end
start
汇编语言程序设计
例3:累加数组中的元素(通过地址表传送参数地址)
data segment ary dw 10,20,30,40,50,60,70,80,90,100 count dw 10 sum dw ? table dw 3 dup (?) ; 地址表 ends segment proc far assume cs:code, ds:data push ds sub ax, ax push ax mov ax, data mov ds, ax mov table, offset ary ;把要传送给子程序 mov table+2, offset count;的参数都存放在地址 mov table+4, offset sum ;表中,然后把地址表 mov bx, offset table;的首地址通过寄存器 call proadd ;BX传送到子程序中去。 ret endp
binidec:输出5位的十进制数值 入口参数为BX。
binidec proc mov call mov call mov call mov call mov call ret near cx, 10000d dec_div cx, 1000d dec_div cx, 100d dec_div cx, 10d dec_div cx, 1d dec_div
指令功能: 把CALL指令的下一条指令地址(称为返回点或断点) 推入堆栈保存,然后转到目标地址(DST)。 CALL指令可以在段内、段间调用,寻址方式分为直接 和间接两种。
汇编语言程序设计
段内直接近调用:CALL DST 执行操作: (SP) ← (SP) - 2 ( (SP)+1,(SP) ) ← (IP)
dw dw dw dw dw dw
1,2,3,4,5,6,7,8,9,10 10 ?
10,20,30,40,50,60,70,80,90,100 10 ?
如果直接访问内存变量,那么累加数组ary
和数组ary1中的元素不能用同一个子程序 proadd。 那如何能实现调用同一个子程序proadd来累加另一个 数组元素?
subt
proc
push push push push …… …… pop pop pop pop
ret
near
ax bx cx dx
dx cx bx ax
subt
endp
汇编语言程序设计
五. 子程序的参数传送
入口参数:子程序需要从主程序获取的参数。使子程序可以对不同 实现的方法是把子程序所需要的入口参 数据进行相同功能的处理。 数,由调用程序预先放入指定的寄存器 出口参数:是子程序返回给主程序的参数。使子程序可以将不同的 中。在进入子程序后,子程序就可直接 结果送至主程序 对这些寄存器内容进行操作了。同样子 (1) 通过寄存器传送参数 程序的运行结果,也可置入寄存器中, 把它们作为子程序的出口参数寄存器使 (2) 通过存储器传送参数 用。由于寄存器数目有限,适用于参数 较少的情况。
执行操作: POP IP
表达式(能 计算出结果)
(IP)
。。。 (SP)→(SP)+EXP
段内带立即数近返回:RET EXP
执行操作: POP IP (SP) (SP)+EXP
(SP)→ (SP)→
段间远返回:RET(F)
执行操言程序设计 code segment main proc far Start: 主程序模块 push ds Sub ax,ax push ax …… push ax 程序返回 push bx push cx call sub …… ret 子程序模块 main endp sub proc near …… ret 6 sub endp code ends end start
code2 segment subp proc far ……
ret
subp endp code ends
ret
subp endp code2 ends
段内调用和返回
段间调用和返回
汇编语言程序设计
segx
subt
segment
proc …… ret endp …… subt …… far
subt call
segx segy
call
ends segment
…… far ptr subt ……
同一个子程序 可以被段内调 用,也可以段 间调用
segy
ends
汇编语言程序设计
三. 子程序的调用与返回指令
(1)CALL 子程序调用指令:隐含使用堆栈保存返回地址 指令格式: CALL DST ;其中DST为过程的目标地址(即过程名)。
endp near ax, bx dx, 0 cx bx, dx dl, al dl, 30h ah, 2 21h
汇编语言程序设计
例2:累加数组中的元素(通过存储器传送参数)
data segment ary count sum ends segment assume dw dw dw 1,2,3,4,5,6,7,8,9,10 10 ? proadd cs:code,ds:data proc
调用程序:编制程序时,按需要转向子程序,称为子程序调用, 或称为过程调用。调用子程序的程序称为调用程序或主程序。主、 子程序是相对而言的。但子程序一定是受调用程序或主程序调用 的。子程序定义的位置可以放在主程序的前面或后面。
汇编语言程序设计
子程序与调用程序
子程序调用
主程序: … CALL ---… CALL ---… CALL ---…
call
ax, data ds, ax
proadd
next:
main
mov int endp
ax,4c00h 21h
code
ends end
start
proadd
endp
汇编语言程序设计
如果数据段定义如下:
data segment
ary count sum ary1 count1 sum1
data ends
汇编语言程序设计 hexibin:接收4位十六进制数的输入 出口参数为BX。
hexibin proc mov mov push near bx, 0 cx,4 cx ah, 1 21h al, 30h exit al, 10 add_to al, 27h al, 0ah exit al, 10h exit cl, 4 bx, cl ah, 0 bx, ax cx newchar
(IP) ← (EA)
DST给出寄存器或存储单元的内 容(转向地址) 比如: CALL word ptr [bx]
汇编语言程序设计
DST给出子程序的入口地址 (子程序为far属性) 比如:CALL far ptr subp
段间直接远调用:CALL FAR PTR DST
执行操作: PUSH CS PUSH IP (IP) ← DST偏移地址 (CS) ← DST段地址
子程序: … … … RET
子程序返回
汇编语言程序设计
二. 过程定义伪操作
子程序入口 的符号地址
过程名 PROC . . . RET 过程名 ENDP
NEAR ( FAR )
子程序返回
(1)NEAR属性:调用程序和子程序在同一代码段中, 可省略。(段内调用) (2)FAR属性:调用程序和子程序不在同一代码段中。 (段间调用)
hexidec:接收键盘输入的十六进制数,在屏 幕上输出相应的十进制数
hexidec main start: segment assume cs: hexidec proc far push ds sub ax, ax push ax call call call call main …… …… …… hexidec ret endp hexibin crlf binidec crlf