汇编语言程序设计-分支结构
(SP)→ (IP)
call far ptr subp序返回:ret
(SP)→ (IP) (CS)
6.1 子程序的设计方法
3.保存与恢复寄存器
一般通过堆栈来实现, 主要在子程序中进行,
subt proc far push ax push bx
例如,子程序subt中 用到了寄存器ax,bx, cx和dx,则可能的保 存与恢复寄存器如左:
表地址=编号*2+入口地址首地址。 根据条件首先在地址表中找到转移的目标地址,然 后转到相应位置,从而实现多分支。
5.2 分支程序设计
例:用地址表法编写程序实现从低到高逐位检测 一个字节数据,找到第一个非0的位数。检测时, 为0,则继续检测;为1,则转移到对应的处理程 序段显示相应的位数。
DATA SEGMENT
5.2 分支程序设计
1.双分支结构
典型的双分支结构程序的流程图:
条件成立跳转执行第2个分 支语句体,否则顺序执行第 1个分支语句体。注意第1 个分支体后一定要有一个 JMP指令跳到第2个分支体 后
5.2 分支程序设计
条件成立跳转,否则顺 序执行分支语句体; 注意选择正确的条件 转移指令和转移目标 地址
push cx push dx …… pop dx pop cx pop bx
pop ax
ret
subt endp
6.1 子程序的设计方法
4.子程序的参数传送
入口参数(输入参数): 主程序提供给子程序
出口参数(输出参数): 子程序返回给主程序
参数的形式:
① 数据本身(传值) ② 数据的地址(传址)
CODE ENDS
END START
第6章 子程序结构
把功能相对独立的程序段单独编写和调试, 作为一个相对独立的模块供程序使用,就 形成子程序
子程序可以实现源程序的模块化,可简化 源程序结构,可以提高编程效率
6.1 子程序的设计方法
6.1 子程序的设计方法 1.过程定义伪操作
过程名 PROC [NEAR|FAR] ...
Y
dec ah ;等效于cmp ah,2
N
jz function2 ;ah=2,转向funAcHt=io2n2 Y
function0 function1 function2
N
5.2 分支程序设计
地址表形成多分支
利用地址表法实现多分支程序设计的一般方法为: 把各分支程序段的入口地址(一般是偏移地址,也 可以使段地址与偏移地址)依次存放在数据段的一 个表中,形成地址表。取各分支程序段的编号作为 给分支入口地址的表地址的位移量。 某个分支程序入口地址的表地址为:
过程名 ENDP
过程名(子程序名)为符合语法的标识符
NEAR属性(段内近调用)的过程只能被相同代码段的 其他程序调用,主程序和子程序在同一代码段
FAR属性(段间远调用)的过程可以被相同或不同代码 段的程序调用,主程序和子程序不在同一代码段
code segment
main main
proc …… call …… ret endp
AD6:MOV DL,’6’
NEXT:SHL BX,1
JMP DISP
JMP ADTAB[BX]
AD7:MOV DL,’7’
AD0:MOV DL,’0’
DISP:MOV AH,2;显示
JMP DISP
INT 21H
AD1:MOV DL,’1’
MOV AH,4CH ;返回DOS
JMP DISP
INT 21H
NUM DB 78H ADTAB DW AD0,AD1,AD2,AD3,AD4,AD5,AD6,AD7;地址
表
DATA ENDS
CODE SEGMENT ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
5.2 分支程序设计
MOV AL,NUM
AD2:MOV DL,’2’;第2位为1,
程舒慧
2011.9.19
汇编语言
程舒慧
2011.11.15
5.2 分支程序设计
分支结构是对问题的处理方法有两种以上 不同选择时采用的程序设计方法,在程序 中,根据某一判断的不同结果执行不同的 程序段。
根据执行的程序段数量的多少不同,可分 为双分支结构程序和多分支结构程序。
每一次对条件的判断都会产生两种可能的 结果:真(条件满足)或假(条件不满 足)。
(4)入口参数:说明子程序执行应具备的条件。 (5)输出参数:说明子程序执行后的结果存放在何处。 (6)子程序调用示例:说明子程序的调用格式。
6.1 子程序的设计方法
2. 子程序的调用与返回
3. 子程序调用:隐含使用堆栈保存返回地址
4.
call near ptr subp
(1) 保存返回地址
(2) 转子程序
MOV DL,’?’
JMP DISP
CMP AL,0
AD3:MOV DL,’3’
JZ DISP
JMP DISP
MOV BX,0;BX用来记录位1的位数 AD4:MOV DL,’4’
AGAIN:SHR AL,1
JMP DISP
JC NEXT
AD5:MOV DL,’5’
INC BX
JMP DISP
JMP AGAIN
传递的方法:
① 寄存器 ② 变量 ③ 堆栈
6.1 子程序的设计方法
(1)通过寄存器传送参数 最常用的一种方式,但能传递的参数有限, 适合于参数较少的情况。
需要注意:用于传递出口参数的寄存器不 能进行现场保护和恢复。
6.1 子程序的设计方法
6.1 子程序的设计方法
6.1 子程序的设计方法
far subr1
subr1 proc …… ret
subr1 endp
near
code ends
segx
subt
subt call
segx
segment
proc far …… ret endp …… subt ……
ends
segy
call
segy
segment
…… far ptr subt ……
ends
6.1 子程序的设计方法
子程序调用方法说明
一个子程序可以供多个用户编写的主程序调用。在不了解 子程序内部算法的前提下能够很好地使用子程序也是子程 序应具备的特性。
一个完整的子程序,应包括子程序调用方法说明。主要包 括以下6个方面内容。 (1)子程序名:供调用子程序时使用 (2)子程序功能:供选择子程序时参考 (3)占用寄存器:说明子程序执行时,要使用哪些寄存器; 子程序执行完后,哪些寄存器的内容被改变,哪些寄存器 的内容保持不变。
5.2 分支程序设计
2.多分支程序设计
多个条件对应各自的分支语句体,哪个条件成立
就转入相应分支体执行。多分支可以化解为双分
支或单分支结构的组合,例如:
Xor ah,ah ;等效于cmp ah,0
AH=0 Y
jz function0 ;ah=0,转向functiNon0
dec ah ;等效于cmp ah,1 jz function1 ;ah=1,转向funAcHt=io1n1
合集下载
实验二 分支结构程序设计实验
实验二 分支结构程序设计实验1、实验目的和要求:掌握汇编语言分支程序的设计方法;2、实验内容:编程序求分段函数Y 的值。
已知变量X 为16位带符号数, 分段函数的值要求 保存到字单元Y 中。
函数定义如下:1 (当X>0)Y = 0 (当x=0)—1 (当X<0)3、实验仪器与器材:计算机及EMU8086汇编软件等。
4、实验原理:分支结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的分支语句。
分支结构适合于带有逻辑或关系比较等条件判断的计算,设计这类程序时往往都要先绘制其程序流程图,然后根据程序流程写出源程序,这样做把程序设计分析与语言分开,使得问题简单化,易于理解。
程序流程图是根据解题分析所绘制的程序执行流程图。
5、实验过程与测试数据(含电路图/程序流程框图):6、实验分析:自己分析7、实验体会:自己总结实验参考程序:DATA SEGMENTX DW -128Y DW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA START: MOV AX,DATAMOV DS,AXMOV AX,XCMP AX,0JG ISPNJZ ISZNMOV Y,-1JMP FINISHISPN: MOV Y,1JMP FINISHISZN: MOV Y,0FINISH: MOV AH,4CHINT 21HCODE ENDSEND START思考题:把程序修改成如下的分段函数的值—1 (当X>=0)Y=1 (当X<0)。
汇编语言分支结构程序设计技巧
《 编语 言程 序 设 计 》 高 等 院 校计 算 机 专 业 教 学 体 系 中的 汇 是 门重 要 的专 业 基 础 课 程 r1 汇编 语 言是 能 够 充 分 发 挥计 算 机 1。 所 有硬 件 特 性 并 能 直 接 控 制 硬 件 的 最 快 、 有 效 的语 言 。 和 计 最 它 算 机 的 硬 件 系 统 紧 密 联 系 .本 文 主 要 讨 论 8 8/0 8的 汇 编 语 0 68 8 言 。汇 编 语 言 是 结 构 化 的 『1结 构 化 编程 技 术 简 化 了程 序 实 现 , 2,
一
指 令 的通 用格 式是 : 件 标 号 , 件 转 移 指 令 的 功 能 是 : 果 J条 条 如 条 件 成 立 , 转 到 标 号 所 标 明 的指 令 去 执 行 ; 果 条 件 不 成 立 , 则 如 则顺序执行。 由此 可 以得 到 , 号 处 是 ” ” 标 Y 分支 , 紧跟 条件 转 移 指
这 里我 们 以这 样 的一 个 例 子 为 例 进 行 介 绍 : 已定 义 了 两个 整 数 变 量 A和 B. 编 写程 序完 成 以下 功 能 : 试 1 若 两 个 数 中 有 一 个 是 奇 数 , 将 奇 数 存 入 A 中 , 数 存 ) 则 偶
入 B中。
2 若 两个 数 均 为 奇 数 . 将 两 数 均 加 l 存 回原 变量 。 ) 则 后 3 若 两个 数 均为 偶 数 . 两 个 变 量 均 不 变 。 ) 则 首先 , 我们 对 题 意 进 行 分 析 。变 量 A 和 B的 奇偶 情 况 有 四
要 是 用条 件 转 移 指 令 来 实现 的 , 文 结 合 汇 编 语 言 中条 件 转 移 指 令 的特 点及 作 者 多年 的 教 学 经验 提 出 了设 计 分 支结 构程 序 本
汇编语言程序设计方法
C 名字前加 下划线
从右到左 调用程序
是
SYSCALL
从右到左 被调用程序
是
STDCALL 名字前加
下划线 (注)
被调用程序
是
PASCAL 名字变大写
BASIC 名字大写
FORTRAN 名字大写
从左到右 被调用程序
是
从左到右 被调用程序
是
从左到右 被调用程序
是
12
PROTO是过程声明伪指令,用于事先声明过程的结构。它的格 式如下:
结束处理部分
AGAIN: ADD AX,CX
;从20,19,……2,1倒序累加到AX
LOOP AGAIN ;每循环一遍,CX自动减1
MOV SUM,AX ;将累加和送入SUM单元
.EXIT 0
END
初始化部分
循环结束? 是 否
工作部分 修改部分 结束处理部分
7
二、用MASM 6.x循环控制伪指令实现循环结构
.CODE
.STARTUP
MOV AL, B
IMUL AL
MOV BX,AX MOV AL,A
;BX中为B的平方
IMUL C
MOV CX,4
IMUL CX
;AX中为4AC
.IF SWORD PTR BX>=AX ;比较B的平方和4AC的大小
MOV SIGN,1
;条件成立,SIGN得到1
.ELSE
MOV SIGN,0
.IF 条件表达式 ;条件为真(非0),执行分支体
分支体
[.ELSEIF 条件表达式
分支体
;前面IF条件为假,并且当前ELSEIF条件为真执行分支体
[.ELSE
;前面IF条件为假执行分支体
第四章汇编语言程序设计基础.
bx, 2 loop2 cx, di loop1
8
4.2
分支程序设计
判定条件
判定条件
A
B
A
B
…
X
(1)两路分支结构
(2)多路分支结构
9
(1)逻辑尺控制
。。。。。。
(2)条件控制
?
case 1 case 2
case n
?
case 1
case 2
case 3
(3)地址跳跃表 TABLE
1000 2000 3000
12
例2. 根据AL寄存器中哪一位为1(从低位到高位)把程序 转移到8个不同的程序分支去 。(寄存器间接寻址)
branch_table dw routine1 cmp je lea shr jnc jmp
移
dw routine2
dw routine3 dw routine4 dw routine5 dw routine6 dw routine7 dw routine8 L:
例3 将首地址为A的字数组从小到大排序(气泡算法,多重循环) A dw 32,85,16,15, 8
比
序号 地址 数
较
遍
数
1 32 16 15 8 85
2 16 15 8 32 85
3 15 8 16 32 85
4 8 15 16 32 85
7
1 2 3 4 5
A A+2 A+4 A+6 A+8
32 85 16 15 8
procedure_name PROC …… procedure_name ENDP NEAR ( FAR )
(1)NEAR属性:调用程序和子程序在同一代码段中 (段内调用) (2)FAR属性:调用程序和子程序不在同一代码段中 (段间调用)
第五章 分支程序设计.
2018/11/5
河南师范大学计算机与信息技术学院
4
汇编语言程序设计——方法、技术、应用
5.2
格式:JMP label 执行的操作:
无条件转移指令
程序转向label标号指定的地址。 只要执行无条件转移指令JMP,就使程序转到指定的目标地址处, 从目标地址处开始执行那里的指令。
操作数label是要转移到的目标地址(目的地址、转移地址)。 JMP指令不影响标志位。
11
汇编语言程序设计——方法、技术、应用
(3)
JMP JMP
段内直接近转移指令形式
;(IP)←(r16/m16) ;(EIP)←(r32/m32)
r16/m16 r32/m32
将一个16/32位寄存器或主存字/双字单元内容送入IP/EIP寄存器, 作为新的指令指针,但不修改CS寄存器的内容。 jmp ax jmp word ptr [2000h] ;IP←AX ;IP←[2000h]
2018/11/5
河南师范大学计算机与信息技术学院
12
汇编语言程序设计——方法、技术、应用
(4)
执行的操作:
段间直接远转移
格式:JMP FAR PTR OPR
(IP)←OPR的段内偏移地址 (CS)←OPR所在段的段地址
386及其后继机型则为: (EIP)←OPR的段内偏移地址 (CS)←OPR所在段的段地址 如操作数长度为16位,则还需: (EIP)←(EIP) AND 0000FFFFH 这里使用的是直接寻址方式。在汇编格式中OPR可使用符号地址。
2018/11/5
河南师范大学计算机与信息技术学院
13
汇编语言程序设计——方法、技术、应用
(4)
JMP
汇编语言程序设计的基本方法
01
例2 编写程序,计算(W-(X*Y+Z-100))/W,其中W、X、Y、Z均为16位带符号数,计算结果的商存入AX,余数存入DX。
02
例3 把非压缩十进制数DAT1转换为压缩十进制数
例2编写程序,计算(W-(X*Y+Z-100))/W,其中W、X、Y、Z均为16位带符号数,计算结果的商存入AX,余数存入DX。
通常,编制一个汇编语言源程序应按如下步骤进行:
1
明确任务,确定算法。
2
绘制流程图(包括确定内存单元和分配寄存器)。
3
根据流程图编写汇编语言程序。
4
上机调试程序。
5
程序的基本结构有四种:顺序结构、分支结构、循环结构和子程序结构。
6
5.6 汇编语言程序设计的基本方法
5.6.1 顺序程序设计
顺序结构也称线性结构,其特点是其中的语句或结构被连续执行。 顺序程序是最简单的,也是最基本的一种程序结构。这种结构的程序从开始到结尾一直是顺序执行的,中途没有任何分支。从这种结构的流程图来看,除了有一个起始框,一个终止框外,就是若干执行框,没有判断框。指令指针IP值线形增加,IP=IP+1
条件
N
…
例4用比较指令和条件转移指令实现两路分支的程序段。
两路分支程序设计
例4用比较指令和条件转移指令实现两路分支的程序段。 … MOV AX,M ;假定M和N为有符号数 MOV BX,N CMP AX,BX ;比较 M和N的大小,影响标志位,准备条件 JG NEXT ;M>N时转移,注意若M、N为无符号数时用JA指令 …… ;分支程序2 JMP DONE NEXT: …… ;分支程序1 …… DONE:RET
X+20 (X≥0)
第六章 汇编语言程序设计
AA:
SUB MOV MOV HLT
BX,AX DI, 2800H [DI],BX
16
改: CLC CMP JC SUB MOV MOV HLT AA: SUB MOV MOV HLT BX,AX DI, 2800H [DI],BX
17
AX,BX AA AX,BX DI, 2800H [DI],AX
CMP JZ CMP JZ MOV JMP NEXT: DONE: MOV HLT AL, 'y ' ;比较AL与小写字母y NEXT ;相等,转移到NEXT AL, 'Y ' ;不是小写字母y,是大写字母Y ? NEXT AH,-1 ;相等,转移NEXT ;不是大Y ,令AH=-1 Y AH 1
DONE ;无条件转移DONE AH,0 ;是Y或Y,令AH=0
AL,BL , AL,0 , STOR AL,80H , MINUS AL, 1 , STOR AL,0FFH , BH,AL ,
;取X ;X=0,Y=X , ;X<0 < ;X>0,Y=+1 > , X<0,Y= -1 < , ;保存Y 保存
MINUS: : STOR: :
MOV MOV HLT
例4,判断是否为字母 .若AL中是字母Y(含大小写),则令AH ,判断是否为字母Y. =0,否则令AH=-1
为奇数, ;否则AX为奇数,加1 否则 为奇数 ;AX←AX÷2 ÷
12
法2:将最低位用移位指令移至进位标志,判断进位标志 :将最低位用移位指令移至进位标志, 就是偶数; 是0,AX就是偶数;否则,为奇数 , 就是偶数 否则,
MOV SHR JNC ADD E1: SHR
汇编程序设计第4章王爽版分支
第二种方法
第一种方法
mov dl,’0’ shl bx,1 jnc two mov dl,’1’ mov ah,2 int 21h
提示:条件转移指令的使用很关键,要根据不同的情况正确的选用
1
2
3
4
5
6
2、双分支程序设计
3、多分支结构
多个条件对应各自的分支语句体,哪个条件成立就转入相应分支体执行。多分支可以化解为双分支或单分支结构的组合
1.判断单个标志位状态
这组指令单独判断5个状态标志之一 ⑴JZ/JE和JNZ/JNE:利用零标志ZF,判断结果是否为零(或相等)。 JZ/JE表示结果为零(或相等),则转移。 ⑵JS和JNS:利用符号标志SF,判断结果是正是负, JS表示结果为负则转移。 ⑶JO和JNO:利用溢出标志OF,判断结果是否产生溢出, JO表示溢出则转移。 ⑷JP/JPE和JNP/JPO:利用奇偶标志PF,判断结果中“1”的个数是偶是奇。JP表示偶个数个1 ⑸JC和JNC:利用进位标志CF,判断结果是否进位或借位。进位或借位为1则转移。
比较有符号数大小
两数的大小分成4种关系: ⑴大于(不小于等于): JG ( JNLE ) ⑵大于等于(不小于): JGE (JNL) ⑶小于(不大于等于):JL(JNGE) ⑷小于等于(不大于):JLE(JNG)
Jcc
例:比较有符号数
比较有符号数大小,将较大的数存放在AX寄存器。 cmp ax,bx ;比较ax和bx jge next ;若ax≥bx,转移 xchg ax,bx ;若ax<bx,交换 next: ...
JMP
直接 转移地址象立即数一样,直接出现在指令中 间接 转移地址在寄存器或主存单元中
用标号表达
用寄存器或存储器操作数表达
汇编语言程序设计
…… 跳转到出口处end
……
casen:
跳转到出口处end ……
(执行条件n成立的语句)
end 分支结束出口
图9.13 汇编语言多重分支方第式14页
2021/12/8
下面我们用相应的例子来详细的说明这两种分支结构。
例 阶跃函数
说明:这是一个典型的双分支结构,输入值大于等于0时则返回1,输入值小于0时返 回0。r1>=0?r1=0r1=1退出图9.14 阶跃函数流程图NY
//与0比较 //大于等于0则跳转到非负数处理 //小于0则返回0 //跳转到程序结束处
//大于0,则返回1
第16页
2021/12/8
3、循环程序设计
(1) 循环程序的结构形式
循环程序可以有两种结构形式,一种是WHILE_DO结构 形式;另一种是DO_UNTIL结构形式。如图9.16所示.
初始化
初始化
入口参数:R1;(有符号数) 出口参数:R1
流程图如图9.14所示。
N
Y
R1>=0 ?
r1=0
r1=1
退出
图9.14 阶跃函数流程图
第15页
2021/12/8
程序的代码如下: .PUBLIC F_Step; .CODE F_Step: .proc CMP R1,0; JGE ?negtive; R1 = 0; JMP ?Step_end; ?negtive: R1 = 1; ?Step_end: RETF; .ENDP
1.4 嵌套与递归
1、 子程序的嵌套
子程序嵌套就是指子程序调用子程序。其中嵌套的层数称为嵌套深度。图9.27表
示了三重嵌套的过程。
SUB1
主 程 序
汇编-循环与分支程序设计
方法A
MOV DL,0DH MOV AH,06H INT 21H MOV DL,0AH MOV AH,06H INT 21H
方法B
MOV DL,0AH MOV AH,06H INT 21H MOV DL,0DH MOV AH,06H INT 21H
记住以下ASCII值
退格:08H(即8) 空格:20H(即32) 换行:0AH(即10) 回车:0DH(即13) 0 :30H(即48) a :61H(即97) A :41H(即65)
程序流程图
开始
DX=A
DX=A+B BX=DX DX左移3位 BX左移1位
DX=BX+DX-500
结束
编写程序
DATA BUFA BUFB RESULT
SEGMENT DW ? DW ? DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: CODE
➢ 循环控制部分:判断循环条件满足与否,常用方法:计数控制、特 征值控制、地址边界控制等。
➢ 常用指令
[1].LOOP,LOOPZ/LOOPE,LOOPNZ/LOOPNE;
[2].各种跳转指令;
特别要注意循环入口和循环次数的正确设置、地址指针及循环控
制条件的修改等。否则会得不到期望的结果。
➢ 多重循环程序设计循环嵌套
INT 21H
不回显在屏幕上
2.键盘一次输入一个字符串的方法:
串地➢址例存如入(,DS在:D数X)据、调区用定参义数的为字10送符A缓H冲区如下:
MOV MOV MOV MOV MOV
DABADDAXuHSX,f,,,TfASAO0eEXfArGf,Hsc/eSASBo/tBEuu设TCufnGRf置BftTMfueILeNIr/frENE/fGT/设e/NN/r/置BTB/2uu/1存ffBHDffDuD功入eefBBBrrf能字是的er参符存段的33?数串放地偏22 为的输址移D0最入U存地APH大字入址(长符D存S?度串入)并的DX存缓入冲B区uffer的首字节;
