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

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

13
5.2.6 汇编语言的属性运算符表达式
名 称 格 式 功 能
取地址运算符 取类型运算符 取变量长度运算符 取变量总字节数运 算符 SEG 变量或标号 TYPE 变量或标号 LENGTH 变量 SIZE 变量 返回变量或标号的段地址 返回变量或标号的类型值 返回变量的长度(即变量中元素的 个数) 返回变量所包含的总字节数
;COUNT过程 ;将循环的次数送入CX ;将数组中的各元素与0比较 ;结果为0时转移到ZERO处 ;结果为正时转移到ZHENG处 ;统计负数的个数 ;转移到NEXT处 ;统计0的个数 ;统计正数的个数 ;SI的内容加1 ;执行循环 ;返回子程序调用处
5.3 汇编程序设计的基本方法
5.3.1 汇编程序设计的一般步骤
5.2.4 汇编语言的常数和表达式
1.常数 数值常数 字符串常数 2.表达式
汇编语言中的表达式分为数字表达式和地址表达式两种。
表达式是由操作数和运算符组成的。
表达式中 的运算符 例如,LEA SI,COUNT+5 MOV AL, 0ABH AND 0FH MOV AX,NUM GT 100
功能:与EQU的功能相同,但“=”可以对同一标识符进行重新定义
标号定义伪指令 格式:变量或标号 LABEL 类型 功能:定义或修改变量或标号的类型
例如,COUNT LABEL BYTE DB 10
3.段定义伪指令 SEGMENT和ENDS伪指令 格式:段名 SEGMENT [定位类型] [组合类型] [类别] …… 段名 ENDS 功能:对段的结构进行定义 ASSUME伪指令 格式:ASSUME 段寄存器:段名 [,…,段寄存器:段名] 功能:指明段寄存器与各段之间的对应关系
5.2.6 汇编语言的属性运算符表达式
名 称 格 式 功 能
类型运算符 类型 PTR 变量、标号或表达式 对已定义的变量、标号或表 达式,临时转换其类型
类型定义运算符
段超越前缀 取高字节运算符 取低字节运算符 短转移运算符
变量或标号 EQU THIS 类型
指定变量或标号的类型
段寄存器名:变量、标号或地址 给变量、标号或地址表达式 表达式 临时指定一个段属性 HIGH 变量或标号 LOW 变量或标号 SHORT 标号 分离出变量或标号对应的运 算对象的高字节 分离出变量或标号对应的运 算对象的低字节 说明转移指令中的转移为短 转移 COUNT EQU THIS BYTE
【例5-4】 DATA DB 'AB CD'的内存单元 分配情况
2.符号定义伪指令 赋值伪指令 格式:标识符 EQU 表达式 功能:用一个标识符来表示表达式的值,但并不为其分配内存单元
例如,COUNT EQU 10 NUM EQU TAB[BX+3]
等号伪指令 格式:标识符=表达式
例如,COUNT=10 COUNT=COUNT+1
.EXE可执行 文件
连接程序 LINK
.OBJ目标 程序文件
.MAP映像 文件
.LIB库 文件
实训5-1 显示26个小写英文字母
要想将26个小写英文字母在屏幕上显示出来,首先将第 一个小写英文字母a的ASCII码值存入存储单元A,然后通过 一个循环,将26个字母逐个显示出来。为此,我们应预先设 置循环次数(即字母个数),每执行一次循环,A中的值 (即要显示字符对应的ASCII码值)都应增加1。
2.伪指令助记符
汇编时不产生机器码,也不产生任何操作 不使CPU产生动作、在程序执行前由汇编程序处理的说明性 语句,例如,数据说明、变量定义等等。 3.其他助记符 如标号、常量、变量和表达式等
5.2.3 汇编语言的语句格式
指令语句的格式为 [标号:]指令助记符 [操作数,操作数][;注释] 伪指令语句的格式为 [名字] 伪指令助记符 [操作数,…,操作数] [;注释] 相同点:(1)标号和名字 (2)助记符 (3)操作数 (4)注释 各部分之间至少要用一个空格作为间隔。 不同点: 在形式上:带不带冒号,是否可转向它 在本质上:汇编时能否形成对应的机器码
DSEG SEGMENT NUM1 DB 12H NUM2 DB 34H,56H,78H NUM3 DB ? DSEG ENDS 常用数据定义伪指令
设本段的段基址为1000H
内存 单元 分配 情况
【例5-2】 COUNT DW 1122H,3344H的 内存单元分配情况
【例5-3】 DB 100 DUP (?) 的功能是: 分配100个字节的内存单元。
COUNT PROC NEAR MOV CX, 6 LOP: CMP ARRAY[SI], 0 JZ ZERO JNS ZHENG ADD NUM[2], 1 JMP NEXT ZERO: ADD NUM[1], 1 JMP NEXT ZHENG: ADD NUM, 1 NEXT: INC SI LOOP LOP RET COUNT ENDP CSEG ENDS END START
5.3.3 分支结构程序设计
1.双分支结构
IF THEN结构 IF THEN ELSE结构
2.多分支结构
CASE结构
3.跳转表
在内存的一个连续区域中,依次存放完成各功能的分支子程 序的首地址,构成一个跳转表。通过计算存储单元的偏移地址, 获得对应的分支子程序的首地址,从而转去执行对应的子程序。
第5章 汇编语言程序设计
本章内容提要
5.1 汇编语言程序的编辑、汇编、连接和调试
5.2 汇编语言入门 5.3 汇编程序设计的基本方法 5.4 高级汇编程序设计
5.1 汇编语言程序的编辑、汇编、连接 和调试
.LST列表 文件 .ASM源程序 文件
源程序 编辑器 EDIT
汇编程序 MASM
.CRF交叉 引用文件
源程序
DSEG SEGMENT ;数据段,定义变量,分配存储空间 A DB 97D DSEG ENDS SSEG SEGMENT STACK ;堆栈段 DB 100 DUP (?) SSEG ENDS CSEG SEGMENT ;代码段 ASSUME CS: CSEG, DS: DSEG, SS: SSEG START: MOV AX, DSEG ;给数据段寄存器装初值 MOV DS, AX MOV CX, 26D ;将循环计数值存入CX MOV DL, a ;将字母a的ASCII码存入DL NEXT :MOV AH, 02H ;显示字符 INT 21H INC A ;A中的值加1 MOV DL, A LOOP NEXT ;执行循环 MOV AH, 4CH ;系统功能调用,结束程序返回DOS INT 21H CSEG ENDS END START
5.2 汇编语言入门
5.2.1 汇编语言概述
采用字母、符号等来表示机器指令的二进制代码,这就是 汇编语言。 用汇编语言编写的程序称为汇编语言源程序。 将汇编语言源程序翻译成机器语言的过程称为汇编。
5.Βιβλιοθήκη Baidu.2 汇编语言中的助记符
1.指令助记符 汇编时被转换成二进制的指令代码,每一条指令代码 都对应着CPU的一种操作 使CPU产生动作、并在程序执行时才处理的语句,就是第3章 学习的处理器指令。
取偏移地址运算符 OFFSET 变量或标号 返回变量或标号的偏移地址
例如,MOV AX, SEG COUNT MOV SI, OFFSET COUNT MOV AX, TYPE COUNT COUNT DW 100 DUP(1),LENGTH COUNT BUFF DD 1, 2, 3,LENGTH BUFF COUNT DW 100 DUP(1),SIZE COUNT
CSEG SEGMENT ;代码段 ASSUME CS: CSEG, DS: DSEG, SS: SSEG START: MOV AX, DSEG ;将数据段基址装入数据段寄存器 MOV DS, AX MOV SI, 0 ;将SI的初值置为0 CALL COUNT ;调用COUNT子程序 ADD NUM[2], 30H ;将负数的个数转换为ASCII码 MOV DL, NUM[2] ;DOS功能调用,显示负数的个数 MOV AH, 02H INT 21H MOV AH, 4CH ;系统功能调用,结束程序返回DOS INT 21H
5.2.5 汇编语言的标号和变量
1.标号 标号是指令语句的标识符,用来表示该指令所在内存单 元的地址。 标号的属性:段地址、偏移地址、类型 2.变量 变量主要用来定义存放在存储单元中的数据。
变量的定义格式为:
变量名 变量名 变量名 变量名 变量名 DB 表达式 DW 表达式 DD 表达式 DQ 表达式 DT 表达式 ;定义字节变量 ;定义字变量 ;定义双字变量 ;定义8字节变量 ;定义10字节变量
变量的属性:段地址、偏移地址、类型、长度、大小
标号:是一条指令语句的符号地址。在汇编源程序中,只有在 需要转向一条指令语句时,才为该指令语句设置标号,以便在 转移类指令(含子程序调用指令)中直接引用这个标号。因此, 标号可作为转移类指令的操作数,即转移地址。 标号的三种属性: ①段值:所在段的段地址,总是在CS段寄存器中; ②偏移量:与变量相同,所在段的段内偏移地址; ③类型:分NEAR和FAR两种。
例如,MOV AX, WORD PTR COUNT MOV AX, ES:[1000H] DATA EQU 1234H,MOV AL, HIGH DATA DATA EQU 1234H,MOV AL, LOW DATA
5.2.7 常用伪指令
1.数据定义伪指令 格式:变量 数据定义伪指令 表达式 功能:为数据分配存储单元 【例5-1】 数据段DSEG由以下 语句组成:
实训5-2 统计一组数据中正数、零和负数的 个数
统计一组数据中正数、零和负数的个数,并将负数的个 数在屏幕上显示出来。 源程序
DSEG SEGMENT ARRAY DB 5,3,-4,0,-5,-3 NUM DB 0,0,0 DSEG ENDS SSEG SEGMENT DB 100 DUP(0) SSEG ENDS ;数据段,给变量指定数据,分配存储空间 ;定义一个数组 ; NUM中用于存放正数、零和负数的个数 ;堆栈段
例如,ASSUME CS:CSEG,DS:DSEG,SS:SSEG
4.过程定义伪指令 格式:过程名 PROC [类型] …… RET 过程名 ENDP 功能:标识一个执行特定功能的代码块(又称为子程序) 5.结束伪指令 格式:END [标号] 功能:汇编程序结束
5.2.8 汇编语言源程序的结构
汇 编 语 言 源 程 序 的 基 本 框 架
1.分析问题,确定算法 2.画出程序流程图
起止框
处理框
判断框
连接框
流程线
3.编写源程序 4.调试程序
5.3.2 顺序结构程序设计
程序设计的基本方法有三种,分别是:顺序结构程序设计方法、 分支结构程序设计方法和循环结构程序设计方法。 顺序结构是最简单、最基本的程序结构,它是按照指令在程 序中排列的先后顺序逐条执行的。顺序结构程序的流程图中只有 一个起始框和一个结束框。
提示:每一个变量定义后都具有此三种属性,设置变量名 是为了方便存取它指示的存储单元。
12
例:测试为0或1
若要检测AL中的最低位是否为1,若为1则转移。 test al,01h;测试AL的最低位D0 jnz next ;标志ZF=0,即D0=1 ;则程序转移到there ... ;否则ZF=1,即D0=0,顺序执行 next: ...
NEAR—表示标号所在语句与转移指令或调用指令在同一码段内, 只需改变IP即可。 FAR—标号所在语句与转移指令或调用指令不在同一码段内。 若没有对类型进行说明,默认为NEAR。
11
变量:表示数据初值表中第一个数据的偏移地址,在程序中作为 存储器操作数使用 ,变量名由用户自定义。如前面例子中的 BLOCK、BUF等,一般在数据段中定义。 由于汇编语言中存储单元是分段使用的,所以变量具有三种属 性: ①段 值—变量定义所在段的段地址。 ②偏移量—变量所指的单元地址与段起始地址之间的位移量 ③类型 — 有字节( byte )、字 (word) 和双字 (double word) 等。
相关文档
最新文档