第4章汇编语言程序设计_第1页
第4章汇编语言程序设计_第2页
第4章汇编语言程序设计_第3页
免费预览已结束,剩余36页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第四章 汇编语言程序设计内容简介:本章着重介绍 8086/8088 汇编语言程序的基本结构、 汇编语言的语法规则和程序设计的基本方法。§ 4.1 程序设计语言概述§4。1。 1 计算机语言分类与特点 用于计算机程序设计的语言分为: 机器语言、 汇编语言与高 级语言三大类。(1)机器语言定义 :指令和数据都用二进制代码表示、计算机能够直接 识别与执行的计算机语言叫机器语言。特点: 机器语言直接面向机器,编写、阅读和交流困难, 通用性差;任何其它语言编写的程序最终都必须翻译成机器 语言,计算机才能理解与执行。(2)汇编语言定义 :将机器语言的指令代码、地址等用指令助记符、符 号

2、地址等来表示所形成的语言叫汇编语言,也叫符号语言 .特点: 面向机器,通用性差; 汇编语言源程序与编译 产生的机器语言程序(目标代码程序)之间存在一一对应关系。 汇编语言程序能直接利用硬件系统的特性 , 能直接对位、字 节、字、寄存器或存储单兀、I/O端口进行操作; 用汇编语 言编写的程序占用内存空间少、执行速度快、实时性好。(3) 高级语言定义:完全独立于机器的通用计算机语言。特点: 编写时不必考虑不同机器的结构特点 ,高级语言程 序的通用性好; 不能在机器上直接执行,须经过编译或翻译才 能运行; 很难利用不同CPU的特点与特性;生成的目标代 码长、占用空间多、执行时间长。§4.1

3、。2汇编语言程序的上机与处理过程§ 4.2汇编语言的程序结构与语法规则§ 4.2。1汇编语言程序的框架结构举例:打印输出字符串“ THIS IS A SAMPLE PROGRAM”STACKSEGMENRARA STACK STACKDB 1024 DUP(O)STACKENDS;DATASEGMENT;的汇编程序。ENDS;定义堆栈段;建立堆栈区 堆栈段定义结束MESSAGEDB THIS IS A SAMPLE PROGRAM.DATA定义数据段CODESTARTLOOP1:LOOP2:STARTCODESEGMENTASSUME CS:CODE, DS:DATA, S

4、S:STACK PROC FARPUSH DS MOV AX,0 PUSH AX MOV MOV LEA CMP JE MOV MOV INT INC JMP RET ENDP ENDS ENDAX,DATADS,AXBX,MESSAGEBYTE PTR BX,$'LOOP2AH,5DL,BX 21H BXLOOP1START一 源程序的结构特点1 源程序由若干逻辑段组成,每个逻辑段都有一个段名 , 由段定 义语句 (SEGMENT/ENDS) 来加以定义;2 在代码段的起始处,用 ASSUME 命令说明各个段寄存器与逻 辑段的关系。 并由用户设置各段寄存器(除代码段 CS 外)的 初

5、值,以建立这些逻辑段的可寻址性。3 每个逻辑段由若干行汇编语句组成,每行只有一条语句且不 能超过 128 个字符 ,但一条语句允许有后续行,最后以回车作 为语句的结束。4 整个源程序必须以 END 语句来结束,它通知汇编程序停止汇 编 .END 后面的标号 START 表示该程序执行时的起始地址 .5 每一条语句最多由 4 个字段组成,各字段之间用空格分开。6 每个源程序在代码段中都必须含有返回到 DOS 操作系统的指 令语句,以保证程序执行完毕后能自动返回到 DOS 状态。二 源程序与 PC DOS 的接口 为了保证程序执行完毕后能自动返回到 DOS 状态,可以采 用以下两种方法。方法一:标

6、准序方法;方法如下:(1)将用户程序的主程序定义为 FAR 过程 ,主程序的最后一条指令为 RET;(2) 在主程序的开始处加入以下三条指令PUSH DSMOV AX,0PUSH AX方法二 :非标准序方法; 方法如下 :(1 )将用户程序的主程序不定义为 FAR过程(PROC FAR;ENDP; RET 三句都不要) ; (2)在代码段结束以前加入以下两条指令MOVAH , 4CHINT 21H§ 4。 2.2 汇编语言的语句语句的定义 :语句是汇编语言源程序的基本组成单位,它规定了 一个基本的操作要求。 而源程序则是完成某个特定 操作任务的一个语句序列。一 语句的种类与格式1 语

7、句的种类 有三种基本语句 :指令语句、伪指令语句和宏指令语句。(1 )指令语句对应于指令系统中的一条指令 ,是可执行语句 .汇编时可以 产生与之一一对应的机器目标代码。如 :MOV DS, AX ; 汇编时产生目标代码: 8EH 与D8H。(2)伪指令语句CPU 不执行的语句 ,只是汇编时给汇编程序提供汇编信息, 如定义符号、 分配存储单元、 将程序分段等。 汇编时不产生目标 代码,也叫“指示性语句” 。如 :SEGMENT/ENDS ;就是伪指令语句, 用来进行段定义。(3)宏指令语句是以某个“宏指令名字” 定义的一段指令序列 .汇编时 ,凡有 宏指令语句的地方都将用相应的指令系列的目标代码

8、插入。2 语句的格式(1)指令语句的一般格式标号: 前缀 指令助记符操作数 ;注释 (2)伪指令语句的格式名字伪指令定义符 操作数 ; 注释 (3)关于标号和名字标号 :是给指令单元起的符号名称,后面必须有冒号(:).标号代表指令所在存储单元的符号地址, 可以作为转移、 循环 等指令的目标地址。名字 :是给伪指令起的符号名称,后面没有冒号.一般用于定义常量、变量、过程、逻辑段等。标号 与名字 的选择必须符合相关规定,详见教材 P144。(4)关于助记符与定义符助记符: 是指令语句的操作码部分的符号表示, 指出指令语句的 操作性质 ,根据需要可以加前缀。定义符: 用于规定伪指令语句的操作功能。

9、助记符 与 定义符 是语句中唯一不可缺省的部分 .(5)关于操作数 指令语句中的操作数是指令的操作对象。 伪指令语句中操作数的格式与含义相对较复杂,无统一规则 .(6)关于注释部分 注释部分用分号(; )开始,用来对语句的功能加以说明,帮助 阅读理解程序 ,没有其他作用。二 语句中的操作数 操作数可以分为 4类:常量操作数、 寄存器操作数、 存储器 操作数与表达式操作数 .1 常量操作数 在汇编时已经确定其值、运行期间不变化的量为“常量” , 用常量作为操作数就是常量操作数 .包括 :( 1)数值常量。如:MOV AL,36H 指令中的36H( 2) 字符串常量女口: MOV AL,A'

10、; 指令中的字符串 A( 3) 符号常量如:MOV AL, XYZ 指令中的符号 XYZ(XYZ 需要预先定义)2 寄存器操作数 用寄存器作为操作数就是寄存器操作数。如: MOV AL, 36H 指令中的 AL 就是寄存器操作数。3 存储器操作数 存储器操作数分为标号与变量两种:(1)标号-是某条指令所存放单元的符号地址,这个地址一定在 代码段内。如:在如下程序段中:LP1 : INC CX 。JMP LP1标号 LP1 是指令 INC CX 所在存储单元的符号地址,在指令 JMP LP1 中作为操作数,属于存储器操作数 .(2)变量 -变量是指存放在存储单元中的值,这些值是可变的。但为了便于

11、对变量的访问 ,变量常常以变量名的形式出现在 程序中 .而变量名可以认为是存放变量的存储单元的符号地址,一般出现在数据段、附加段或堆栈段中如: X DB 0这里:定义了一个字节变量,初值为 0,占据内存中的 一个字节单元。 变量本身是存储单元的内容, 但无法直接表 示它,只好用该单元的地址 X 来表示,这里 X 是变量名 .所以: MOV AL, X 指令中 ,X 属于存储器操作数 .( 3)标号与变量都与存储器地址相关联 ,都具有以下三种属性 : 段属性( SEGMEN)T- 段基址,即标号与变量所在段的 段地址。 偏移量属性( OFFSET)- 即标号与变量所在的单元的偏移 地址 类型属性

12、 (TYPE)- 标号的类型属性 是指标号与使用它 的指令之间的距离远近。即 : 当标号作为转移指令的目标操 作数时,若是段内转移,这个标号的类型属性是“近”(NEAR), 若是段间转移,这个标号的类型属性是“远”( FAR)。变量的类型属性 是指变量存取单元的字节数大小, 类型有字 节(BY TE、字(WORD)双字(DWORD等。4 表达式操作数表达式也可以作为操作数, 它由操作数与操作符 (或叫运算 符、组成 .( 1、表达式的分类数值表达式 在汇编时产生一个数值 , 只有大小而无其 他属性。如:MOV BH 3+5 ;指令中,3+5是一个表达式操作数, 由运算对象(操作数) 3、5 与

13、操作符 +组成。由于 3+5只产生一 个数值 8(在汇编的时候产生) ,因此是数值表达式。 地址表达式 若汇编时,对表达式运算的结果是存储器 地址,那么该表达式就是地址表达式。如: MOV BX , 1000H MOV AL , BX+24H 汇编时,对表达式BX+24H的运算结果是1024H ,这是存 储器的一个偏移地址。因此 BX+24H 就是一个地址表达式操作 数。(2)表达式中的运算符(操作符) 详见教材 P146 的表 4-1 主要有 :算术运算符、逻辑运算符、关系运算符、分析运算 符与合成运算符等几种。算术运算符;有+、-、*、/与M0(求余)等。举例:DA EQU300MOVAX

14、,DA-80; 汇编时,等价于 220;MOVBX,DA MOD 100; 汇编时,等价于 0;MOVCX,DA/100; 汇编时 ,等价于 3; 逻辑运算符 ;有AND OR XOF与 NOT只适用于数值表达式,运算的对象只能是常数,得到的结果也是常数。举例 : MOVAL , NOT80H汇编时,等价于MOV AL ,7FH 关系运算符有EQ (等于)、NE(不等)、LT(小于)、GT (大于)、LE(小于等于)、GE (大于等于)几种。关系运算符的两个操作数必须同 是数值或同是一个段内的两个存储器地址。 比较时, 如果关系不 成立(假),则结果为 0,若关系成立 (真),则结果为全 1。

15、 举例: MOV AX, 10H GT 16 汇编时,相当于: MOV AX , 0; 因为比较结果为假。MOV CX,10H EQ 16汇编时,相当于 :MOV AX , 0FFFFH; 因为比较结果为真。 分析运算符。在下一节讲 合成运算符 .在下一节讲 关于各运算符的优先级见教材 P147表4 2.§ 4.3 汇编语言的伪指令语句80X86/Pentium 宏汇编提供符号定义、 数据定义、 程序分段 定义、 模块定义、 过程与宏定义、 条件汇编和列表控制等伪指令 语句.我们只要求掌握 :8086/8088 系统基本伪指令语句。§ 4。 3。 1 基本伪指令语句一 符号

16、定义伪指令语句 功能 :符号定义伪指令语句主要是给程序中的表达式或数据赋予 一个符号名,以方便程序设计与修改。1等值语句 EQU格式: 符号名 EQU 表达式(或数据)举例 : X1 EQU 312X2 EQU X1+2 COUNT EQU CXLi EQU MOV2等号语句 =格式 : 符号名 = 表达式举例 : XX=60XY=XX+1其功能与 EQU 类似,但 EQU 语句不能对同一符号名重复定义, 而等号语句则可以。二 数据定义伪指令语句功能 :数据定义语句用于定义变量; 指定变量的类型和名称, 并 为变量分配存储单元 .1 格式变量名数据定义符 操作数,操作数,操作数其中: 操作数

17、是赋给变量的初值;变量名 是可选项 ;数据定义符 一般为下列三种伪指令之一 :(1)DB- 定义字节变量,每个变量占一个字节的存储单元。(2)DW-定义字变量,每个变量占二个字节的存储单元。数据的低位部分在低地址,高位部分在高地址.(3)DD 定义双字变量,每个变量占四个字节的存储单元。数据的低位部分在低地址,高位部分在高地址。经过定义的变量名有三个属性,即:类型属性、段属性(段地址)与偏移量属性(偏移地址),相关概念在上节已讲到。若变量表达的是一个数组,则其类型属性为数组的单个元素的类型属性.2举例举例1:最普通的变量定义形式X DB25H;定义变量X为字节变量,初值为 25H.Y DW 4

18、142H;定义变量 Y为字变量,初值为4142H。Z DD 12345678H ;定义变量Z为双字变量,初值为;123456H.它们在内存中的存放方式如下:举例2:定义变量,但不赋予具体的初值A DB ?B DW ?举例3:数组的定义XX ,XX DB 1, 2 , 4,56H , 68H;定义一个字节数组共有;5个元素存放方式如下YY DW 1122H, 3344H;定义一个字数组 YY,共有;2个元素存放方式如下:举例4:重复单元的表达XY DB 0,0,0, 0,0,0 ;可以写成XY DB6 DUP(0)其中:DUP为重复数据定义操作符.F列数据定义:的存放方式见下图XY1 DB 5

19、DUP (12H,34H)12H34H12H34H12H34H12H>34H12H34H举例5:字符串的定义 一般用DB来定义字符串,实际存放时,每一个字符用其ASCII来表示。STRING1DB BCD '存放方式如下:41H 为 A 的 ASCII 码;44H 为 D 的 ASCII 码。但当一个字符串的长度不超过两个字符时,也可用义.DW来定STRING2DW AB ', CD'存放方式如下:请注意:上述数据定义 伪指令语句定义了两个 字符串,每个字符串的 长度不超过两个字符.3分析运算符与合成运算符的使用(1)分析运算符(数值返回运算符)分析运算符(操作符

20、)用于存储器操作数,返回它们的属性值。这些操作符是:SEG、OFFSET、TYPE、SIZE、LENGTH。格式:分析操作符标号或变量 SEG禾口 OFFSET操作符 SEG操作符返回标号或变量的段地址。 OFFSET操作符返回标号或变量的偏移地址。 TYPE、SIZE 禾口 LENGTH 操作符 TYPE操作符返回标号或变量的类型属性,是一个数值; 对变量而言:字节变量,类型值为1;字变量,类型值为 双字变量,类型值为 4。(实质也就是每个变量所占用的字节存储单元的个数) 。对标号而言:返回的是NEAR ( 1)或FAR (-2)类型值举例 : 若已定义 X1 DB 25H 则指令:MOV

21、AL ,TYPE X1 汇编时 TYPE X1 的返回值为 1 LENGTH 操作符返回变量 用 DUP 重复定义的 数据项总 数。如果存储区不是用 DUP 来定义,则返回 1 。举例 : 若已定义Y1 DB100 DUP ( 0)Y2 DW 100 DUP(68H)Y3 DD 200 DUP (11H)Y4 DB 23H , 0, 45H, 66H则表达式: LENGTH Y1 =100LENGTH Y2 =100LENGTH Y3 =200LENGTH Y4 =? SIZE 操作符返回 TYPE 和 LENGTH 的乘积,其物理意 义是为变量所分配的字节存储单元总数 .举例: 变量 Y1

22、、Y2、Y3、Y4 的定义见上例。则: SIZE Y1 =1 100=100SIZE Y2 =2 100=200SIZE Y3 =4200=800( 2)合成运算符(修改属性运算符 ) 合成运算符用于临时修改存储器操作数的某些属性,以满足不同的访问要求 .常用的有: PTR 、 LABEL 和 THIS 三个。 PTR 操作符PTR用来临时修改存储器操作数的类型属性,但保留原来的段属性与偏移地址属性不变。格式: 临时指定的类型 PTR 标号或变量举例: 已定义 :Y4 DB 23H, 0, 45H, 66H 很显然,指令 MOV BX, Y4 由于类型不对是一条错误指令。 但指令 : MOV

23、BX , WORD PTR Y4 就是对的。 其实质是: MOV BX, 0023H注意:字节变量Y4修改成字变量只在该指令中临时有效,不改变它在其他地方使用的性质。 LABEL 操作符LABEL 操作符为当前存储单元定义一个指定类型的标号或 变量 , 使它们具有多重属性和名字 .格式: 标号或变量名 LABEL 新类型举例 : Z2 LABEL WORDZ1 DB 12H,33H,25H,89H上述定义中,数据块12H, 33H ,25H,89H具有双重属性,一是变量Z1命名的字节属性,二是Z2命名的字属性 见下图:所以:MOV AL,Z1执行的结果是AL=12HMOV AX Z2执行的结果

24、是:AX=3312H而指令 MOV AL, Z2 或MOV AX, Z1都是错误的 THIS操作符THIS操作符与EQI配合使用,与LABEL操作符具有同样效果。 格式:标号或变量名 EQU THIS 新类型三程序分段伪指令语句1段定义伪指令 SEGMENT/ENDS段定义伪指令 SEGMENT/ENDS 用来将程序分成若干逻辑段。格式:段名 SEGMENT 定位类型组合类型'类别名(段体)段名 ENDS功能:指出段名及段的各种属性,并表示段的开始与结束位置 . 段名是用户定义段的名称,用来表示段在内存中的起始位置,具有段地址与偏移地址两个属性。定位类型用来告诉LINK (链接)程序,

25、本段首地址的边界定 位方式默认为PAR(节),即段的起始地址必须为 16的倍数.一 般采用默认方式 .组合类型用来告诉LINK (链接)程序,多个模块链接时,本 段与其它模块的同名段的组合链接关系 默认为NONE表明本段 与其它同名段无组合关系 . 一般情况下:数据段、附加段及代码段采用 NONEA合类型.堆栈段一般采用STACK!合类型,这样可以使SS与SP在链接时 自动赋值。另外,还有一种组合类型是:AT 表达式 : 表示本段装在表达式的值所定位的段地址上。 类别名 表示该段的类别,链接时,同名同类别的段在内存中依顺序连续存放 . 一般情况下 :数据段、附加段及代码段缺省 堆栈段一般采用

26、STACK类别名2 段寄存器说明伪指令 ASSUME格式:ASSUME段寄存器名:段名:,段寄存器名:段名ASSUMED指令一般出现在代码段 SEGMEN伪指令的后面, 用来说明各个段寄存器与逻辑段的关系举例:DATASEGMENTXDB ?DATAENDSEXTRASEGMENTYB ?EXTRAENDSSTACK SEGMENT STACK STACK 'ZDB 100 DUP(0)STACKENDSCODESEGMENTASSUME CS: CODE , ES:EXTRA , DS: DATA , SS:STACK上述的 ASSUME®句就说明了 CODE EXTRA

27、DATA与 STACK 各是什么段。3 组定义伪指令 GROUP 用于将程序中的几个不同名的段集中成一个组,并赋予一个组 名,使它们都装在一个 64K 的物理段中。格式:组名 GROUP 段名,段名举例 : BIGDSGROUP DATA1, DATA2DATA1SEGMENTXXDB 12H, 23HDATA1ENDSDATA2SEGMENTYYDW 0DATA2ENDSCODESEGMENTASSUME CS:CODE , DS:BIGDS这个伪指令用得比较少。4 指定地址伪指令ORGORG 伪指令用来强行指定地址计数器的当前值,以改变段 内在该伪指令以后的代码或数据存放的偏移地址。格式

28、1: ORG 表达式格式 2: ORG + 表达式格式 1 直接将表达式的值作为当前地址计数器的值;格式 2 将当前地址计数器的值加上表达式后送入地址计数器。举例 :DATASEGMENTORG10HXDB20H, 30H ;在数据段中, 偏移地址为;10H 处开始存放 20H, 30HORG +5YDB40H, 50H; 在存放了 20H 与 30H 后,当前地址计数器变的值为 12H,遇到伪指令ORG $+5后,当前地址计数器变为17H,因此,在数据段的偏移地址为 17H 处开始存放 40H、50H.四 模块定义与通信 ( 不作要求)五 过程与宏定义伪指令语句1 过程定义伪指令定义 :所谓

29、过程是一段可由其他程序用 CALL 指令调用的程序, 执行完后用 RET 指令从过程返回原调用处。如果整个源程序由主程序和若干子程序组成, 则主程序与每 一个子程序都可以作为一个过程,且都应包含在代码段中。 过程定义格式 :过程名 PROC NEAR /FAR过程体RET过程名 ENDP说明: 过程的属性有 NEAR与FAR两种。当属性是NEAR (近过程)时,该过程只能被段内的其他程序调用;缺省时 ,属性是 NEAR.当属性是FAR (远过程)时,该过程可以被任何段中的其他程序调用 . 一个过程可以有多个RET指令,但至少要执行到一个 RET指 令。举例:CODE SEGMENTASSUME

30、START PROC FARPUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXCALL SUBPROGRET乂 START ENDP厂 SUBPRObROC NEAR ADD AX, BXRETSUBPROGENDPJCODE ENDSEND START2宏定义伪指令背景知识:若源程序中要经常用到某一程序段,一个方法是可以将该程序段定义成一个子程序(过程),要用时可以用CALL指令 进行调用但缺点是:过程的进入与返回都要占用一定时间。另一个方法是 将该程序段定义成一条宏指令, 源程序中要用到该程 序段时,只要插入该宏指令就行了 .(1)宏的定义、调用与扩展宏定

31、义格式:宏指令名MACRO形参,形参宏体ENDM宏调用格式:宏指令名实参,实参说明:宏指令名必须是唯的;宏指令一经定义,就像指令系统中增加了一条新指令一样在程序中可以像使用普通的指令一样使用宏指令;宏指令必须先定义后调用;形参为可选项。举例1:不带参数的宏指令;将AL中的内容算术左移4位,就可定义一条宏指令来实现 其功能。SHIFTMACRO;宏指令的定义MOV CL, 4宏体SAL AL, CL -ENDMSHIFT;宏指令的调用当汇编到SHIFT这条宏指令时,就将对应的宏体插入到源程序中宏指令所在的位置,来代替这条宏指令以产生目标代码,这就是宏扩展。举例2:带参数的宏指令;上述例题中的宏有

32、两个限制,一是只能对 AL的内容实现左 移,二是必须移动4位,如果希望每次能用不同的寄存器移动不 同的次数,则可以使用带参数的宏指令。SHIFTMACROX, Y;带参数的宏指令的定义MOVCL, X*宏体SALY, CL-ENDMSHIFT 4, AL;宏指令的调用(2) 取消宏指令伪指令 PURGE可以用PURGE伪指令来注销已经定义的宏指令。格式:PURGE 宏定义名3 过程与宏的区别(1)宏指令语句由宏汇编程序识别,在程序汇编时完成扩展, 到目标代码时就没有宏指令的概念了。而过程的调用是在程序执行时完成的 . (2)宏指令操作可以实现参数的直接传递与接收,而过程调用 时无法直接带有参数

33、 ,只能通过堆栈、寄存器等间接传递。(3)宏指令的使用只能简化源程序的编写, 缩短源程序的长度, 并没有缩短目标代码的长度。而过程可以缩短源程序与目标代码的长度,有效节省内存空间。(4)引入宏指令并不会增加执行程序时的额外时间开销。但过 程的调用中过程的进入、返回及堆栈保护等会增加额外时间开 销。六 列表伪指令语句(不作要求)七 条件汇编伪指令语句(不作要求)80X86/Pentium 扩展伪指令语句 (不作要求 )4.4 汇编语言程序设计基础§4。4。 1 程序设计的基本过程见教材 P165§ 4。 4.2 程序的基本结构一 顺序结构二 分支结构三 循环结构§4

34、。4.3 程序设计举例一 顺序结构的程序设计举例在内存中自 TABLE 开始的 16个单元连续存放着 0到 15的 平方值(平方表),任给一个数X (ow X 15)在XX单元,查 表求 X 的平方值,并把结果放在 YY 单元。规律:表的起始地址与数 X的和便是X的平方值所在单元的 地址。源程序如下:DATA SEGMENTTABLE DB o, 1 ,4,9, 1 6 , 25,36,49,64, 81, 1oo,121, 144, 196, 225XXDB?YYDB?DATAENDSSTACKSEGMENT PARA STACKSTACK 'DB100 DUP(? )STACKEN

35、DSCODESEGMENTASSUME CS :CODE ,DS:DATA , SS:STARTPROCFARPUSHDSMOVEAX,0PUSHAXMOVAX , DATAMOVDS, AXMOVBX, OFFSET TABLEMOVAH , 0MOVAL, XXADDBX,AXMOVAL, BX ;或直接用查表指令:MOVYY, ALSTACKXLATRETSTART ENDPCODE ENDSEND STARTX(-128 < XW二分支结构的程序设计举例变量X的符号函数可用下式表示,要求根据127)的值求Y的值,编写相关程序。< 1 当 X > 0Y =1 0 当 X

36、 = 0i-1 当 X < 0源程序如下:DATASEGMENTXXDB ?;定义字节单兀来存放自变量 XYYDB ?;存放YDATAENDSSTACKSEGMENTPARA STACK STACK 'DB 100 DUP (?)STACK ENDSCODE SEGMENTASSUME CS:CODE , DS:DATA, SS:STACKSTART PROC FARPUSH DSMOVE AX,0PUSH AXMOVE AX, DATAMOVE DS, AXMOV AL , XXCMP AL, 0JGE BIGGERMOV AL , 1JMP EQULBIGER : JE EQ

37、ULMOVAL , 1EQUL :MOVYY,ALRETSTARTENDPCODEENDSENDSTART三 循环结构的程序设计举例 寄存器 AX 中有一个 16 位二进制数,编程统计其中 1 的个 数,结果存放在 CX 寄存器中。编程思路 :( 1)先判断后执行,如果 AX 中的数全为 0, 则不必再做统计工作; (2)若要统计, 则方法可以采用移位判断的方法,将每一位逐个移到 CF 了就不再统计了 .源程序如下:CODE SEGMENTASSUME CS:CODE中,再进行判断,当 AX 为全 0STARTPROCFARPUSHDSMOVEAX,0PUSHAXMOVEAX , DATAMO

38、VEDS, AXMOVCX,0LP:ANDAX , AXJZEXIT;结果计数器先清零; 判断 AX 是否为全 0SALJNCINCAX , 1ZEROCX;CF=0 ,则转到 ZERO 继续循环;CF=1 , 则 CX 加 1ZERO :JMPLPEXIT :RETSTARTENDPCODEENDSENDSTART§子程序设计与调用技术一 有关子程序的基本概念与术语 需要使用子程序的情况:(1)多次重复使用的程序段可以定义为子程序 .(2)具有通用性、便于共享的程序段可以定义为子程序。(3)中断处理程序必须作为子程序 .二 子程序设计中的问题1 主程序与子程序的连接主程序与子程序的连接由 CALL 与 RET 指令来完成。2 现场的保护与恢复 通过堆栈加以保护。例如 :SUBPRO PROCPUSH AXPUDH BXPOP BXPOP AXRETSUBPRO ENDP3 主程序与子程序间的参数传递(1) 通过寄存器传递;但由于寄存器数量较少,只适合于需要 传递的参数较少的情况。(2) 存储单元传递; 通过指定的存储变量来

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论