汇编语言程序设计 第六章

合集下载

《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,
并转到子程序入口地址去执行子程序。
❖ 返回指令

汇编语言程序设计第六章课件

汇编语言程序设计第六章课件

Subt endp
第10讲(第10周):子程序设计方法
前一讲 后一讲
总目录
6.1.5、子程序的参数传递 1、通过寄存器传送参数适用于同一模块内或不同模块之间的参数传递
2、通过存储器数据区变量传送参数适用于同一模块内的参数传递
子过程直接访问模块的数据区的变量名(参见P203例6.4); 3、通过存储器数据区地址表传送参数地址适用于同一模块内的多个参数传递 在数据区或主调过程中定义多个用于传递参数的变量以及一个用于存放这些 参数变量偏移地址的变量(称之为“地址表”);在主调过程中通过指令或定 义地址表初始化时把传给子过程的参数变量地址都放在地址表中,然后把地 址表的首地址给BX;
4、通过堆栈传送参数适用于同一模块内或不同模块之间的参数传递;
把参数或参数地址压入堆栈,在子过程中用BP指向参数或参数地址; 5、多个模块之间的参数传送多个模块程序连接时,所有代码段以及数据段不
一定要分别连接在一起形成一个大的代码段或一个大的数据段,分散的多个
模块间参数传递可以通过“公共数据段”和“外部符号”两种方法实现;
第10讲(第10周):子程序设计方法
前一讲 后一讲
总目录
[3].形参列表字段(parameters field) : 格式参数名1:参数类型[,参数名2:参数类型,…,参数名n:参数类型] ASM将自动把堆栈的[BP+4]、[BP+5]、 …等区域视为形参区域,实例如下: 形参定义为:par1:word, par2:word, par3:word 局部变量定义为:var1:word, var2[2]:word, var3:byte, var4:byte
第10讲(第10周):子程序设计方法
前一讲 后一讲

最新六章汇编语言及其程序设计

最新六章汇编语言及其程序设计

字位,0:参加运算的操作数为字节操作数 1:参加运算的操作数为字操作数
7
21 0
形式1 OP CODE D W
7
21 0
1~2个字节 1~2个字节
形式2 OP CODE D W MOD REG R / M DATA/DISP DATA/DISP
7
2 1 0 1~2个字节 1~2个字节
形式3 OP CODE D W DATA/DISP DATA/DISP
BX
BL
111
DI
BH
MOD
R/M
000 001 010 011 100 101 110 111
存储器方式
有效地址的计算公式
00
01
10
(BX)+(SI) (BX)+(SI)+D8
(BX)+(DI) (BX)+(DI) +D8
(BP)+(SI) (BP)+(SI) +D8
(BP)+(DI) (BP)+(DI) +D8
指令格式 mov 目的,源 功能:该指令将源内容送至目的地址内 例:
mov ax, bx 将寄存器bx中的内容送到寄存器ax中
与数据有关的寻址方式
立即寻址方式
操作数直接存放在指令中,紧跟在操作码之后,它作 为指令的一部分存放在代码段里,这种操作数称为立 即数。
立即数可以是8位的或者16位的。(386之后的机器也 可以是32位的)
REP , REPZ , REPNZ
控制转移指令(28条)
子程序调用 子程序返回 无条件转移 条件转移
循环 条件循环 寄存器CX=0转移
中断 中断返回

汇编语言程序设计

汇编语言程序设计

《汇编语言程序设计》课程教学大纲学时: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 内存地址空间教学的重点与难点:指令和数据在内存或磁盘上没有区别;内存地址空间。

2019年第六部分汇编语言程序设计.ppt

2019年第六部分汇编语言程序设计.ppt

1
C54x汇编语言程序设计的基本方法 (1)程序的控制与转移 (2)堆栈的使用方法 (3)加、减法和乘法运算 (4)重复操作 (5)数据块传送 (6)双操作数乘法 (7)长字运算和并行运算 (8)小数运算 (9)除法运算 (10)浮点运算
SZU-TI DSPs Lab
Dr. JI ZHEN
2
1 程序的控制与转换 基本的程序控制指令
SZU-TI DSPs Lab
Dr. JI ZHEN
11
example.asm程序清单(续)
.text start: STM STM STM STM LD loop: LD STL BANZ CALL end: B ;code follows ... #STACK+10h, SP ;set stack pointer #table,AR1 ;AR1 point to table #x,AR2 ;AR2 point to x #7,AR0 #0,A *AR1+,A ;move 8 values A,*AR2+ ;from program memory loop,*AR0;into data memory SUM ;call SUM subroutine end
14
3
例:
加、减法和乘法运算
y=x1*a1+x2*a2 LD @x1, T MPY @a1, B LD @X2, T MAC @a2, B STL B, @y STH B, @y+1
SZU-TI DSPs Lab
Dr. JI ZHEN
15
3
例:
加、减法和乘法运算
[例8] 在表3-1的4项乘积 aixi (i=1,2,3,4) 中 找出最大值,并放在累加器A中 STM #a, AR1 STM #x, AR2 STM #2, AR3 LD *AR1+, T MPY *AR2+, A ;第一个乘积在累加器A中 loop1:LD *AR1+, T MPY *AR2+, B ;其它乘积在累加器B中 MAX A ;累加器A和B比较,选大的存在A中 BANZ loop1, *AR3- ;此循环中进行3次乘法和比较

第6章程序设计语言习题与答案

第6章程序设计语言习题与答案

第六章习题(1)复习题1、简述自然语言与形式语言的概念以及区别、汇编语言与机器语言的概念及区别。

自然语言是某一社会发展中形成的一种民族语言,而形式语言是进行形式化工作的元语言,它是以数学和数理逻辑为基础的科学语言。

用机器指令形式编写的程序称为机器语言,用带符号或助记符的指令和地址代替二进制代码成为语言进化的目标。

这些使用助记符语言的语言后来就被称之为汇编语言。

(P135P136)2、什么是高级程序设计语言?它有什么特点?高级语言是汇编语言的一种抽象。

高级语言的设计目标就是使程序员摆脱汇编语言细节的繁琐。

高级语言同汇编语言都有一个共性,那就是:它们必须被转化为机器语言,这个转化的过程称为解释或编译。

(1)高级语言接近算法语言,易学、易掌握;(2)高级语言设计出来的程序可读性好,可维护性强,可靠性高;(3)高级语言与具体的计算机硬件关系不大,其程序可移植性好,重用率高;(4)高级语言自动化程度高,开发周期短,利于提高程序的质量。

(P138)3、列举程序设计语言的几种范型。

程序语言大致分为命令式程序设计语言、面向对象的程序设计语言、函数式程序设计语言和逻辑型程序设计语言等范型。

(P138-140)4、简述语言虚拟机。

提示:语言虚拟机是某种语言的解释器。

语言虚拟机是建立在硬件和操作系统之上,针对不同的硬件和操作系统有不同的虚拟机,通过语言虚拟机屏蔽掉硬件的差异。

这样使得硬件系统能够支持这种语言编写的程序的有效执行。

目前最流行的语言虚拟机是Java虚拟机。

(P147)5、计算机执行用高级语言编写的程序有哪些途径?它们之间的主要区别是什么?提示:主要有编译、解释等方式,也有两种方式的混合使用的形式。

编译是使用编译器将高级语言编写的源程序转换成计算机可以执行的机器语言可执行程序,也可以理解为用编译器产生可执行程序的动作。

编译方式是一次编译,然后执行程序可以反复多次执行。

解释是另一种将高级语言转换为可执行程序的方式。

《汇编语言》作业答案

《汇编语言》作业答案

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位二进制补码计算下列各题,并用十六进制数表示其运算结果。

汇编语言第六章

汇编语言第六章

三.中断向量表
3. 设置或取出中断向量指令 (1) 设置中断向量指令 功能:把由AL指定的中断类型的中断向量DS:DX放入中
断向量表中。
(AH)= 25H
(AL)= 中断类型号
DS:DX = 中断向量 INT 21H
三.中断向量表
(2) 取出中断向量指令
功能:把AL中指定的中断类型的中断向量从中断
一、 WIN32编程基础
(2) 循环控制伪指令
格式:.WHILE 条件表达式 循环体 .ENDW 格式:.REPEAT 循环体 .UNTIL 条件表达式 格式:.CONTINUE 功能:终止本次循环, 开始下一次循环 格式:.BREAK 功能:退出当前循环
功能:实现循环结构
一、 WIN32编程基础
内中断的处理特点: ①中断类型号一般在指令中; ② 不受中断允许标志位IF的影响。
二、 中断源
2. 外中断 由外设控制器、协处理器等CPU以外的事件引起的中断, 称为外中断。 外中断的处理特点: ① 中断类型号由8259A提供,或由自制电路来提供;
② 受中断允许标志位IF的影响(IF=1,响应中断)。
个字节。
三.中断向量表
如:INT 4AH
中断向量地址 = 4AH*4 = 128H
DEBUG执行后, 用D命令查看: ―D0:0↙ … 执行INT 4AH时: IP=1805H CS=F000H IP F000: 1805 中断处理
0:128H
0:129H
05 18
0:12AH
0:12BH
00
F0 …
外设
二、 外设与主机传送的接口与信息
接口的组成:设备状态寄存器、设备控制寄存 器、数据寄存器。 I/O端口的地址空间:允许设置64K个8位端口 或32K个16位端口。 如:40H~43H时钟/定时器,60H~63H为 8255通讯芯片的接口。

第六章循环和分支程序

第六章循环和分支程序
当两个带符号数相比较时,当A<B时,转移到目标地址。
2)JGE/JNL(jump if greater or equal, or not less) JGE指令(大于等于转移) JNL指令(不小于转移) 两个带符号数相比较时,若A≥B,转移到目标地址
25
2、判断带符号数的大小的条件转移指令
3)JL/JNGE(jump if less, or not greater or equal ) JL指令(小于转移) JNGE指令(不大于等于转移)
即 将双字存储变量第二个字作为段地址, 第一个字为偏移地址处继续执行。
20
5、 段间直接转移 格式: JMP 标号 例如:
;标号为FAR属性
CODE1 SEGMENT ∶
JMP CODE2_NEXT

CODE1 ENDS
CODE2 SEGMENT

CODE2_NEXT LABEL FAR

CODE2 ENDS
5 8/8/2019
2、LOOPE/LOOPZ(如果相等/如果为0则循环) 格式:LOOPE/LOOPZ 短距离标号 功能:该指令将 CX减 1,若 CX不为 0且ZF置1 (即CX≠0且运算结果为0),则将控制转移到 目标操作数,否则: 顺序执行LOOPE/LOOPZ指令之后的指令。
6 8/8/2019
如果一个标号能被其他段中的JMP指令(或CALL) 来访问,那么需要将这个标号的距离定义为FAR。
15 8/8/2019
1、定义距离属性为NEAR的标号
1)隐式说明:即在标号后面加上冒号,放在指令的前面。 例如:L1: MOV AX,[SI] NEXT: MOC AX,BX
L1和NEXT都是标号名,它们的距离属性均为NEAR。

汇编语言程序设计(第二版) 沈美明 温冬婵 编著

汇编语言程序设计(第二版) 沈美明 温冬婵 编著

汇编语言程序设计(第二版)(清华大学IBM-PC 汇编语言程序设计(第二版)沈美明温冬婵编著)第二章1、答:直接由指令指定的I/O端口数为256个。

2、答:3、答:字节单元:(30022H)= AB H,(30024H)= EF H字单元:(30021H)= AB34 H,(30022H)= CDAB H。

4、答:3017:000A的存储单元的物理地址是3017AH,3015:002A的存储单元的物理地址是3017AH,3010:007A的存储单元的物理地址是3017AH。

5、答:该程序的第一个字的物理地址是0AAA40H。

6、答:条件标志OF、SF、ZF、CF的值依次分别为0、0、0、0。

7、答:(1)AX、BX、CX、DX、AH、AL、BH、BL、CH、CL、DH、DL、SP、BP、DI、SI(注意:学生尽量不要用SP参与加减运算)(2)CX(3)DX、AX、AH、AL(4)CS、DS、ES、SS(5)FLAGS(6)IP(7)SS、SP、BP8、答:可以用来指示存储器地址的寄存器有BX、SP、BP、DI、SI、IP、CS、DS、ES、SS。

9、答:唯一正确的是D。

第三章2、答:(1)ADD DX, BX(2)ADD AL, [BX][SI](3)ADD [BX+0B2H], CX(4)ADD [0524H], 2A59H(5)ADD AL, 0B5H3、答:(1)MOV BX, OFFSET BLOCK + 0AHMOV DX, [BX](2)MOV BX, 0AHMOV DX, BLOCK[BX](3)MOV BX, OFFSET BLOCKMOV SI, 0AHMOV DX, [BX][SI]4、答:(1)1200H(2)0100H(3)4C2AH(4)3412H(5)4C2AH(6)7856H(7)65B7H6、答:MOV BX, 2000HLES DI, [BX]MOV AX, ES : [DI]7、答:(1)064DH(2)0691H(3)05ECH9、答:(1)MOV AX, [ BX+0CH ]MOV ZERO, AX(2)MOV AX, ARRAY[BX]MOV ZERO, AX10、答:(1)(AX)= 1234H(2)(AX)= 0032H11、答:(AX)= 1E00H12、答:LEA BX, CSTRINGMOV DL, [BX]MOV DH, [BX+6]13、答:14、答:LES BX, [2000]MOV AX, ES:[BX]16、答:(1)74D4H SF=0 ZF=0 CF=0 OF=0 (2)A5C1H SF=1 ZF=0 CF=0 OF=1 (3)3240H SF=0 ZF=0 CF=1 OF=0 (4)0000H SF=0 ZF=1 CF=1 OF=0(1)0C754H SF=1 ZF=0 CF=1 OF=0 (2)12B0H SF=0 ZF=0 CF=0 OF=0 (3)45B0H SF=0 ZF=0 CF=0 OF=1 (4)9F24H SF=1 ZF=0 CF=0 OF=021、答:(1)MOV AX, ZSUB AX, XADD AX, WMOV Z, AX(2)MOV BX, XADD BX, 6MOV CX, RADD CX, 9MOV AX, WSUB AX, BXSUB AX, CXMOV Z, AX(3)MOV AX, WIMUL XMOV BX, YADD BX, 6IDIV BXMOV Z, AXMOV R, DX22、答:NEG DXNEG AXSBB DX, 016、答:MOV AX, AMOV DX, A+2TEST DX, 8000HJZ STORE ; 为正NEG DXNEG AXSBB DX, 0STORE : MOV B, AXMOV B+2, DX17、答:(1)MOV AL, SSUB AL, 6DASADD AL, VDAAMOV U, ALMOV AL, ZSUB AL, UDASMOV U, ALMOV AL, XADD AL, WDAASUB AL, UDASMOV U, AL23、答:(1)(BX)= 9AH(2)(BX)= 61H(3)(BX)= 0FBH(4)(BX)= 1CH(5)(BX)= 0(6)(BX)= 0E3H26、答:把(DX)(AX)中的双字左移四位(乘以16)。

汇编语言程序设计教程(第二版)习题参考答案

汇编语言程序设计教程(第二版)习题参考答案

汇编语言程序设计教程(第二版)习题参考答案第1章计算机基础知识1.计算机的应用分哪几个方面,请举例说明书中未提到的领域的计算机应用。

科学计算、数据处理、计算机控制、计算机辅助设计、人工智能、企业管理、家用电器、网络应用。

书中未提及的如:远程教育、住宅小区控制、飞行系统控制与管理等。

2.简述计算机的发展过程,请查阅相关资料,列出微机的发展过程。

电子管、晶体管、集成电路、大规模集成电路以IBM为例,微机的发展:4004、8008、8080、8086/8088、80286、80386、80486、Pentium 系列3.计算机的字长是怎么定义的,试举例说明。

计算机能同时处理二进制信息的位宽定义为计算机的字长。

如8086能同时进行16位二进制数据的运算、存储和传输等操作,该机器的字长为16位。

4.汇编语言中的基本数据类型有哪些?数值型数据和非数值型数据。

非数值数据如字符、字符串、逻辑值等。

(1)7BCH=011110111100B=1980D(2)562Q=101110010B=370D(3)90D=01011010B=5AH(4)1110100.111B=164.7Q=74.EH30H~39H 41H~5AH 61H~7AH9.在汇编语言中,如何表示二进制、八进制、十进制和十六进制的数值?用相应进制的数值加上进制标记即可。

二进制用B,如10101010B八进制用Q,如437Q。

十进制用D或不用,如54D,或54。

十六进制用H,如27A8H10.完成下列二进制数的加减运算。

(1)10101010 + 11110000 (2)11001100 + 01010100=110011010 =100100000(3)11011010 - 01010010 (4)11101110 - 01001101=10001000 =1010000111.完成下列十六进制数的加减运算。

(1)0FEA9 - 8888=7621H (2)0FFFF - 1234=EDCBH(3)0EAC0 + 0028=EAE8H (4)3ABC + 1678=5134H12.完成下列BCD码的运算。

6 汇编语言高级编程

6 汇编语言高级编程
其格式为: LOCAL <形式参数表>
说明:如使用LOCAL伪指令,则该伪指令必须是宏定义中的第一条 指令。
18
例题6.7 定义取绝对值的宏指令。
ABS MACRO OPS
LOCAL NEXT ;定义NEXT为形参
CMP OPS,0
JGE NEXT
NEG OPS
NEXT: MOV AX,OPS ;若无LOCAL说明,宏展开后将出现标号重名
6
6.1.2 宏调用与宏展开
宏调用的格式为: <宏名> [<实参表>]
说明: ①宏名为已定义过的宏,即必须先定义、后调用。 ②实参表中的参数将一一对应替换宏定义中形参表中的参
数。两处的参数个数可以不同。若实参个数多于形式参数 个数,则多余的实参忽略;若实参个数少于形式参数个数, 则多余的形式参数用零或空格代替。 ③汇编程序在汇编源程序时,若遇到宏调用,则用调用所 提供的实参数替代相应的形参数,并把宏体中的指令嵌入 到源程序中。这种嵌入操作称为宏展开。
宏名可以与指令名或伪指令名相同,且宏名的优先级别高, 此时与其同名的指令和伪指令将失去作用。为了恢复指令 助记符和伪指令助记符的功能,就必须将宏取消,可用 PURGE伪指令实现此功能。其格式为: PURGE <宏名> [, <宏名>…]
作用:取消已经定义的宏,选用任选项时可同时取消多个宏。 例题6.8 取消例6.4和例6.7定义的宏指令
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
+
mov ah, 09h;宏调用Prompt String1的宏展开
+
lea dx, String1

【汇编语言】32位指令及其编程(可编辑)

【汇编语言】32位指令及其编程(可编辑)

封面第六章 32位指令及其编程第六章32位指令及其编程概述 6.1 32位指令运行环境6.2 32位扩展指令 6.3 32位指令的程序设计 6.4 32位新增指令 6.5 用汇编语言编写 32位WINDOWS应用程序概述1 概述 32位指令系统以80386 CPU 为基础,其指令集可分为整数指令集(16位整数指令集、32位整数指令集)和浮点指令集,16位整数指令集全兼容8086 CPU。

1996年,Intel推出MMX Pentium,首次增加了MMX (多媒体扩展)指令集,提高了CPU对多媒体数据的处理能力。

1999年,Intel推出Pentium Ⅲ,增加了SSE指令集(数据流SIMD扩展指令,SIMD为MMX指令集的关键技术,意为“单指令流多数据流”)。

2000年,Intel推出Pentium4,又增加SSE2指令集,增强了处理器对3-D图象、视频编码解码、语音识别等数据的处理能力。

概述2 本章主要介绍80386的32位整数指令集,及其汇编语言程序设计,对386以后推出的CPU新增指令(0>.、 .、.)简单介绍。

6.5 节简单介绍如何使用汇编语言编写WINDOWS应用程序。

本章应重点掌握: 32位编程环境 32位寻址方式 32位指令编程方法 6.1 32位指令运行环境 6.1 32位指令运行环境补充.386的工作方式及16位段和32位段 . 寄存器组 . 寻址方式 .机器代码格式 386的工作方式:实方式补充 386的工作方式实地址方式:实方式(Real Mode)与8086/80186的工作方式以及80286的实地址方式具有相同的基本结构。

不使用386的优先级分级制,所有程序(DOS和应用程序都工作在0级(特权级)。

32位x86 CPU只能寻址1MB物理存储器空间,分段最大64KB,采用16位逻辑段。

32位x86 CPU可以使用32位寄存器和32位操作数,也可以采用32位寻址方式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

北京理工大学-张华平-2011
10
6.2.1
堆栈特点
1. 临时性 2. 快速性 3. 动态扩展性
北京理工大学-张华平-2011
11
6.2.2
1. 2. 3. 4.
堆栈用途
保护和恢复调用现场 用于变量之间的数据传递 用做临时的数据区 子程序的调用和返回
北京理工大学-张华平-2011
12
6.2.3
6.4 嵌套与递归子程序
一、子程序嵌套 在汇编语言中,允许子程序作为调 用程序去调用另一子程序,把这种关系称 为子程序嵌套。 图6-4为子程序嵌套示意图。嵌套的 层数没什么限制,其层数称为嵌套深度。
由于子程序嵌套对堆栈的使用很频繁,因此 还要确保堆栈有足够空间,并要注意堆栈的正确 状态,这包括CALL、RET、RET N、PUSH、POP、 INT、IRET等与堆栈操作有关指令的正确使用。 子程序嵌套举例见程序6.3,嵌套深度2。
子程序
子程序 子程序
常用于内核程序
C++成员函数使用 自行编写进入/退 出代码
北京理工大学-张华平-2011
16
1.通过寄存器传递
这种传递方式使用方便,适用于参数较少的 情况。 例.把BX中的16位二进制数转换成十进制并 显示在屏幕上。
分析:采用从高到低逐个除以十进制位权的 方法。(见程序6.3)
北京理工大学-张华平-2011
39
1. 外部引用伪指令EXTRN 格式:EXTRN 变量名:类型 [,…] 功能:说明在本模块中用到的 变量是在另一个模块中定义的,同时指 出变量的类型。
北京理工大学-张华平-2011
40
2. 全局符号说明伪指令PUBLIC 格式:PUBLIC 名字[,…] 功能:告诉汇编程序本模块中 定义的名字可以被其他模块使用。这里 的名字可以是变量名,也可以是子程序 名。
北京理工大学-张华平-2011 13
6.3 子程序参数传递
可以通过给子程序传递参数使其更通用。常 用的参数传递方法如下: 通过寄存器传递; 子程序直接访问模块中变量(同一模块); 通过地址表传递参数地址; 通过堆栈传递参数或参数地址。
6.3.1 C语言函数的参数传递方 式
在C/C++以及其他高级语言中, 函数的参数是通过堆栈来传递的。C语 言中的库函数,以及Windows API等也 都使用堆栈方式来传递参数。
分析:虽然主、子程序在同模块中,但由于 在一个程序中要分别求出两个数组的和,因此子 程序不能直接引用数组变量名。 本例用数组首地址、元素个数的地址、和地 址构成地址表,通过地址表传送这些参数的地址, 以便子程序能够访问到所需参数。 见程序6.5。
4.通过堆栈传递参数或参数地址
这种方式适用于参数较多,或子程序有多层 嵌套、递归调用的情况。 步骤: 主程序把参数或参数地址压入堆栈; 子程序使用堆栈中的参数或通过栈中参数 地址取到参数; 子程序返回时使用RET n指令调整SP指针, 以便删除堆栈中已用过的参数,保持堆栈平衡, 保证程序的正确返回。
北京理工大学-张华平-2011
42
程序1a
主模块PRICEM.ASM
EXTRN SUBM:FAR PUBLIC PRICE,QTY,TOTAL
stacksg segment stack 'stk' dw 32 dup('s') stacksg ends data segment PRICE DW 60 QTY DW 80 TOTAL DD ? data ends code segment main proc far assume cs:code,ds:data mov ax,data mov ds,ax CALL FAR PTR SUBM mov ax,4c00h int 21h main endp code ends 北京理工大学-张华平-2011 end main
北京理工大学-张华平-2011
37
在子程序设计中,主程序和子 程序之间可以通过全局变量、寄存器、 堆栈等方式传递数据,这种技术在模 块化程序设计中同样适用。
北京理工大学-张华平-2011
38
6.6.2
模块间的通信
由于各个模块需要单独汇编,于是就会 出现当一个模块通过名字调用另一模块 中的子程序或使用其数据时,这些名字 对于调用者来讲是未定义的,因此在汇 编过程中就会出现符号未定义错误。可 以通过伪指令EXTRN、PUBLIC等来解决。
随着弹出数据的增加,SP的值不断增大,堆 栈可用空间也随之增大。子程序中语句⒄——RET 6指令,在从堆栈弹出返回地址后还要使SP值加6, 这样就跳过了通过堆栈传递的三个参数,或者说 删除了它们。 因此,当主程序的语句⒅——RET指令被执行 时,程序控制从栈顶弹出数字0给IP,弹出PSP的 段基址给CS,于是执行PSP:0处的INT 20H指令, 正确返回操作系统。
3.注意堆栈状态 在设计含有子程序的程序时,要密切 注意堆栈的变化。这包括要注意一切与堆 栈有关的操作。例如CALL调用类型和子程 序定义类型的一致性,PUSH和POP指令的匹 配,通过堆栈传递参数时子程序返回使用 RET n指令等,以确保堆栈平衡。
6.2


所谓堆栈,就是供程序使用的一 块连续的内存空间,一般用于保存和读 取临时性的数据。
为了程序共享或模块化设计的需要, 可以把一段公共语句序列设计成子程序或 宏指令的形式。本章介绍子程序的设计方 法。
6.1 子程序结构及设计方法
一、子程序结构 在汇编语言中用过程定义伪指令定义 子程序。过程定义伪指令格式: 过程名 PROC 属型 …
过程名 ENDP
其中过程名就是子程序名,它也表示子 程序入口的符号地址。 属型可以是NEAR型(缺省值)或FAR型。 NEAR型子程序只可以被段内调用,而FAR型 子程序可以被段间或段内调用。
北京理工大学-张华平-2011
35
6.6
如果有多个源程序文件,或者需 要使用C/C++、汇编等多种语言混合编程, 就需要对这些源程序分别编译,最后连接 构成一个可执行文件。
模块化程序设计
北京理工大学-张华平-2011
36
如图所示,系统由模块A、模块B、 模块C组成,而模块B中的部分功能又可以 进一步分解成为模块D、模块E,整个系统 包括了5个模块。模块中的代码设计为子 程序,能够相互进行调用。
例.完成数组求和功能,求和由子程序实 现,要求通过堆栈传递参数地址。 (见程序6.6)
本例通过BP访问堆栈中的参数。 程序的堆栈变化情况参见图6-1,指示了程序中 所有入栈操作对堆栈的影响随入栈数据的增加,SP 的值不断减小,堆栈可用空间也随之减少。图6-2 为已从子程序返回、而主程序RET指令执行前的堆 栈状态,其中的灰色部分表示执行语句⑿~⒄时已 弹出的数据。
6.5
缓冲区溢出攻击原理
ห้องสมุดไป่ตู้
缓冲区溢出是目前最常见的一种安全问题,操 作系统以及应用程序一般都存在缓冲区溢出漏 洞。缓冲区溢出是由编程错误引起的,当程序 向缓冲区内写入的数据超过了缓冲区的容量, 就发生了缓冲区溢出,缓冲区之外的内存单元 被程序“非法”修改。 一般情况下,缓冲区溢出会导致应用程序的错 误或者运行中止,但是,攻击者利用程序中的 漏洞,精心设计出一段入侵程序代码,覆盖缓 冲区之外的内存单元,这些程序代码就可以被 CPU所执行,从而获取系统的控制权。
43
程序1b EXTRN PUBLIC CODE SUBM
SUBM CODE
子模块PRICES.ASM PRICE:WORD,QTY:WORD,TOTAL:DWORD SUBM SEGMENT PROC FAR ASSUME CS:CODE MOV AX,PRICE MUL QTY MOV word ptr TOTAL,AX MOV word ptr TOTAL+2,DX RET ENDP 返回 ENDS END 北京理工大学-张华平-2011
SUB2
;CALL SUB2
SUB1 SUB2 SUB2 CODE2
二、设计子程序时应注意的问题 1.子程序说明 为便于引用,子程序应在开头对其功 能、调用参数和返回参数等予以说明,例 如参数的类型、格式及存放位置等。
2.寄存器的保存与恢复 为了保证调用程序的寄存器内容不被 破坏,应在子程序开头保存它要用到的寄存 器内容,返回前再恢复它们。
北京理工大学-张华平-2011
15
C函数常见的有5种参数传递方式(调用规则)见 下表。
调用规则 cdecl方式 stdcall方 式 从右至左 从右至左 参数入栈顺序 参数出栈 主程序 子程序 说 明
参数个数可动态变 化
Windows API常使 用
fastcall方 用ECX、EDX传递第1、2个参数,其余 式 的参数同stdcall,从右至左 this方式 naked方式 ECX等于this,从右至左 从右至左
北京理工大学-张华平-2011
41
3. 子程序声明伪指令PROTO 格式:子程序名 PROTO [C | stdcall] :[第一个参数类型] [,:后 续参数类型] 功能:说明子程序的名字和参数类型,供 主程序调用。在前面的程序中,已经多次 使用这种方式调用C语言的库函数及 Windows的API。
1.调用程序和子程序在同一个代码段的程序结构 CODE SEGMENT MAIN PROC FAR … CALL SUB1 RET MAIN ENDP SUB1 PROC ;类型可缺省 … RET SUB1 ENDP CODE ENDS ;END后跟主程序名 END MAIN
2.调用程序和子程序在不同段的程序结构
2.若调用程序和子程序在同模块中,子程序 可以直接访问模块中的变量 例.实现数组求和功能。要求数组求和 (不考虑溢出情况)由子程序实现,其数组元素 及结果均为字型数据。见程序6.4。
相关文档
最新文档