微机原理第五章 程序设计-dsh

合集下载

微机原理与汇编语言第5章汇编语言程序设计

微机原理与汇编语言第5章汇编语言程序设计
(2) 约定段寄存器和段的关系(即物理段和逻辑 段的关系,使用一个或多个ASSUME语句实现)
(3) 装填段寄存器(只装填数据型段寄存器)
(4) 设置返回DOS的方法
例如:
MYDARA SEGMENT ……
MYDATA ENDS MYCODE SEGMENT
ASSUME CS:MYCODE,DS:MYDATA START:
无法正常连接
有算法错误
LINK .EXE文件
(1) 编辑程序
DOS 环境下用 EDIT 编辑器
WINDOWS 环境下用 记事本
(2)汇编源程序
宏汇编程序 MASM.EXE 或小汇编程序 汇编程序主要有以下功能:
① 检查源程序中语法错误,给出错误提示信息 ② 产生目标文件(.OBJ)、列表文件(.LST)及 交叉引用文件(.CRF) ③ 展开宏指令
end start
汇编后的目 标文件只有 208字节
汇编语言源程序的格式
例二 编程实现多字节加法,如 S=3B74AC60F8H+20D59E36C1H
DATA1
F8H 60H ACH 74H 3BH
……
被加数、和
DATA2
C1H 36H 9EH D5H 20H
加数
DATA SEGMENT
DATA1 DB 0F8H, 60H, 0ACH, 74H, 3BH
(3) 操作数
操作数即为操作的对象。在指令语句中,可能有 单操作数或双操作数,也可能无操作数或隐含操作数; 而在伪指令中可能有更多个操作数。当操作数不止一个 时,相互之间应该用逗号隔开。
可以作为操作数的有:常数、寄存器、标号、变量 和表达式等。
1) 常量:是指令在中出现的哪些固定值, 可以分为数值常数和字符串常数两类。

微机原理与汇编语言实用教程_第5章_运算程序设计及应用举例

微机原理与汇编语言实用教程_第5章_运算程序设计及应用举例

/webnew/
第5章 运算程序设计及应用举例 章
5.1.4 除法指令 1.无符号数除法指令DIV (Unsigned Divide Instruction) 指令格式:DIV SRC (AX) (SRC) (AX)/(SRC)商、AH AH (AX) (AX)/ 功能:如果SRC是字节操作数,则把AX中的无符号数除以SRC,得到8位 的商送AL中,8位的余数送AH中,即:AL AL 8 AH AL (SRC)余数。 如果SRC是字操作数,则把DX和AX中的无符号数除以SRC,得到16位的 商送AX中,16位的余数送DX中,即:AX (DX,AX)/(SRC)余数。 指令对标志位的影响无定义。 (DX,AX)/(SRC)商、DX
IMUL指令除了运算对象是有符号数之外,其它都与MUL指令一样,但计算结果 不同。如果乘积的高半部分有符号扩展,则CF=OF=0,否则CF=OF=1。 例5.8 有符号数0B4H与11H相乘。 MOV AL,0B4H MOV BL,11H IMUL BL ;(AL)=0B4H=-76D ;(BL)=11H=17D ;AX)=(AL)×(BL)=(-76)×17=-1292D=0FAF4H ;CF=OF=1
/webnew/
第5章 运算程序设计及应用举例 章
例5.4 DATA SUB1 SUB2 SUB3 DATA 双精度数带借位减法运算。 SEGMENT DW 7788H,5566H DW 3344H,1122H DW 0,0 ENDS … MOV AX,SUB1 SUB AX,SUB2 MOV SUB3,AX MOV AX,SUB1+2 SBB AX,SUB2+2 MOV SUB3+2,AX …
/webnew/
第5章 运算程序设计及应用举例 章

微机原理及其应用第五章

微机原理及其应用第五章
3)SHORT 用于指定某个标号的类型为“短标号”, 即使当前指令位置到指定标号的距离在-128+127 个字节的范围内
⑥ 其他运算符: 1)冒号 一般跟在段寄存器名之后,用于给存储单元 操作数指定段属性,不必考虑存储单元原来的隐含属性。 例如: MOV AX,ES: [DI] 冒号跟在段寄存器ES之后,表示段寄存器的偏移地 址由DI指定。

⑴ 常量 常量是指令中的固定值,它们在程序运 行期间不发生变化,它可以分为数值常量和字符串常 量。例如:立即数寻址时的立即数;直接寻址时的地 址;ASCII码字符串等都属于常量。在汇编语言源程序 中,数值常量可以用二进制数、八进制数(O或Q)、十 进制数和十六进制数来表示,但要用不同的后缀加以 区别。要注意的是,汇编语言要求数值常量的第一位 必须是数字,如:FFFFH应写成0FFFFH,否则汇编 时会被误作为标号处理。 ⑵ 变量 变量是指存放在存储器或寄存器中的数 据,这些数据随着程序运行可能随时会发生变化。寄 存器有固定的名字,如:AL、AX等;存储器常以其地 址或地址表达式的形式出现。应该指出,变量也有段、 偏移量和类型三个属性。
表5-1 TYPE运算结果与操作数类型的对应关系
TYPE运算结果 操作数类型 TYPE运算结果 操作数类型 1 BYTE ( DB ) -1 NEAR
2
4
WORD( DW )
DWORD( DD )
-2
FAR
例如: VAR DW 1234H ARRAY DB 56H ⋮ MOV AX,TYPE VAR MOV BX,TYPE ARRAY 上例中前两句伪指令定义了变量VAR的类型为字, 变量ARRAY的类型为字节,后两句将VAR、ARRAY 的类型对应数值送寄存器AX、BX,即执行TYPE后 AX的值应为2,BX的值应为1。

微机原理与接口技术 第5章

微机原理与接口技术 第5章

提示
(6)类型运算符PTR
5.2 汇编语言入门
格式:类型 PTR 变量、标号或表达式 功能:对已定义的变量、标号或表达式,临时转换其类型,类型可以是BYTE,WORD,DWORD, NEAR或FAR。
例如,“MOV AX, WORD PTR COUNT”,指的是将变量COUNT临时转换成字类型。
内容提要
掌握汇编语言程序的编辑、汇编、连接和调试方法。 掌握汇编语言的概念、助记符和语句格式,以及常数、表达式、标号、变量和运算符的定义与用法。 掌握汇编语言的常用伪指令的格式和用法,以及源程序的结构。 掌握汇编程序设计的基本方法。 掌握高级汇编程序设计方法。
4
5.1 汇编语言程序的编辑、汇编、连接和调试
(2)助记符
• 助记符是汇编语句中 必不可少的部分。其 中,指令助记符规定 了指令语句的操作类 型,伪指令助记符规 定了伪指令语句的伪 操作功能。
(3)操作数
• 操作数可以是寄存器、 存储器、常数、变量、 标号和表达式。指令 语句的操作数可能是 一个、两个或没有, 它们之间用逗号分隔。 而伪指令语句的操作 数根据伪操作命令的 不同而不同,有的伪 指令不允许有操作数, 有的伪指令允许带多 个操作数。
由单引号括起来的一个或多个字符,例如,'I AM A STUDENT'。
2 表达式
5.2 汇编语言入门
汇编语言中的表达式分为数字表达式和地址表达式两种。汇编时对表达式进行计算,如果表达式的结 果是一个数值,则称为数字表达式;如果表达式的结果是一个存储单元的地址,则称为地址表达式。
表达式
算术运算符
运算符 逻辑运算符
该操作符表达式只在本语句中有效,在其他地方不起作用。
注意

《微机原理》教学课件 第5章汇编语言程序设计

《微机原理》教学课件 第5章汇编语言程序设计

第5章 汇编语言程序设计
把例改写为COM程序格式,源程序如下。
;exam 5_3.asm. Seek the largest number and store in the max unit.
Com file form.
code segment
;代码段定义
assume
cs:code
main proc far
data ends
stack segment stack ‘stack’
;堆栈段定义
db 100 dup(?)
stack ends
6页
2021/8/7
code main
seek: next: main code
segment para ‘code’ ;代码段定义
assume cs:code,ds:data,ss:stack
PSP实际上是一个程序控制块,并利用它来管理系统 的进程。PSP包含了操作系统的装入程序在把该EXE 文件装入内存时所需要的有关信息,如重定位表和 初始化有关段寄存器的信息等。
当DOS加载一个可执行文件的程序代码到内存中时, 它首先为该程序建立一个程序段前缀PSP,然后把可 执行的程序代码加载到PSP后面的内存中(由CS指 示),而DS和ES初始化在PSP的起始地址。
proc far
;函数定义
push ds
;返回地址入栈
xor ax, ax
push ax mov ax, data mov ds, ax
;数据段寄存汇(器赋编Se值g语m言en程t)序构是成由的段。
lea si, buffer
;指向buffer区
mov cx, count
;数据个数送cx
dec mov

微机原理课件(09秋)第五章 汇编语言程序设计

微机原理课件(09秋)第五章 汇编语言程序设计

第五章 汇编语言程序设计
3.变量 3.变量
变量——即内存中的存储单元或数据区。 即内存中的存储单元或数据区。 变量 即内存中的存储单元或数据区 变量名——是存储单元(数据区)的符号地 是存储单元( 变量名 是存储单元 数据区) 址或名字。 址或名字。 变量也有三个属性: 变量也有三个属性:
• 段地址—变量所在段的段地址 段地址 变量所在段的段地址 • 偏移量 变量单元地址与段首地址之间的位移量 偏移量—变量单元地址与段首地址之间的位移量 • 类 型—有BYTE、WORD和DWORD三种 有BYTE、WORD和DWORD三种
字符串常数: 字符串常数:
包含在单引号中的若干字符。 包含在单引号中的若干字符。 汇编时被翻译成对应的ASCII ASCII码 汇编时被翻译成对应的ASCII码
第五章 汇编语言程序设计
2.标号 2.标号——指令所在内存单元的符号地址 标号 指令所在内存单元的符号地址
有三个属性: 有三个属性: 段地址:即标号所在段的段地址; 段地址:即标号所在段的段地址; 偏移量:标号所代表存储单元的段内偏移地址; 偏移量:标号所代表存储单元的段内偏移地址; NEAR或FAR: 类 型:NEAR或FAR: NEAR—表示标号所在语句与转移指令 表示标号所在语句与转移指令/ NEAR 表示标号所在语句与转移指令/ 调用指令在同一码段内。 调用指令在同一码段内。 FAR—标号所在语句与转移指令 标号所在语句与转移指令/ FAR 标号所在语句与转移指令/调用 指令不在同一代码段内。 指令不在同一代码段内。 若没有对类型进行说明,默认为NEAR NEAR。 若没有对类型进行说明,默认为NEAR。 转移指令或 指令的转移地址 标号通常作为转移指令 CALL指令的转移地址。 标号通常作为转移指令或CALL指令的转移地址。

微机原理第五章汇编语言程序的设计课件

微机原理第五章汇编语言程序的设计课件
DB:定义字节变量,即其后的每个操作数均占1个字节; DW:定义字变量,即其后的每个操作数均占2个字节; DD:定义双字变量,即其后的每个操作数均占4个字节; DQ:定义4字变量,即其后的每个操作数均占8个字节; DT:定义10字节变量,即其后的每个操作数均占10个字节。 注意: 存放多字节数据时,数据高字节存放在高地址单元,低字 节存放在低地址单元。
汇编语句使用说明(续)
汇编语言中的常量与变量
常量:汇编中允许的常量有整数常量和字符串常量两种。 变量:汇编语言中的变量用来表示存放在内存中操作数,它 的值是可以改变的,变量的值就是操作数在内存中首字节的地 址,变量要事先定义才能使用。对于变量,类型属性说明变量在 内存中占多少个字节,其属性有BYTE(字节)、WORD(字)、 DOUBLE WORD(双字)3种。
☆ 变量定义伪指令
初值表给出变量的初始化值,有多个值时用逗号分隔。 初始化值可以是数值常数,也可以是表达式、?,还可以 由$、重复操作符DUP组成。其中: ?表示未赋初值; $ 表示将要分配的内存单元的偏移地址; DUP表示重复初值。 格式为:重复次数 DUP(重复参数) 说明:重复参数可以是多个,之间用逗号间隔。 举例:2 DUP(1,2) ;等价于1,2,1,2
☆ 常量--整数常量
字符串常量是由单引号或双引号括起来的单个字符或多个字符构成的。汇编程序把引号中的字符翻译成它的ASCII码值。如:‘A’(等于41H)、‘BC’(等于4243H)、“HELLO”等。
☆ 常量—字符串常量
汇编语言中的运算符与表达式
运算符:汇编中的运算符分为6大类,它们是:算术运算符、 移位运算符、逻辑运算符、关系运算符、分析运算符、合成运算 符(见课本P131表5-1)。 表达式:表达式是常数、寄存器、标号、变量与一些运算 符和操作码相组合的序列。 表达式的运算不由CPU完成,而是在程序汇编过程中进行 计算确定,并将表达式的结果作为操作数参与指令所规定的操 作。 当各种运算符同时出现在同一表达式中时,按照运算符的 优先级进行计算,对于优先级相同的运算符,按照从左到右的 顺序进行计算(见课本P132表5-2)。

《微机原理与接口技术》PPT电子课件教案- 第五章 汇编语言程序设计(1)

《微机原理与接口技术》PPT电子课件教案- 第五章 汇编语言程序设计(1)
第五章 汇编语言程序设计
第一节 第二节 汇编语言程序结构 指示性语句
第三节
第四节 第五节
汇编语言程序举例
BIOS和DOS功能调用 汇编语言程序设计
1
第一节 汇编语言程序结构 一、程序结构
二、语句结构
2
第一节
例一
程序:
汇编语言程序结构
movs.asm
功能: 实现数据传送功能
数据段1
传送到
数据段2
目的: 学习程序结构
str1
str2
str1 DW ‘abcd’
str2 DD ‘abcd’
54 73 69 6e 67 48 75 61 49 4e 50 55 54 3a 0d 0a 24
‘T’ ‘s’ ‘i’ ‘n’ ‘g’ ‘H’ ‘u’ ‘a’ ‘I’ ‘N’ ‘P’ ‘U’ ‘T’ ‘:’ 0dH 0aH ‘$’
20
三、变量定义伪操作
格式 变量名 类型助记符 操作数 [ ,操作数 , ... ] ▲ 用来定义程序中所用的内存操作数。 其中 变量名指示内存操作数的地址(符号地址) 类型助记符指示内存操作数的类型(字节、字、双字等) 操作数指示内存操作数的内容 ▲ 汇编程序将定义的操作数,按其类型分配内存单元数,
26
例 用程序实现 1234H + 5678H
六、过程定义 (第五节程序设计介绍) 七、等值定义 (第五节程序设计介绍) 汇编语言程序例三 (第五节程序设计介绍)
15
指示性语句与指令性语句:
指令性语句是用指令系统中的指令构成的语句。
例 MOV AX, BX
指示性语句是指示汇编程序进行汇编的操作。
例 MOV AX, 4 + 8

微机原理及接口技术 第5章汇编语言程序设计

微机原理及接口技术 第5章汇编语言程序设计

引用格式 HIGH 表达式 LOW 表达式
作用说明 取表达式的高字节数据 取表达式的低字节数据
例如:已知数据段DATA从存储器实际地址 03000H开始,作如下定义后,用SEG运算符求 变量所在的段基址。
DATA
SEGMENT VARl VAR2 VAR3
;定义数据 段 DB 12H, 34H, 45H, 56H ;定义字节 数据 DW 1200H,2300H ;定义字数 据 DD ;定义双字 11002200H,23003300H 数据
运算符
算术运算符(+、-、* 、/、MOD(取除法 中的余数) 例如: MOV AX,19 MOD 7 ;(AX)=5 逻辑运算符(AND/OR/XOR/NOT) 例如:AND DX,DAT AND 0FEH 9999H XOR 0FOFOH的结果为6969H AND DX,1FH AND 0FEH 关系运算符 (EQ/NE/LT/LE/GT/GE) 若关系为假,则结果为0;若关系为真,则 结果为0FFFFH。 例如: MOV BX,PORT LT 5
5.3 伪指令
伪指令用来指示汇编程序应该如何去处理汇 编语言的源程序。它们在汇编时被解释执行, 除了部分语句可以申请存储空间以外,不产生 任何目标代码。
5.3.1 符号定义伪指令 1.等值语句 格式:符号名 EQU 表达式 功能:用一个符号名来代替表达式,使该符 号名与表达式同义。
CR EQU 0DH TEN EQU 0AH AA EQU ASCII_TABLE VAR EQU TEN*2+1024 ADR EQU ES:[BP+DI+5] GOTO EQU JMP ;常量 ;常量 ;变量 ;数值表达式 ;地址表达式 ;指令助记符
4.常量:常数就是指令中出现的那些固定值 。 5.注释:在汇编语言源程序中,为了便于理解和阅在8086汇编语言中,有数值表达式和地址表 达式两种,由各种常量与运算符连接成的式子, 称为数值表达式。将常量、变量、标号、寄存器 内容和运算符、操作符组合成的有意义的式子, 称为地址表达式。单个常量,变量、标号是表达 式的最简形式。在汇编过程中,汇编程序按操作 运算符约定的优先规则对表达式进行计算,得到 一个数值或一个地址。

微机原理第5版(周荷琴)第五章.pptx

微机原理第5版(周荷琴)第五章.pptx

例 5.4 用1K×4的SRAM芯片2114构成4K×8的存储器。 先作位扩展, 2 片 2114并接成一组 1KB存储器;再对 4 组作字扩展,用24译码器对这4组进行片选。
3. 形成片选信号的三种方法 1)线选法
用某1位高位地址做片选,低位地址与芯片地址线相连
实现片内寻址。电路简单但空间浪费大,因部分地址 线未参与译码,会地址重叠和地址不连续。 例5.5 有2块2764 EPROM芯片,用线选法对它们进行寻 址。画出译码电路示意图,并列出地址范围。 2764 容 量 8KB=23×210=213 字 节 , 共 有 13 根 地 址 线 A12A0。可在地址总线A19A13中任选2根作线选译码 信号,当然地址范围会不同。 CE 让A13、A14接芯片1、2的片选 端,A12A0接芯片1、 2的地址线A12A0 ,就实现了线选法寻址。 这样, A13=0 选中 2764(1) , A14=0 选中 2764(2) 。它们 不能同时选中。A12A0从000H变到FFFH,就能顺序 访问被选中芯片中的8K个字节。
2)字扩展
芯片位数已符合,只要增加地址范围,即字扩展增加
字数或容量。 例5.3 用16K×8芯片字扩展为64K×8存储器。 用4个芯片,A13A0、D7 D0、WE 线均并联,设计1 个24译码器,为各芯片提供片选信号 CS3 CS0 。
3)字位扩展
存储器芯片的容量和位数都需要进行扩展。
§5.4 存储器与CPU的连接
5.4.1 设计接口应考虑的问题
5.4.2 存储器接口设计
5.4.2 存储器接口设计
1. 地址译码器
存储器由多个芯片构成,CPU进行读/写操作时,
首先应选中特定的芯片,称为片选,然后从该芯 片中选择所要访问的存储单元。片选和访存的信 息,来源于CPU执行存储器读/写指令时,送到地 址总线上的地址信息,其中的高位用来生成片选 信号,低位直接连到芯片的地址线上,去实现片 内寻址。 用高位地址信息实现片选的电路称为地址译码器, 有门电路译码器、 N中取一译码器和 PLD( Programmable Logic Device,可编程逻辑器件)译码 器等几种。如果用 FPGA 设计硬件系统,还可用 FPGA芯片的一部分来实现地址译码。 74LS138是常用的8中取1译码器。

微机原理第五章(4)PPT教学课件

微机原理第五章(4)PPT教学课件
▲ 计算机要利用显示器、键盘等外设时, 须据程序设计的需要进行有关转换。
2020/12/10
14
例 将CPU运算的结果通过显示器显示时,如二进制数“A9”
需将结果转换成其对应的ASCII码才能进行显示。
显示缓冲区 存放的内容 (字符的ASCII 码)
CPU运算后所得的二进制数 10101001
例1
4
3.几种程序结构 顺序结构 分支结构 循环结构 子程结构
2020/12/10
5
顺序结构
2020/12/10
6
Y N
两个分支
分支结构
、、、 CMP AL, BL JG great
AL≤BLxit: 、、、 、、、
2020/12/10
7
分支结构
N
Y
N
、、、
CMP AL, 0 JG great JL less
AL=0处理
Y
JMP exit
less: AL<0处理
三个分支
JMP exit great:
AL>0处理 exit: 、、、
2020/12/10
8
循环结构
循环初始设置 循环条件判断? N
Y 循环体
当型循环 (当条件成立进入循环)
▲ BX是一个16位寄存器
二进制 十六进制
1010 1001 0011 1110 A93E
屏幕上的显示 ‘A’ ‘9’ ‘3’ ‘E’ 对应的ASCII 41H 39H 33H 45H
?
▲ 用十六进显示时,每4位用一个字符显示,共4个
其中: 0000 →’0’ 30H , 1010 →’A’ 41H
subp subp
PROC 、、 、、

6微机原理第五章:汇编语言程序设计2

6微机原理第五章:汇编语言程序设计2
先 判 断 后 执 行
先 执 行 后 判 断
三、循环程序结构
循环的准备工作:建立地址指针、设置 计数器初值和其它一些参数的起始值等
循环程序核心:程序的重复执行 部分,主要实现循环程序的功能
为下一次循环做准备:保证在循环过 程中,操作的数据及地址能按一定 规律进行变化,与循环体协调地工作 保证循环程序按规定的循环次数或 控制循环条件正常循环或结束循环 对循环的结果分析或保存; 有些循环程序不需要这一部分
③ PUSH DS MOV AX ,0 PUSH AX

该方法与子程序中的RET指令配合来实现返回操作系统,相当于 执行一条 INT 20H 指令,与程序段前缀(PSP)有关。
5.4
5.4.1
汇编语言程序上机调试过程
汇编语言源程序的上机过程
★ 汇编语言源程序,须经以下几步,才能对程序进行调试和运行。 一、编辑:用编辑程序建立扩展名为.ASM 的汇编语言源程序文件
问题转化为近似计算公式,成为计算机能执行的基本操作。
三、绘制程序的流程图
用流程图把解决问题的先后执行步骤直观而清晰地描述出来。 是设计程序的好方法,就象写文章、做报告,制定提纲一样。
起始框:
判断框:
Y
流向线:
处理框:
N
连接线:
终点框:
子过程框:
程序流程图符号
B
A
四、安排程序的段结构、分配存储器空间
用 EDIT 编辑程序:编辑、建立ASM源程序(文件名.ASM) 用 MASM 汇编程序: 对源程序汇编,产生目标程序(文件名.OBJ ) 用 LINK 连接程序: 将OBJ文件转换成可执行文件(文件名.EXE)

5.2.3
程序的基本结构

微机原理第五章《指令系统》课件知识点讲解要点归纳

微机原理第五章《指令系统》课件知识点讲解要点归纳
第五章 指令系统(1)
概念:
• 指令:要求计算机执行某种操作的命令 • 一台计算机,其所有机器指令的集合构成机器的指令系统 • CISC-Complex Instruction Set Computer,复杂指令系统 计算机 • RISC-Reduced Instruction Set Computer,精简指令系统 计算机 • RISC计算机提出的依据 • RISC计算机的主要特点:
第五章 指令系统(14)
指令 I1 I2 I3 I4 I5 I6 I7 Pi 0.45 0.30 0.15 0.05 0.03 0.01 0.01 操作码 00 01 10 1100 1101 1110 1111 长度(位) 2 2 2 4 4 4 4
这种方案的操作码的平均长度为: L=(0.45+0.30+0.15)×2+(0.05+0.03+0.01+0.01)×4=2.2(位) 这种方案虽然使操作码的平均长度稍有增长,但给操作码译码带来方便,通常 称作“扩展操作码法” 。
OP D1 D2 D3 三地址指令
OP
OP
D1
D
D2
二地址指令
单地址指令
OP
说明:
零地址指令
•三地址指令包含三个地址,其基本操作是 : (D1) OP (D2)→ D3
•二地址指令包含两个地址,其基本操作是:(D1) OP (D2)→ D1或D2
•单地址指令中只包含一个地址,可有两种情况:
(1) 本指令为双操作数指令,但约定一个操作数固定存放在累加器(AC)中,其基本 操作是: (AC) OP (D)→ AC (2) 本指令为单操作数指令,例如将某个地址D中的内容加1或减1等。
a 0 0 0 0 0 0 0 0 1 1

微机原理与接口技术第5章 汇编语言程序设计

微机原理与接口技术第5章  汇编语言程序设计

START
5.1.2 汇编语言基础
从上面的汇编语言源程序示例中可以看到,一个源程序 包括若干个段。下面详细介绍汇编语言程序的基本组成。 1.字符集 字符集是指汇编语言中所使用的字符的集合,是组成汇 编语言语句的基本元素,它是ASCII和EBCD字符集的一 个子集,包括以下几个组成部分。 (1)字母 大写的英文字母:A、B、C、D、E…X、Y、Z。 小写的英文字母:a、b、c、d、e…x、y、z。 (2)数字 阿拉伯数字:0、1、2、3、4、5、6、7、8、9。 (3)特殊字符 可打印的字符:! @ # $ % & * ( ) + / = __ [ ] { } ; . , ~ ` “ ” < > :?。
第5章 汇编语言程序设计
5.1 5.2 5.3
汇编语言基础知识 汇编语言中的伪指令 程序设计 分支程序设计 循环程序设计
5.4
5.5 5.6
子程序设计
通过前面对指令系统的介绍,大家对汇编程 序的基本指令有了一个大概的了解。本章将利用 已经掌握的基本指令进行汇编语言程序设计,学 习本章时要结合指令系统。汇编语言程序与其他 高级语言相比,有其独特的优点:可以轻松地访 问硬件端口,生成的可执行文件占用空间小,执 行效率高。 学习了汇编语言的基础知识后,本章将完成 两个具体的汇编程序设计任务。第一,用汇编语 言写一个加法程序,第二,用汇编语言写两个无 符号数相乘的程序。
(1)标号 标号是程序中可供跳转或调用的位置的名字,该位置存放 某条指令的存储单元的符号地址。标号有以下3种定义格式。 标号: [指令] 过程名 PROC [类型] … 过程名 ENDP 标号 LABEL 类型 标号有以下3种属性。 段值:段值是标号所指的指令代码所在段的段基址。 偏移量:偏移量表示从段首地址到标号位置之间的距离。 类型:标号的类型有两种,NEAR和FAR。NEAR说明实 现的是段内转移或段内调用;FAR说明实现的是段间转移 或段间调用。

微机原理与汇编语言程序第五章

微机原理与汇编语言程序第五章

第5章程序设计方法和上机调试第五章《程序设计方法和上机调试》轨道交通与电力牵引技术研究所本章介绍以下内容分支结构 循环程序结构 子程序结构 综合举例汇编程序的设计方法唐建湘Tel:2656809 tang2656809@2009-8-30上机调试过程 宏汇编和条件汇编1中南大学信息院电气工程系2009-8-30中南大学信息院电气工程系2汇编语言程序设计的一般步骤流程图汇编语言程序设计一般有以 下几个步骤: 分析问题,确定算法 绘制流程图,分配存储区 根据流程图编制程序 调试程序2009-8-30中南大学信息院电气工程系磨 刀 不 误 砍 柴 工31.流程图的概念 流程图是由特定的几何图形,指向线, 文字说明来表示数据处理的步骤,形 象描述逻辑控制结构以及数据流程的 示意图.流程图具有简洁,明了,直 观的特点. 2.流程图符号表示 (1)起止框:表示 程序的开始和结束.起止框2009-8-30中南大学信息院电气工程系4流程图流程图(2)判断框 (3)处理框(5)指向线(4)调用框5(6)连接框2009-8-30中南大学信息院电气工程系2009-8-30中南大学信息院电气工程系615.1汇编程序的设计方法5.1.1顺序结构本节介绍以下内容:例:内存中TABLE开始存放0-9的平方值,通过人机对话,当任给定一个X (0-9),查表得X的平方值,放在AL中.顺序结构 分支结构 循环程序结构 子程序结构 综合举例DATA SEGMENT 段定义语句:将一个逻辑段定义成一个整体 TABLE DB 0,1,4,9,16,25,36,49,64,81 BUF DB 'Please input one number:',0DH,0AH,'$' 分类名 DATA ENDS 定位类型:指定段的起始地址 STACK SEGMENT PARA STACK ' STACK' DB 50 DUP(?) 指定段的类型 TOP THIS WORD STACK ENDS 定义TOP为栈底名,类型为字 CODE SEGMENT 段分配语句 ASSUME CS:CODE,DS:DATA,SS: STACK MAIN PROC FAR 72009-8-30中南大学信息院电气工程系2009-8-30中南大学信息院电气工程系8START:NEXT:MOV MOV MOV MOV MOV MOV MOV MOV INT MOV INT MOV AND ADD MOVAX,DATA DS,AX AX,STACK SS,AX SP, OFFSET TOP BX,OFFSET TABLE DX,OFFSET BUF AH,9 21 AH,1 21 AH,0 AL, 0FH BX,AX AL,[BX];送数据段段地址 ;送堆栈段段地址 ;堆栈段偏移量送SP ;平方表有效地址送BX ;提示输入一个数 ; 9号功能调用,(显示字符串) ;1号功能调用,(输入字符并显示) ;键入数送入AL A*D ;屏蔽高四位 ;表首加偏移量 ;查表得平方值送AL ;带参数返回DOS ;返回DOS ;过程MAIN结束 ;代码段结束 ;汇编结束 B*C例1:两个32位无符号数的乘法A B D B*D*CMAIN CODE2009-8-30MOV AH,4CH INT 21H RET ENDP ENDS END START+A*CBX+0 +2 * 积3 * +4 积1 +6 + 部分积1 和1 +8 +A 部分积2 +C 部分积3 +E 部分积4最后乘积B A D C 积1L 积1H 和2 和1L 和2 L 和1H 和3 和3H* 积2 + 积1H * 积4 + 和2H乘法运算过程示意图 10中南大学信息院电气工程系92009-8-30中南大学信息院电气工程系设地址指针 被乘数的低16位B送AXname 32 bit multiply进位加至部分和1H,存内存 B×C=部分积3 DATA SEGMENT MULNUM DW 0000,0FFFFH,0000,0FFFFH,4DUP( ?) DATA ENDS STACK SEGMENT PARA STACK ' STACK' STAK DB 100 DUP(?) TOP EQU LENGTH STAK STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS: STACK, ES :DATA START PROC FAR BEGIN: PUSH DS MOV AX,0 PUSH AX MOV AX, DATA ;送数据段段地址 MOV DS,AX MOV ES, AX MOV AX,STACK ;送堆栈段段地址 MOV SS,AX MOV SP, OFFSET TOP ;堆栈段偏移量送SP乘数的低16位D送SI 乘数的高16位C送DI B×D存部分积1部分积3+部分和1,存内存 存进位 A×C=部分积4被乘数的高16位A送AX A×D=部分积2 部分积2L+部分积1H部分积4+部分和2H+ 进位=和3 存和3 返回2009-8-30中南大学信息院电气工程系112009-8-30中南大学信息院电气工程系122LEABX,MULNUM ; B送 AX ; D送SI ; C送DI ; B*D ; 保存部分积1 ; A送AX ; A*D ; 部分积2L与部分积1H相加 ; 存和1 ; B送AX ; C*B,部分积3 START CODEMULU32: MOV AX ,[BX] MOV SI ,[BX+4] MOV DI ,[BX+6] MUL SI MOV [BX+8] ,AX MOV [BX+0AH] ,DX MOV AX ,[BX+2] MUL SI ADD AX ,[BX+0AH] ADC DX ,0 MOV [BX+0AH] ,AX MOV [BX+0CH] ,DX MOV AX ,[BX] MUL DIADD AX ,[BX+0AH] ADC DX ,[BX+0CH] MOV [BX+0AH] ,AX MOV [BX+0CH] ,DX PUSHF MOV AX ,[BX+2] MUL SI , POPF ADC AX , [BX+0CH] ADC DX ,0 MOV [BX+0CH] ,AX MOV [BX+0EH] ,DX RET ENDP ENDS END BEGIN;部分积3与和1相加 ;存和2 ;保护进位位 ; A送 AX ;A×C,得积4 ;恢复进位位 ; 部分积4L与和2H相加; 存和32009-8-30中南大学信息院电气工程系132009-8-30中南大学信息院电气工程系145.1.2分支结构二分支 多分支 跳转表实现多分支例3:在以BUF为首地址的 内存,存放着一个长度为N (N<256)的字符串,编程统 计其中数字,字母和其它字 符的个数,统计数存放在串 后三个单元中.'0'—'9' 初始化 取一字符送AL (AL)≥30H Y (AL)>39H Y (AL) ≥41H N 'A'—'Z'30H—39H 41H—5AHADH送内存 DL送内存N DH+1根据表内地址分支 根据表内指令分支 根据关键字分支2009-8-30中南大学信息院电气工程系 15NAL=N-DH-DL AL送内存 RET NDL+1 初始化:N送CX; 0送DX; 0送BX; BX为串偏移量, MOV AL,BUF[BX]NY (AL)>5AH Y修改BX及(CX)-1 (CX)=0 Y2009-8-30中南大学信息院电气工程系 A162,多分枝有的分枝结构为多分枝,可依次测试条件是否满足,若满足 条件则转入相应分枝入口,若不满足继续向下测试,直到全部 测试完.简单,直观,速度慢. 例:有8个加 工子程序,入 口地址分别为 P1,P2,… P8.编程实现 检测键盘输入 命令,使系统 分别转向8个 加工子程序. 局限性?MOV AH,1 INT 21H ;1号功能调用,键盘输入 CMP AL,'1' JE P1 ;键值为1,转P1 CMP AL,'2' JE P2 ;键值为2,转P2 CMP JE JMP P1:… P2:… P8:… ST: HLT AL,'8' P8 ST3,跳转表实现多分枝利用跳转表实现多分枝,可以直接找到相应入口,利用该法需建立 一个跳转表,表中含每个分枝的入口地址. (1)根据表内地 址分枝 BASE+0 跳转表中存放了 每个分枝程序的 BASE+2 入口地址,只要 找到表地址,再 将其内容取出, 即可得到每个分 P0 枝程序的入口地 址. P1 表地址=跳转表首 址+偏移地址 MOV BX,OFFSET BASE 开始 P0L P0H P1L P1H . . . . . . . . . 输入键值 表首地址BX 求偏移量 计算地址 散转 跳转表在内存中 的存放方法 JMP WORD PTR [BX] AND ADD MOV ADD AL,0FH AL,AL AH , 0 BX,AX;键值为8,转P8 ;非法键,转停机 ; 1号键加工子程序 ; 2号键加工子程序 ;8号键加工子程序2009-8-30中南大学信息院电气工程系172009-8-30中南大学信息院电气工程系183(2)根据表内指令分枝跳转表中存放着转移指令,查表后程序执行转移指令将转到相应的子程序去. MOV AH,1 BASE JMP P1L P1H JMP P2L P2H . . . . . . . . . INT 21H ;键入到AL(3)根据关键字分枝跳转表中存放关键字及相应分枝地址. 分枝流程图BASEAND AL,0FH MOV AH,0 MOV BL,ALADD AL,AL ADD AL,BL ;偏移量=键值*3 MOV ADD BX,OFFSET BASE BX,AX ;得转移地址 ;转入转移指令 P1 P231 P1L P1H 32 P2L P2H . . . . . . . . .开始 输入关键字Y关键字=0 N 首地址送BX 与关键字比较 相等 N 指针加3 YP1 P2JMP BX 转移指令跳转表转移2009-8-30中南大学信息院电气工程系19关键字跳转表2009-8-30中南大学信息院电气工程系20例:首地址为BUFFER的数组已按升序排好,长度为N(=10),在数组中查找 数M(=80),若找到则从数组中删掉,否则将它插入正确的位置,DX中记录 数组最后的长度. AX=80 CX=10 DX=10 数组中无M 搜索有无关键字 10 CX=9 MOV DI,OFFSET BUFFER AX≠ CLD REPNE SCASW 寻找插入位置 SI=2*(DX–1) CMP AX,BUFFER[SI]搜索有无关键字 MOV DI,OFFSET BUFFER CLD REPNE SCASW 搜索到,后续元素前移 MOV BX,[DI] MOV [DI-2],BX ADD DI,2数组中有数M AX=80 AX≠ AX≠ AX≠ AX≠ AX≠ AX≠ AX≠ AX = CX=10 DI=BUFFER CX=9 CX=8 CX=7 CX=6 CX=5 CX=4 CX=3 DI=BUFFER+2 DI=BUFFER+4 DI=BUFFER+6 DI=BUFFER+8 DI=BUFFER+A DI=BUFFER+C DI=BUFFER+E25 CX=8 边 36 AX≠ CX=7 界 48 AX≠ CX=6 条 53 AX≠ CX=5 件 58 AX≠ CX=4 元素下移 MOV BX,BUFFER[SI] 问 70 AX≥ BUFFER[SI-2] AX≠ CX=3 MOV BUFFER[SI+2],BX 80 82 AX≥ BUFFER[SI-2] AX≠ CX=2 题 插入 82 90 AX≥ BUFFER[SI-2] AX≠ CX=1 MOV BUFFER[SI+2],AX 90 98 AX≥ AX≠ BUFFER[SI] CX=0 98 DX=11 21 中南大学信息院电气工程系 2009-8-30AX≠BX=[DI]=(BUFFER+10H) BX=[DI+2]=(BUFFER+12H)10 25 36 48 53 58 70 90 80 98 90 98CX=2 DI=BUFFER+10H DI-2 CX-1=1 DI-2 CX-1=0 DX=92009-8-30中南大学信息院电气工程系22初始化串扫描查找 Y 找到 N 设置串尾比较指针SI 关键字>[SI] N 数组元素下移 修改比较指针SI Y初始化:M送AX; N送CX,DX; 地址偏移量送DI; 增量修改指针 CLD YDATA(CX)=0 N DI 所指元素上移 修改比较指针DI (CX)-1=0 Y 数组长度-1 N插在SI所 指单元后 数组长度+1结束SEGMENT BUFFER DW 5,10,32,47,53,77,89,106,115,124 N DB 10 M EQU 80 DATA ENDS CODE SEGEMENT ASSUME CS:CODE,DS:DATA,ES:DATA MAIN PROC FAR START: PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV ES,AX ; MOV AX,M ;待查数 送AX MOV CX,N ;数组长度送 CX MOV DX,N MOV DI,OFFSET BUFFER CLD REPNE SCASW ;串扫描查找2009-8-30中南大学信息院电气工程系232009-8-30中南大学信息院电气工程系244JE DEL ;查到,ZF=1 DEC DX ;未查到,插入 MOV SI,DX ;关键字与最后数比较 ADD SI,DX L1: CMP AX,BUFFER[SI] JL L2 ;关键字比数组中某个字小,转L2 MOV BUFFER[SI+2], AX ;大,则插在后面 JMP L3 L2: MOV BX,BUFFER[SI] ;数组下移一位 MOV BUFFER[SI+2], BX SUB SI,2 JMP L1 L3: ADD DX,1 ;修改长度 JMP NEXT1 DEL: JCXZ NEXT ;找到,删此元素 DEL1: MOV BX,[DI] ;其后元素依次前移 MOV [DI-2],BX ADD DI,2 LOOP DEL1 NEXT: DEC DX ;改变数组长度 NEXT1: RET MAIN ENDP CODE ENDS 25 END 中南大学信息院电气工程系 2009-8-30START5.1.2循环结构常规结构 先执行,后判断. 先判断,后执行.方法控制循环 用计数控制循环 用逻辑尺控制循环多重循环2009-8-30中南大学信息院电气工程系 262. 多重循环程序设计冒泡排序算法在以BUF为首址的字存储区中存放有N 个有符号数,现需将它们按大到小 的顺序排列在BUF存储区中,试编写 其程序. 我们采用冒泡排序算法从第一个数开 始依次对相邻两个数进行比较,如 次序对,则不交换两数位置;如次 序不对则使这两个数交换位置.2009-8-30中南大学信息院电气工程系 27数 10 8 16 90 32 第一遍 10 16 90 32 8 第二遍 16 90 32 10 8 第三遍 90 32 16 10 8 程序流程图如图5-10所示.2009-8-30中南大学信息院电气工程系28冒泡排序算法程序如下: DATA SEGMENT BUF DW 3,-4,6,7,9,2,0,-8,9,-10,20 N=($-BUF)/2 DATA ENDS STACK SEGNMENT STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT ASSUME CS : CODE , DS : DATA,SS:STACK2009-8-30中南大学信息院电气工程系292009-8-30中南大学信息院电气工程系305冒泡排序算法START: MOV AX,DATA MOV DS,AX MOV CX,N DEC CX MOV DX,CX MOV BX,0 MOV AX,BUF[BX] CMP AX,BUF[BX+2] JGE L XCHG AX , BUF[BX+2] MOV BUF[BX],AX中南大学信息院电气工程系 31冒泡排序算法L: ADD BX,2 DEC CX JNE LOOP2 MOV CX,DX LOOP LOOP1 MOV AH,4CH INT 21H ENDS END START中南大学信息院电气工程系 32LOOP1: LOOP2:CODE2009-8-302009-8-30冒泡排序算法5.1.3子程序结构程序运行后,BUF区中的内容 如下: 20,9,7,6,3,2,0,-4,8,-9,-10 若要对N个无符号数按由大到 小的顺序排列, 只需将指令 "JGE L"改为"JAE L"即可.2009-8-30中南大学信息院电气工程系 33汇编语言中多次使用的程序段应 当写成一个相对独立的程序段, 将这样的程序段定义为"过程"或 称子程序. 每一个子程序包括在过程定义语 句PROC…ENDP中间. 过程的距离属性有:NEAR / FAR 过程调用的指令:CALL. 过程返回的指令:RET.2009-8-30中南大学信息院电气工程系 34子程序说明子程序说明子程序真正实用在于它的通用性例如:在任意长度,任何地址的 串中搜索任意字符的子程序是广 泛有用的编写子程序时应当用注释语句写明该 子程序的主要信息. 子程序的主要注释信息包括: (1)功能描述子程序的名称,功能及性能(2)子程序中用到的寄存器和存储单元 (3)子程序的入口参数和出口参数 (4)子程序中调用其它子程序的名称352009-8-30中南大学信息院电气工程系2009-8-30中南大学信息院电气工程系366子程序说明PROC NEAR(FAR) PUSH CX MOV CH,AL AND CH,0FH ;名称:BCD2BIN CL,4 ;功能:一个字节的BCD码转换成二进制数 MOV ;所用寄存器:CX SHR AL,CL ;/16 ;入口参数:AL中存两位BCD数 MOV CL,10 ;出口参数:AL存二进制数 MUL CL ;*10 ;调用其它子程序:无 ADD AL,CH ;+低位 POP CX RET BCD2BIN ENDP * 保护调用程序的返回地址,在子程序中特别注意堆栈的使用, 防止弹出地址值出错; * 保护寄存器的内容,注意PUSH,POP指令的使用次序. 37 中南大学信息院电气工程系 2009-8-30 BCD2BIN子程序调用主程序使用CALL指令调用过程过程调用应处理好三个问题: (1)保护调用程序的返址 (2)保护某些寄存器内容 (3) 参数传递用寄存器传递参数 用存储器传递参数 用堆栈传递参数2009-8-30中南大学信息院电气工程系 38子程序调用*子程序的调用和返回 子程序名 PROC 可存放在与主程序同一CS段.调用时使用 CALL (NEAR)指令,称为段内调用. 子程序名 PROC 可存放在与主程序不同的CS段.调用时使 用CALL FAR指令,称为段间调用. *现场保护和恢复 保护和恢复的对象:在子程序中需要使用的内部寄存器. (1)一定要保护:子程序中使用的寄存器;在返回后主程序需继 续使用的寄存器. (2)一定不能保护:作为子程序的结果传送给主程序的寄存器. (3)可不必保护(随意):子程序中使用,返回主程序后不再使用 的寄存器. 39 中南大学信息院电气工程系 2009-8-30子程序调用参数传递技术 (一)利用寄存器传递参数 例如在某子程序中要对两个长度相同的数据缓冲区 进行操作,可在主程序中把缓冲区的长度和首址存入寄 存器中. MOV MOV MOV CALL CX,LENGTH BX,OFFSET BUFFER1 SI, OFFSET BUFFER2 SUBR2009-8-30中南大学信息院电气工程系40(二)利用存储器传递参数SEGMENT 例:编程实现数组段分别求和(不计溢出). ARY1 DW 100 DUP(?) SUM1 DW ? ARY2 DW 100 DUP(?) SUM2 DW ? DATA ENDS STACK SEGMENT STACK SA DW 50 DUP(?) TOP EQU LENGTH SA STACK ENDS CODE SEGMENT ASSUME CS: CODE,DS:DATA,SS:STACK MAIN PROC FAR START: PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX 41 MOV SP,TOP 中南大学信息院电气工程系 2009-8-30 DATA(二)利用存储器传递参数LEA MOV CALL LEA MOV CALL RET ENDP PROC XOR ADD INC INC LOOP MOV RET ENDP ENDS END SI,ARY1 CX,LENGTH ARY1 SUM SI,ARY2 CX,LENGTH ARY2 SUM调用前将数组的偏移 地址放入SI中MAIN SUM L1:NEAR AX,AX AX,WORD PTR[SI] SI SI L1 WORD PTR [SI],AX在过程中通过寄存器 间址就可取得存储器 中的操作数,并通过 存储器返回.SUM CODESTART2009-8-30中南大学信息院电气工程系427(三)利用堆栈传递参数例:编程实现十进制数组求和,段间调用.子程序: SUBR: PUSH MOV MOV BPL MOV BPH MOV IPL IPH POP BUFLL RET BUFLH BP BP,SP CX,[BP+4] DI, [BX+6] SI, [BX+8] MDATA SEGMENT ARY1 DB 20 DUP(?) SUM1 DW ? ARY2 DW 100 DUP(?) SUM2 DW ? MDATA ENDS MSTACK SEGMENT STACK SB DW 100 DUP(?) TOP EQU LENGTH SB MSTACK ENDS MCODE SEGMENT ASSUME CS: MCODE,DS:MDATA,SS:MSTACK MAIN PROC FAR START: PUSH DS SUB AX,AX PUSH AX MOV AX,MDATA MOV DS,AX MOV AX,MSTACK MOV SS,AX 44 MOV SP,TOP 中南大学信息院电气工程系 2009-8-30段说明:DATA SEGMENT BUFFER1 DW BUFA BUFFER2 DW BUFB LENGTH DW BUFL DATA ENDSSP-A SP-9 SP-8 SP-7 SP-6主程序:LEA PUSH PUSH PUSH CALL BX,BUFFER1 [BX] [BX+2] [BX+4] SUBRBPSP-5 SP-4 BUFBL SP-3 BUFBHSP-2 BUFAL SP-1 BUFAH2009-8-30中南大学信息院电气工程系SP43MOV AX,OFFSET ARY1 F SP-10 PUSH AX BP SP-E MOV AX,SIZE ARY1 CX SP-C PUSH AX BX SP-A CALL FAR PTR PADD MOV AX,OFFSET ARY2 IP SP-8 PUSH AX CS SP-6 MOV AX,SIZE ARY2 SP-4 SIZE1 PUSH AX CALL FAR PTR PADD SP-2 ARY1 RET MAIN ENDP SP MCODE ENDS PCODE SEGMENT ASSUME CS: PCODE,DS:MDATA,SS:MSTACK PADD PROC FAR PUSH BX PUSH CX PUSH BP MOV BP,SP PUSHF2009-8-30中南大学信息院电气工程系45MOV MOV MOV NEXT: ADD DAA MOV MOV ADC DAA MOV MOV INC LOOP MOV POPF POP POP POP RET PADD ENDP PCODE ENDS 2009-8-30 END STARTCX,[BP+10] BX,[BP+12] AX,0 AL,[BX] DL,AL AL,0 AL,AH AH,AL AL,DL BX NEXT [BX],AX BP CX BX 4SP-10 SP-E SP-C SP-A SP-8 SP-6 SP-4 SP-2 SPF BP CX BX IP CS SIZE1 ARY1中南大学信息院电气工程系46子程序嵌套与递归调用5.3宏汇编和条件汇编汇编子程序嵌套的层数不限 以堆栈空间能够容纳为限 注意点: 寄存器的保护及恢复汇编子程序可以递归调用宏指令是源程序中一段独立的程 序段,首先对它进行定义,然后 就可用宏指令语句多次调用它 了. 宏指令的使用包括三个方面: 宏定义 宏调用 宏展开472009-8-30中南大学信息院电气工程系2009-8-30中南大学信息院电气工程系488宏定义宏调用指令使用前必须先进行宏定义 宏定义格式为:宏指令名 MACRO 形式参数,形式参数,… ………. <宏体> ………. ENDM经宏定义后的宏指令可以在源程 序中调用,宏调用格式为: 宏指令名 实参,实参 …宏调用需要有宏指令名 若宏定义中有形参,那么宏调用时 必须带有实际参数来替代形参,实 际参数的个数,顺序,类型与形参 一一对应,各个实参之间用逗号分 开.2009-8-30中南大学信息院电气工程系 50宏体:一段有独立功能的程序代码段. 形式参数:又称为哑元,各个哑元之间 用逗号隔开.2009-8-30中南大学信息院电气工程系 49宏展开例5-4不带参数的宏定义,用宏指令来实现将AL 中内容右移4位.宏定义: SHIFT MACRO MOV CL,4 SAR AL,CL ENDM 宏调用: SHIFT 宏展开: 将下段程序插入宏调用语句位置上. +MOV CL, 4 +SAR AL, CL51汇编程序在对源程序汇编 时,对每个宏调用作宏展 开,即用宏定义中的宏体取 代宏指令名,并用实参一一 对应代替形参(即实元取代哑 元),每条插入的宏体指令前 带上加号"+".2009-8-30中南大学信息院电气工程系2009-8-30中南大学信息院电气工程系52例5-5 宏调用中参数传递 宏定义带一个参数,用宏指令实现将AL中内 容右移任意次(<256)宏定义: SHIFT MACRO N MOV CL, N SAR AL, CL ENDM 宏调用1: SHIFT 3 宏调用2: SHIFT 17 宏展开1: +MOV CL, 3 ;AL中内容算术右移3次 +SAR AL, CL 宏展开2: +MOV CL, 17 ;AL中内容算术右移17次 +SAR AL, CL操作码的宏替换宏定义可用部分操作码作参数, 但在宏定义体中必须用"&"作分隔 符,&是一个操作符,它在宏定 义体中可作为哑元的前缀,宏展 开时,可以把&前后两个符号合 并成一个符号. 参看下面的例子:2009-8-30中南大学信息院电气工程系532009-8-30中南大学信息院电气工程系549例5-6操作码宏替换举例宏指令与子程序的区别宏定义: SJP MACRO X, Y, Z, W MOV AX, X C&W AX, Y J&Z NEXT ENDM 宏调用: 宏展开: SJP BX, SI, NZ, MP +MOV AX, BX +CMP AX, SI +JNZ NEXT中南大学信息院电气工程系 55都是一小段可以多次使用的程序:过程调用使用CALL语句,由CPU执 行,宏指令调用由宏汇编程序MASM中 宏处理程序来识别. 过程调用时,涉及工作现场保护和恢 复,执行速度慢.而宏指令调用时,不 需要堆栈操作,执行速度快. 子程序占有空间小,节省内存空间.而 宏调用目标代码长度长,占内存空间 多. 宏指令可以带哑元,调用时可以用实元 取代,使不同的调用完成不同的操作, 灵活性方面超过子程序.2009-8-30中南大学信息院电气工程系 562009-8-30条件汇编条件伪操作语句清单条件汇编是对给定的条件进行测 试,汇编程序根据测试结果,将 一段程序嵌入源程序汇编或不进 行汇编,它的一般格式为:IF条件 (表达式) (指令体1) ;条件为真汇编指令体1 ELSE (指令体2) ;条件为假汇编指令体2 ENDIF2009-8-30中南大学信息院电气工程系 57语句IF IFE IFDEF IFNDEF IFB IFNB IFIDN IFDIF条件说明表达式 表达式 符号 符号 参数 参数 字符串1,字符串2 字符串1,字符串2表达式的值不等于0,条件满足 表达式的值等于0,条件满足 符号已定义或被说明为外部符号,条件满足 符号未定义或未通过外部说明,条件满足 参数为空,条件满足 参数不为空,条件满足 字符串1和字符串2相同,条件满足 字符串1和字符串2不相同,条件满足2009-8-30中南大学信息院电气工程系58例:条件汇编GOTO MACRO L, X, REL, Y IFB <REL> JMP L ELSE 宏调用: GOTO LOOP, SUM, NZ, MOV AX, X 15 CMP AX, Y ::: J& REL L GOTO EXIT ENDIF 宏展开: +MOV AX, SUM ENDM+CMP AX,15 +JNZ LOOP ::: +JMP EXIT2009-8-30中南大学信息院电气工程系5910。

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

INT
COSEG
21H
ENDS END START
第三节 分支程序
计算机可根据不同条件进行逻辑判断,从而选择不同 的程序流向。程序的流向是由 CS和 IP决定的,当程序 的转移仅在同一段内进行时,只需修改偏移地址 IP的 值;如果程序的转移是在不同的段之间进行,则段基 址 CS和偏移地址 IP均需要修改。 转移指令分为无条件转移指令和条件转移指令。 在进行分支程序设计时,首先要根据处理的问题用比 较、测试的方式,或者用算术运算、逻辑运算使标志 寄存器产生相应的标志位,根据转移条件选择转移指 令。
INC INC DEC JNZ
BX BX CX LOP ; ;控制部分
修改部分
MOV YY,AX MOV AH,4CH INT CODE ENDS 21H
END
START
一.循环的基本结构
1.先执行,后判断结构
流程图如右:
入口
初始化部分
循环体
修改部分
N
循环 结束? Y 出口
例2. 编程统计数据块中正数的个数,
Y
RS END (DX)
DATA
SEGMENT
D1
COUNT RS DATA CODE
DB,-1,-3,5,7,-9,·,-6 · ·
EQU DW ENDS SEGMENT ASSUME CS:CODE,DS:DATA $-D1 ?
START:
MOV
AX,DATA
MOV
MOV MOV MOV
DS,AX
JMP JUS2
BIGD: JG JUS1 ;x>0转移 ;x=0
MOV AL, 0
JMP
JUS1: JUS2:
JUS2
;x>0
MOV AL, 1 MOV YY, AL MOV AH, 4CH INT 21H
CODE
ENDS
END START
例2. 数据块搬移程序 程序要求把内存中一数据块(源数据块)传送到内存的另一 存储区(目标数据块)。为了程序的通用性,应考虑以下三种 情况: (1)两块分离 (2)两块重叠,源数据块首址<目标数据块首址 (3)两块重叠,源数据块首址>目标数据块首址 根据图示三种情况分析,可得出以下规律:
当源数据块首址>目标数据块首址:从数据块首地址开始传送。
当源数据块首址<目标数据块首址:从数据块末地址开始传送。
(1)两块分离
(2)两块重叠
(3)两块重叠
源数 据块
• • • • • •
源数 据块
目标 数据 块 目标数 据块 源数 据块
目标 数据 块
传送方向任意
源数据块首址<目标 数据块首址。传送从 数据块末地址开始
例4. 编程计算 C ai bi a1 b1 a2 b2 a3 b3 a4 b4
i 1 4
设aibi为 8位无符号数,运算结果不超过 16位二进制数。 解: BUFA中存放a1,a2,a3,a4, BUFB 中存放b1,b2,b3,b4,存 储单元 C中放结果。SI 放 BUFA偏移地址,DI 放 BUFB偏 移地址,CX 作计数器。 流程图及程序如下:
DW a11,a12,·a20 · ·
YY
DATA CODE
DW?
ENDS SEGMENT ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA MOV MOV DS,AX AX,0
MOV
MOV
BX,OFFSET TABL
CX,20 ;
初始化
LOP:
ADD
AX,[BX]
; 循环体
1.分析问题,建立数学模型
2.确定算法
3.编制程序流程图
4.编制程序
5.调试程序
一个源程序的基本格式如下: DATA SEGMENT
• • •
;存放数据项的数据段
DATA EXTRA
ENDS SEGEMNT
• • •
;存放数据项的附加段
EXTRA STACK1 STACK1 CODE
ENDS SGMEN PRA STACK •
DW
ENDS

SEGMENT PARA STACK ENDS SEGMENT
ASSUME CS:COSEG
ASSUME DS:DATA ASSUME SS:STACK1 START: MOV AX , DATA
MOV MOV ADD MOV
DS , AX DX,VARX DX,VARY CL , 3 ;DX ;DX X X+Y
(2)程序流程图和程序如下:
(X+Y)*8-X = 2
开始
预置段寄存器 DX X DX (DX)-X DX左移3次 (X+Y)*8
DX X+Y
DX右移得
((X+Y)*8-X)/2
RESULT DX 结束
DATA VARX VARY
SEGMENT DW 0006H DW 0007H
RESUL
DATA SACK1 SACK1 COSEG
COSEG
SEGMENT
ASSUME CS:COSEG, DS:DATA, SS:STACK1
START: MOV
AX, DATA
MOV
MOV MOV
DS, AX
AH, 0 AL, XX
MOV
ADD MOV MOV MOV
BX, OFFSET TABLE
BX, AX AL, [BX] YY, AL AH, 4CH
源数据块首址>目标 数据块首址。传送从 数据块首地址开始
程序流程图如下:
START
预置段R
SI 源数据块首址 DI 目标数据块首址 CX 传送字节数
N
SI SI+CX-1 DI DI+CX-1 (DI) (SI)
SI>DI?
Y
(DI) (SI)
SI SI-1 DI DI-1 CX CX-1
SI SI+1 DI DI+1 CX CX-1
BX,OFFSET D1 CX,COUNT DX,0
LOP1:
MOV CMP JLE INC
AL,[BX] AL,0 JUSTI DX BX CX LOP1
JUSTI:
INC DEC JNZ
MOV
MOV INT CODE ENDS END
RS,DX
AH,4CH 21H
START
2.先判断,后执行结构
INT CODE ENDS END START 21H
第二节 顺序结构程序
例1 编制程序,求下列公式中的Z值,并将结果存放 到RESULT单元中。
Z
设X,Y的值分别存放在VARX,VARY单元中, 运算结果不超过16位。 解:(1)存储单元 RESULT 用来存放结果,VARX 和 VARY 放 X、 Y的值。寄存器 DX 放中间运算结果,左移 1 位相当于乘 2,右 移 1 位相当于除 2,所以可以用左移 3 位得到乘以 8 的结果。
N
CX=0?
CX=0?
END
N
Y
Y
编程如下: DATA DA SEGMENT DB 200 DUP (‘1,2,3,4,5’)
DA1
DA2
EQU
EQU
DA+10H
DA+50H 50
COUNT EQU DATA STACK1 ENDS
SEGMENT PARA STACK
DW
STACK1 COSEG
20H
ENDS
DUP (0)
SEGMENT ASSUME CS:COSEG,DS:DATA
ASSUME
SS:STACK1
MOVE:
MOV AX,DATA
MOV DS,AX MOV CX,COUNT MOV SI,OFFSET DA1 MOV DI,OFFSET DA2 ;源串首偏址 SI ;目标串首偏址 DI
1 x>0 其中 x为8位有符号数 y= 0 x=0 -1 x<0 开始 解:设 x的值放在 XX单元中, y的值放在 YY单元中。寄存器
选用 AL存放中间结果。 预置段R AL X N AL>0 N AL -1 AL 0 Y AL 结束 Y AL>0 Y AL 1
例1. 符号函数
流程图及程序如下:
a
i 1
20
i
设 a1,a2,·a20是一组无符号十六位二进制数,并设其 · · 和不大于2个字节 。 解:定义数组名TABL存放 a1~a20;和存放于单元YY中。 中间结果存于寄存器AX中。BX寄存器为地址指针, CX寄存器作计数器。 程序如下
DATA
TABL
SEGMENT
DW a1,a2,·a10 · ·
DATA XX YY
SEGMENT DB DB x ?
DATA
CODE
ENDS
SEGMENT ASSUME CS:CODE, DS:DATA
START: MOV AX,DATA MOV DS, AX
MOV AL, XX
CMP JGE MOV AL, 0 BIGR AL,-1 ;x-0建标志位 ;x> 0转移 ;x<0
START
预置段R SI 0 DI 0 C 0 CX 4 AX 0 C=C+ai*bi
SI SI+1 DI DI+1
N CX-1=0? Y END
入口
流程图如右
初始化部分
循环 结束?
N 循环体
Y 出口
修改部分
例3. AX寄存器中有一个 16位的二 进制数,编程统计其中值为 1的位的 个数,并将结果存于CX中。
相关文档
最新文档