第4章 汇编语言程序格式  汇编程序功能  伪操作  汇编语言程序格式  汇编语言程序的上机过程

Slides:



Advertisements
Similar presentations
第1章第1章 PC/AT 系統 1 Chapter 1 Chapter 1 PC/AT 系統 001.
Advertisements

第一章 计算机基础知识 计算机的发展简史 1 计算机软件系统 6 计算机的定义和分类 2 微型计算机的组成 7 计算机的特点和用途 3
输入输出程序设计 输入输出的基本概念 无条件方式输入输出 查询方式输入输出 中断方式输入输出.
计算机体系结构 应用程序 软件 操作系统 编译器 固件 指令集 输入输出 CPU 硬件 内存 (I/O) 集成电路 元件,逻辑门.
汇编语言程序设计 吴 向 军 中山大学计算机科学系
微型计算机技术 教 学 指 导(七) 太原广播电视大学 郭建勇.
第10章 DOS功能调用与BIOS中断调用.
第7章 8086/8088汇编语言程序设计 7.1 引言 7.2 顺序程序设计 7.3 分支结构程序设计 7.4 循环结构程序设计
第四章 汇编语言 程序设计 任课教师:王晓甜
大连理工大学软件学院 软件工程系 赖晓晨 计算机组成与结构 大连理工大学软件学院 软件工程系 赖晓晨
第一章 计算机基础知识 第一节 计算机概述 一、计算机的基本组成和工作原理 二、有关术语 三、计算机发展简史 四、微型计算机概述
汇编语言与接口技术 教师:范新民.
输入/输出及接口 输入/输出的传送方式 中断技术 80x86/Pentium中断系统 8259A可编程中断控制器 中断程序设计
本周实验安排 实验内容:(P231)人名排序的例子。
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年10月30日.
第2章 高级编程的硬件基础 主要内容 计算机硬件组成 80x86微机系统 Turbo C编译方式 BIOS和DOS调用.
第3章 80x86汇编语言程序设计(下).
4.1 汇编语言 4.2 顺序结构程序 4.3 分支程序设计 4.4 循环程序设计 4.5 子程序设计
第3章 80x86汇编语言程序设计(上) 16位汇编版本 时间不够的情况下只讲16位汇编.
9.1 可编程并行输入/输出接口芯片8255A 9.2 可编程计数器/定时器 可编程串行输入/输出接口芯片8251A
3.3.5 程序控制指令 控制转移指令分为: 转移指令 循环控制指令 调用和返回指令 中断指令.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月26日.
第7章 中断与异常.
第5章 循环与分支程序设计  循环程序设计  分支程序设计.
汇编语言程序设计 Assembly Language Programming
第三章 寻址方式与指令系统 3.1 寻址方式 一条指令通常由两大部分构成: 操作码 操作数
微机原理与接口技术 第3章 8086指令系统 朱华贵 2015年09月25日.
第6章 DMA传输 6.1 DMA传输原理 6.2 DMA控制器8237A A的编程使用 欢迎辞.
第2章 MCS-51单片机指令系统与汇编语言程序设计
微机原理与接口技术 第2章 8086系统结构 朱华贵 2015年09月17日.
汇编语言程序设计 吴 向 军 中山大学计算机科学系
第九章 计数器和定时器电路 第一节 概述 第二节 Intel 8253的控制字 第三节 Intel 8253的工作方式 第九章 计数器和定时器电路 第一节 概述 第二节 Intel 8253的控制字 第三节 Intel 8253的工作方式 第四节 Intel 8253在IBM PC机上的应用.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年12月10日.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月05日.
单片机原理与应用 C/C++在现代数字计算机上的实现.
输入输出与中断 主要内容 CPU与外设之间数据传送方式 中断技术 8086中断系统和中断处理.
第八章 输入输出程序设计 总线 CPU MEM I/O接口 I/O设备.
第4章 汇编语言程序设计 4.1 程序设计语言概述 4.2 汇编语言的程序结构与语句格式 4.3 汇编语言的伪指令
微机原理及应用 主讲:谢维成 西华大学 电气信息学院 1.
基本的”防”黑客技术 Basic” ” Hacker Technique
微机原理及应用 主讲:郑海春.
第一章 8086程序设计 第二章 MCS-51程序设计 第三章 微机基本系统的设计 第四章 存贮器与接口 第五章 并行接口
汇编语言程序设计课程设计 第二次实验 DEBUG基本命令与算术运算指令
微型计算机原理及应用.
第3章 微型计算机输入输出接口 3.1 输入/输出接口 3.2 输入输出数据传输的控制方式 3.3 开关量输入输出接口 欢迎辞.
第六章 子程序结构 §6.1 子程序的设计方法 §6.2 嵌套与递归子程序 §6.3 子程序举例 §6.4 DOS系统功能调用.
1.3 微型计算机的结构和工作原理.
第 13 章 中断系统.
第九章 高级宏汇编语言 9.1 结构 结构就是将逻辑上有一定关系的一组数据,以某种方式组合在一起所形成的数据形式。
第5章 循环与分支程序设计 学习目标: 了解并掌握循环程序的构造方法,尤其是对循环控制条件的设置以及可能出现的边界情况的考虑。掌握起泡排序算法这种多重循环程序设计中的常用方法。交换标志位的设置在此算法中更能提高效率。学会在数组排序算法中采用折半查找法来提高查找效率。学会使用跳跃表法实现CASE结构。
4.1 汇编语言程序格式 4.2 MASM中的表达式 4.3 伪指令语句 4.4 DOS系统功能调用和BIOS中断调用
3.4.5 控制转移指令(Control transfer instructions) (一)、控制转移指令概述
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月19日.
第五章:输入输出基本技术 主讲教师:范新民.
第4章 汇编语言程序格式  汇编程序功能  伪操作  汇编语言程序格式  汇编语言程序的上机过程.
第10章 可编程外围接口芯片8255A及其应用 10.1 概述 A的工作原理 A的应用举例.
习题3 1、 分别说明下列指令的原操作数和目的操作数各采用什么寻址方式。 设定如下: ①立即寻址 ② ① ②寄存器寻址
第 3 章、組合語言 作者:陳鍾誠 旗標出版社.
第九章 BIOS和DOS中断 在存储器系统中,从地址0FE000H开始的8K ROM(只读存储器)中装有BIOS(Basic Iuput /output System)例行程序。驻留在ROM中的BIOS给PC系列的不同微处理器提供了兼容的系统加电自检,引导装入,主要I/O设备的处理程序以及接口控制等功能模块来处理所有的系统中断。使用BIOS功能调用,给程序员编程带来很大方便,程序员不必了解硬件操作的具体细节,直接用指令设置参数,然后中断调用BIOS中的子功能,所以利用BIOS功能编写的程序简洁,可读性好,
第2章 80x86计算机组织  计算机系统  存储器  中央处理机  外部设备.
《微型计算机原理与接口技术》 第4版 王良 宁德师范学院 吴宁 乔亚男 编著 清华大学出版社 出版
第5章 循环与分支程序设计  循环程序设计  分支程序设计.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年12月17日.
第八章 中断系统.
微机原理与接口技术 微机原理与接口技术 朱华贵 2015年11月06日.
第6章 子程序结构 在程序设计中,我们会发现一些多次无规律重复的程序段或语句序列。解决此类问题一个行之有效的方法就是将它们设计成可供反复调用的独立的子程序结构,以便在需要时调用。在汇编语言中,子程序又称过程。 调用子程序的程序称为主调程序或主程序。 2019/7/20 ch6.
微机原理与接口技术 第5章 汇编语言程序设计 西安邮电大学计算机学院 王 钰.
大数据搜索挖掘实验室 第五章 子程序设计 张华平 副教授 博士 Website: 大数据搜索挖掘实验室
第4章 MCS-51汇编语言程序设计 教学基本要求: (1)、了解MCS-51汇编语言程序设计的特点;
第三章 8086的指令系统 8086指令特点 8086的寻址方式 8086的指令格式及数据类型 8086的指令集.
Presentation transcript:

第4章 汇编语言程序格式  汇编程序功能  伪操作  汇编语言程序格式  汇编语言程序的上机过程 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 第4章 汇编语言程序格式  汇编程序功能  伪操作  汇编语言程序格式  汇编语言程序的上机过程

4.1 汇编程序功能 汇编语言程序的建立及执行过程: 在计算机上运行汇编语言程序的步骤是: 4.1 汇编程序功能 汇编语言程序的建立及执行过程: . OBJ 文件 . EXE 文件 . ASM 文件 汇编程序 连接程序 编辑程序 MASM LINK Edit 等 在计算机上运行汇编语言程序的步骤是: 用编辑程序(任何一种文本编辑程序)建立ASM文件; 用MASM程序把ASM文件转换成OBJ文件; 用LINK程序把OBJ文件转换成EXE文件; 用DOS命令直接键入文件名就可执行该程序;

产生目标文件(.obj)和列表文件(.lst)。 展开宏指令。 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 汇编程序功能 汇编程序的主要功能: 检查源程序,给出出错信息。 产生目标文件(.obj)和列表文件(.lst)。 展开宏指令。

4.2 伪操作(伪指令) 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 伪操作是汇编程序对源程序进行汇编时处理的 处理器选择伪操作 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 4.2 伪操作(伪指令) 伪操作是汇编程序对源程序进行汇编时处理的 操作,(不像机器指令那样是程序运行期间由计算机来执行的)完成处理器选择、存储模式定义、数据定义、存储器分配、指示程序开始结束等功能。 处理器选择伪操作 段定义伪操作 程序开始和结束伪操作 数据定义及存储器分配伪操作 表达式赋值伪操作 地址计数器与对准伪操作 基数控制伪操作

4.2.1 处理器选择伪操作: 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 4.2.1 处理器选择伪操作: 这类伪操作一般放在程序的最前面,如不给出,则汇编程序默认值为 .8086。 .8086 选择 8086 指令系统 .286 选择 80286 指令系统 .286P 选择保护模式下的 80286 指令系统 .386 选择 80386 指令系统 .386P 选择保护模式下的 80386 指令系统 .486 选择 80486 指令系统 .486P 选择保护模式下的 80486 指令系统 .586 选择 Pentium 指令系统 .586P 选择保护模式下的 Pentium 指令系统

1) 段名 4.2.2 段定义伪操作: 1. 完整的段定义伪指令 段定义伪操作的格式: 4.2.2 段定义伪操作: 1. 完整的段定义伪指令 段定义伪操作的格式: 段名 SEGMENT [定位类型] [组合类型] [使用类型] [‘类别’] …… …… ; 语句序列 段名 ENDS 1) 段名 段名是为该段起的名字,用来指出汇编程序为该段分配的存储区起始位置。

2) 定位方式 (1)PARA:表示本段必须从能被16整除的地址处开始存放,即段起始地址最低四位必须是0。 (2)WORD:表示本段要从一个偶数地址处开始存放,即段起始地址的最低一位必须是0。 (3)BYTE:表示本段起始地址可以从任一地址处开始存放。 (4)PAGE:表示本段要从能被256整除的地址处开始存放,即起始地址的最低八位必须是0。 默认为 PARA

3) 组合方式 默认为 PRIVATE 组合方式有六种类型可供选择。 (1)PRIVATE 该段为私有段,在连接时将不与其他同名段合并 (2)PUBLIC 该段在连接时可以把不同模块的同名段相连接而形成一个段。 每一段从小段的边界开始,所以各段之间有小于16个字节的间隙。 (3)COMMON 该段在连接时可以把不同模块中的同名段重叠而形 成一个段,由于各同名段有相同的起始地址,所以会产生覆盖。 (4)STACK 把不同模块的同名段组合而成一个堆栈段。各段之间没有间隙。 (5) MEMORY 同PUBLIC (6)AT 表达式 使段地址是表达式所计算出来的16位值,CS除外。 默认为 PRIVATE

【例】有两个模块,各模块段定义如下 模块2: ┆ 模块1: DATA1 SEGMENT PARA PUBLIC ‘DATA1’ ┆ M2 DB 104H DUP(11H) DATA1 ENDS DATA2 SEGMENT PARA COMMON ‘DATA2’ N2 DB 105H DUP(0) DATA2 ENDS DATA3 SEGMENT T1 DB 50 DUP(20H) DATA3 ENDS END 【例】有两个模块,各模块段定义如下 模块1: ┆ DATA1 SEGMENT PARA PUBLIC ‘DATA1’ M1 DB 45H DUP(0) DATA1 ENDS DATA2 SEGMENT PARA COMMON ‘DATA2’ N1 DB 102H DUP(0) DATA2 ENDS END

该段的定位组合方式示意图如图所示。

在引号中给出连接时组成的段组的类型名。在连接后形成的装入模块中,可使相同类别的段位置靠在一起。 4) 使用类型 USE16 使用16位寻址方式 段长≤64K USE32 使用32位寻址方式 段长≤4G 5) 类别 在引号中给出连接时组成的段组的类型名。在连接后形成的装入模块中,可使相同类别的段位置靠在一起。

◆假定伪指令ASSUME 格式:ASSUME 段寄存器:段名 [,段寄存器:段名] 功能:建立段寄存器与段之间的对应关系。该伪指令一般出现在代码段中。 DATA1 SEGMENT A DB 1,2,3 DATA1 ENDS CODE SEGMENT ASSUME DS:DATA1,CS:CODE ┆ 其中段寄存器名必须是CS ,DS,ES 和SS(对于386 及后继机型还有FS 和GS)中的一个。段名必须是由SEGMENT定义的段中的段名。

◆ 段定义伪操作: 完整的段定义格式举例 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 data segment ; 定义数据段 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 ◆ 段定义伪操作: 完整的段定义格式举例 data segment ; 定义数据段 … data ends ;---------------------------------------- extra segment ; 定义附加段 extra ends code segment ; 定义代码段 assume cs:code, ds:data, es:extra start: mov ax, data mov ds, ax ; 段地址  段寄存器 code ends end start

安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 …… code segment main proc far assume …… start: push ds mov ax, 0 push ax ret main endp code ends end start …… code segment main proc far assume …… start: mov ax,4c00h int 21h main endp code ends end start

例:一个完整的段定义格式 例:一个完整的段定义格式 STACK SEGMENT STACK ; 定义堆栈段STACK ... ; 分配堆栈段的大小 STACK ENDS DATA SEGMENT ; 定义数据段 ... ; 定义数据 DATA ENDS CODE SEGMENT ‘CODE’ ;定义代码段 ASSUME CS:CODE,DS:DATA,SS:STACK START: MOV AX,DATA ; 程序开始 MOV DS,AX ... ; 程序代码 MOV AX,4C00H ; 程序终止,返回DOS INT 21H CODE ENDS ;代码段结束 ... ;子程序代码 END START ;汇编结束

2. 存储模型与简化段定义伪指令 前面介绍了完整的段定义格式,用完整段定义格式虽然可以控制段的各种属性,但程序员很少使用。现在的汇编程序提供了一种简化的段定义方式,它使定义段更简单、方便。具体形式如下: .MODEL SMALL ;定义存储模式 .STACK ;定义堆栈段 .DATA ;定义数据段 ... ;定义数据 .CODE ;定义代码段 .STARTUP ;程序起始点,并建立DS和SS内容 ... ;程序代码 .EXIT 0 ;程序结束点,返回DOS ... ;子程序 END ;汇编结束

存储模式与简化段定义伪操作 (1) MODEL 伪操作 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 存储模式与简化段定义伪操作 (1) MODEL 伪操作 .MODEL 存储模式 [,语言类型] [,操作系统类型] [,堆栈选项] 存储模式:tiny 所有数据和代码都放在一个段 .com(0100H) small 所有数据和代码各放在一个段 medium 代码使用多个段 ,数据合并一个段 compact 所有代码使用一个段 ,数据可放多个段 large 数据和代码都可用多个段 huge 数据和代码都可用多个段 ,数据段可超过64K flat 允许用32位偏移量,DOS下不允许。

① TINY:该存储类型是为编写COM文件类型而设置的。 ② SMALL:所有的数据变量必须在一个数据段之内,所有的代码也必须在一个代码段之内。在这种模型下,数据段寄存器的内容保持不变,所有转移也都是段内转移。 ③ MEDIUM:所有的数据变量必须在一个数据段之内,但代码段可以有多个。在这种模型下,数据段寄存器的内容保持不变,转移可以是段间转移。 ④ COMPACT:数据段可以有多个,但代码段只能有一。 ⑤ LARGE:数据段和代码段都可以有多个,但一个数组的字节数不能超过64KB。 ⑥ HUGE:数据段和代码段都可以有多个,一个数组的字节数也可以超过64KB。 ⑦ FLAT:只能在80386及其以后的计算机系统中运行。

SMALL存储模式 一般的程序都可用这种模式。在小型模式下,一个程序至多只能有一个代码段和一个数据段,每段不大于64KB。 这里的数据段是指数据段、堆栈段和附加段的总和,它们共用同一个段基址,总长度不可超过64KB;因此小模式下程序的最大长度为128KB。 访问操作数或指令都只需要使用16位偏移地址;这意味着诸如指令转移、程序调用以及数据访问等都是近属性(NEAR),即小型模式下的调用类型和数据指针缺省分别为近调用和近指针。

.model small .stack 100H .data …… .code .startup .exit 0 end

.MODEL 存储模式 [,语言类型] [,操作系统类型] [,堆栈选项] 语言类型说明可使汇编语言程序与其它语言程序达到共享的目的。所有有效的语言类型可以是C、BASIC、FORTRAN等。 操作系统类型说明程序运行于哪个操作系统之下,OS_DOS该选项的缺省值。 堆栈选项类型的值有二个可选值:NEARSTACK和FARSTACK。其中:NEARSTACK是该选项的缺省堆栈类型。 NEARSTACK——堆栈段和数据段是同一段; FARSTACK——堆栈段和数据段是不同的段,且堆栈不在段组DGROUP中。 例如: . MODEL  SMALL,C,OS_DOS,FARSTACK

简化的段定义伪操作 .code [name] .data .data? .fardata [name] 默认名:FAR_DATA .fardata? [name] 默认名:FAR_BSS .const .stack [size] 默认为1KB

汇编语言提供7种标准段,通常在编写一个独立的汇编程序时定义以下三个标准段: . STACK [大小] ;堆栈段 它的参数指定堆栈段所占存储区的字节数,默认是1KB。 . DATA ;数据段 它用于定义具有初值的变量,当然也允许定义无初值的变量。无初值变量可以安排在另一个段中,它用.data?伪指令创建。 .CODE [段名] ;代码段 它的参数指定该代码段的段名。如果没有给出段名,则采用默认段名。

简化段定义伪指令指明一个逻辑段的开始,同时自动结束前面的一个段,不用ENDS作为段结束符。 采用简化段定义伪指令前,需有.MODEL存储模式语句。 使用简化段定义,各段名称和其他用户所需的信息可以使用MASM预定义符号,例如: @data表示由.data等定义的数据段的段名。 例:简化段定义 . MODEL SMALL . STACK 100H . DATA …… . CODE START: MOV AX,@DATA MOV DS,AX MOV AX,4C00H INT 21H END START

安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 .model small .data …… .code start: mov ax, @data mov ds, ax mov ax, 4c00h int 21h end start .model small .data …… .code .startup .exit 0 end .model small .const …… .data .code start: mov ax, DGROUP mov ds, ax mov ax, 4c00h int 21h end start

3. 段组定义伪操作 格式:段组名 GROUP 数据段名1[,数据段名2……] 3. 段组定义伪操作 格式:段组名 GROUP 数据段名1[,数据段名2……] 功能:汇编程序把各数据段组成一个段组,以便程序在访问各数据段时使用一个数据段寄存器DS。如: data1 segment ︰ data1 ends data2 segment data2 ends datagroup group data1,data2 code segment assume cs:code,ds:datagroup start:mov ax,datagroup mov ds,ax

安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 dseg1 segment word public ‘data’ …… dseg1 ends dseg2 segment word public ‘data’ dseg2 ends datagroup group dseg1, dseg2 cseg segment para public ‘code’ assume cs:cseg, ds:datagroup start: mov ax, datagroup mov ds, ax mov ax, 4c00h int 21h cseg ends end start

安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 data1 segment word const1 dw 100 data1 ends   data2 segment word var1 dw ? data2 ends datagroup group data1,data2 code segment assume cs:code, ds:datagroup mov ax, datagroup mov ds, ax   mov ax, const1 mov var1, ax … mov ax, 4c00h int 21h code ends end start

4.2.3 程序开始和结束伪操作 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 TITLE text ;指定列表文件每页打印的标题 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 4.2.3 程序开始和结束伪操作 TITLE text ;指定列表文件每页打印的标题 NAME module_name ;指出模块的名字 END [ label ] ;表示源程序结束,label 指示程序 ;开始执行的起始标号 . STARTUP ;定义程序的入口点 . EXIT [ return_value ] ;退出程序并返回操作系统 ;return_value常用0作返回值 可以 没有

在汇编程序MASM中,提供了二组简化的代码伪指令: .STARTUP 和 .EXIT。 .STARTUP——在代码段的开始,用于自动初始化寄存器DS、SS和SP; .EXIT——用于结束程序的运行。 .model small .data …… .code start: mov ax, @data mov ds, ax mov ax, 4c00h int 21h end start .model small .data …… .code .startup .exit 0 end

4.2.4 数据定义及存储器分配伪操作: 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 4.2.4 数据定义及存储器分配伪操作: [变量名] 助记符 操作数 [ , 操作数 , … ] [ ; 注释] 变量名必须是一个合法的标识符,它可以写,也可以不写; 助记符用于确定内存单元的数据类型,如: DB(字节)、DW (字) 、DD (双字) 、DF(6字节)、DQ(四字)、DT(10字节)。 操作数是定义内存单元时的初值表达式,一个定义语句可以有多个初值表达式,各表达式之间必须用逗号‘,’分开;如果某个存储单元没有初值表达式,则必须用一个问号‘?’来表示; 在定义语句的后面可以书写注释内容,也可以不写。

例:1 DATA_BYTE DB 10,4,10H,? DATA_WORD DW 100,100H,-5,? 0AH 04H 10H 64H 00H 01H FBH FFH DATA_BYTE  DATA_BYTE DB 10,4,10H,? DATA_WORD DW 100,100H,-5,? DATA_WORD  注:“?”表示保留存储空间但不存入数据

【例】 DATA1 DB 10,4,10H DATA2 DW 100,100H,-5 DATA3 DD 3*20,0FFFDH DATA1 0 4 4 1 0 10h DATA2 6 4 0 0 0 0 0 1 F B F F DATA3 3 C 0 0 0 0 0 0 F D F F 0 0 0 0

安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 例 ARRAY  48H 45H 4CH 4FH 41H 42H ARRAY DB ‘HELLO’ DB ‘AB’ DW ‘AB’ DW1  78H 56H 34H 12H 43H CDH ABH DW2  例:3 DW1 DD 12345678H DW2 DD 0abcd1243H 例2图 例3图

◆重复说明符DUP repeat_count DUP (表达式, 表达式, …, 表达式)

例: BUF1 DB 2 DUP(0,1,2,?) BUF2 DB 100 DUP(?) BUF1→ BUF2→ 100个字节 0 0 0 1 0 2 ----- 0 0 0 1 0 2 ----- BUF2→ ----- … 100个字节 -----

从上面的例子可看出:用DUP说明内存变量相当于在高级语言中定义数组。 例如: BUFFER DB 100 DUP(?) STRING DB 120 DUP('ABCDE'), 0 DB 2 DUP (0,2 DUP(1,2),3) DATA1 DW 50 DUP(10H, 20 DUP(1,2,3), 20H) POINTS DD 12, 30 DUP(0) 从上面的例子可看出:用DUP说明内存变量相当于在高级语言中定义数组。 buffer  - - 100字节 画出存储单元的分配图,计算分配字节数

◆强制属性操作符 PTR 在程序中,我们有时需要对同一个存储单元以不同的属性来访问,或对一些不确定的存储属性需要显式指定等,这时,我们就需要强制属性操作符PTR。该操作符的作用有点象C语言中的类型强制方法。 对于指令:MOV [BX], 1H,其目标操作数[BX]是寄存器间接寻址方式,它指向一个存储单元。在作传送操作时,是把“1H”扩展成8位作字节传送,还是扩展成16位作字传送呢?这就使该指令具有二义性,因为[BX]指向的存储单元可以字节或字的首地址。含有该指令的程序在汇编时,可能会产生警告或出错信息。

或 MOV word ptr [BX], 1H 数据类型 PTR 地址表达式 其中:数据类型是前面所学的各种数据类型,常用的数据类型有:BYTE、WORD、DWORD、NEAR和FAR等。 为了明确指令中存储单元的属性,可把指令“MOV [BX], 1H”可改写成: MOV  byte ptr [BX], 1H    或  MOV  word ptr [BX], 1H

MOV AX, word ptr b1 ;把B1开始的二个字节拼接成一个字,执行后,(AX)=0502H 在指令中用操作符PTR强制后,不管其后的地址表达式原数据类型是什么,在本指令中就以PTR前面的类型为准。该强制属性只在本指令有效,是一种临时性的属性,它不会改变原内存单元的定义属性。 例如: W1 DW 1234H, 5678H B1 DB 2 DB 5 D1 DD 23456789H … MOV AX, word ptr b1 ;把B1开始的二个字节拼接成一个字,执行后,(AX)=0502H MOV BH, byte ptr w1 ;把字W1的低字节传送给BH,执行后,(BH)=34H MOV CH, byte ptr w1+1;把字W1的高字节传送给CH,执行后,(CH)=12H MOV word ptr d1, 12H ;把双字D1的低字修改成0012H,执行后,(D1)=23450012H 上面指令中的强制属性是临时属性,它不能改变这些变量在定义时的永久属性。

安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 例 OPER1 DB ?, ? OPER2 DW ?, ? …… MOV OPER1, 0 ;字节指令 MOV OPER2, 0 ;字指令 OPER1 DB 1, 2 OPER2 DW 1234H, 5678H MOV AX, OPER1+1 × MOV AL, OPER2 × 类型不匹配 MOV AX, WORD PTR OPER1+1 MOV AL, BYTE PTR OPER2 (AX)=3402H (AL)=34H

◆ LABEL 伪操作: BYTE_ARRAY LABEL BYTE WORD_ARRAY DW 50 DUP (?) 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 ◆ LABEL 伪操作: 同一个变量可以具有不同的类型属性,除了可以用PTR来定义外,还可以用LABEL伪操作来定义 符号名 LABEL 类型 其中:常用的类型有BYTE、WORD、 DWORD、NEAR和FAR等 BYTE_ARRAY  WORD_ARRAY  BYTE_ARRAY LABEL BYTE WORD_ARRAY DW 50 DUP (?) tos LABEL WORD L LABEL NEAR 50字 tos  0064H

注意:等价语句不会给符号名分配存储空间,符号名不能与其它符号同名,也不能被重新定义 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 4.2.5 表达式赋值伪操作: 等价语句的一般使用格式如下: 符号名 EQU 表达式 作用是左边的符号名代表右边的表达式。 注意:等价语句不会给符号名分配存储空间,符号名不能与其它符号同名,也不能被重新定义 例 ALPHA EQU 9 BETA EQU ALPHA+18 BB EQU [BP+8]

数值表达式在汇编时应该可以计算出数值,它不能含有向前引用的符号名称。用等号语句定义的符号可以被重复定义。 汇编语言提供了用等号 “=” 来定义符号常数的方法,即可用符号名代表一个常数。其一般格式如下: 符号名=数值表达式 数值表达式在汇编时应该可以计算出数值,它不能含有向前引用的符号名称。用等号语句定义的符号可以被重复定义。 例如: ABC = 10 + 200 * 5 ;ABC的值为1010 ABC1 = 5 * ABC + 21 ;ABC1的值为5071 COUNT = 1 ;COUNT的值为1 COUNT = 2*COUNT + 1 ;COUNT的值为3 …… EMP = 7 EMP = EMP+1

4.2.6 地址计数器与对准伪操作: 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 4.2.6 地址计数器与对准伪操作: 1. 地址计数器 $ :保存当前正在汇编的指令的地址 ORG $+8 ; 跳过8个字节的存储区 JNE $+6 ; 转向地址是 JNE指令 的首址 +6 JMP $+2 ;转向下一条指令 $ 用在伪操作的参数字段: 表示地址计数器的当前值 ARRAY  0074 01H 00H 02H 0076 00H 7CH 0078 00H ARRAY DW 1, 2 , $+4 , 3 , 4 , $+4 03H 007A 00H 04H 00H 82H 007E 00H

地址计数器 $ : 保存当前正在汇编的指令的地址。 例: ARRAY DW 1,2,$+4,3,4,$+4, 则存储区分配情况如图所示。 0074 ARRAY→ 0 1 0 0 0078+4=007C 0 2 0 0 7 C 0078 0 0 0 3 0 0 007E+4=0082 0 4 0 0 007E 8 2 0 0

2. ORG 伪操作 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 2. ORG 伪操作 伪指令的作用是:告诉汇编程序,本伪指令下面的内存变量从该“数值表达式”所指定的地址开始分配。 SEG1 SEGMENT ORG 10 VAR1 DW 1234H ORG 20 VAR2 DW 5678H ORG $+8 VAR3 DW 1357H SEG1 ENDS BUFFER LABEL BYTE ORG $+8 BUFFER DB 8 DUP (?) ORG 100H START: ……

伪指令的作用是:告诉汇编程序,本伪指令下面的内存变量从该“数值表达式”所指定的地址开始分配。 ORG  数值表达式 伪指令的作用是:告诉汇编程序,本伪指令下面的内存变量从该“数值表达式”所指定的地址开始分配。 如:DATA SEGMENT ORG 10 VECT1 DW 47A5H ORG 20 VECT2 DW 0C596H DATA ENDS VECT1→ A 5 0AH 4 7 14H VECT2→ 9 6 C 5

3. 偶对齐伪指令EVEN 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 EVEN 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 3. 偶对齐伪指令EVEN 偶对齐伪指令格式: EVEN 伪指令的作用是:告诉汇编程序(Assember),本伪指令下面的内存变量从下一个偶地址单元开始分配。 A DB ‘morning’ EVEN B DW 2 DUP (?)

伪指令的作用是:告诉汇编程序,本伪指令下面的内存变量必须从下一个能被Num整除的地址开始分配。 4. 对齐伪指令ALIGN 对齐伪指令格式: ALIGN  Num 其中:Num必须是2的幂,如:2、4、8和16等。 伪指令的作用是:告诉汇编程序,本伪指令下面的内存变量必须从下一个能被Num整除的地址开始分配。 例: ALIGN 4 ALIGN 2 ; EVEN

4.2.7 基数控制伪操作: 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 . RADIX 表达式 ; 规定无标记数的基数 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 4.2.7 基数控制伪操作: . RADIX 表达式 ; 规定无标记数的基数 MOV BX, 0FFH MOV BX, 178 .RADIX 16 MOV BX, 0FF MOV BX, 178D

4.3 汇编语言程序格式 伪指令语句格式如下: [符号名] 伪指令符 操作数 ;注释 ① 符号名:符号名是伪指令语句的一个可选项。 4.3 汇编语言程序格式 伪指令语句格式如下: [符号名] 伪指令符 操作数 ;注释 ① 符号名:符号名是伪指令语句的一个可选项。 ② 伪指令符:伪指令符指定汇编程序要完成的具体操作,如数据定义伪指令DB、DW、DD,段定义伪指令SEGMENT,假定伪指令ASSUME等。 ③ 操作数:伪指令后面的操作数可以是常数、字符串、变量、表达式等,其个数由具体的伪指令决定,各个操作数之间必须以“逗号”分隔。 ④ 注释:伪指令的注释必须以“;”开始,其作用同指令语句中的注释部分。如: …… DATA DB 10,4,10H;定义一组字节操作数

4.3.1 名字项 名字项可以是标号或变量,它们都是用来表示本语句的符号地址。 4.3.1 名字项 名字项可以是标号或变量,它们都是用来表示本语句的符号地址。 标号:在代码段中定义,后面跟上“:”。它有三种属性,即段、偏移和类型。 变量:在数据段或附加段中定义,后面不跟冒号,它也有三种属性,即段、偏移和类型。 ① 段属性:标号和名字对应存储单元所在段的段地址。 ② 偏移属性:标号和名字对应存储单元所在段的偏移地址。 ③类型属性:标号、子程序名的类型可以是NEAR(近)和FAR(远),分别表示段内或段间;变量名的类型可以是BYTE(字节)、WORD(字)和DWORD(双字)等。

对于伪指令汇编程序将根据其所要求的功能进行处理。 4.3.2 操作项 操作项可以是指令、伪指令或宏指令助记符。 对于指令,汇编程序将其翻译成机器指令, 对于伪指令汇编程序将根据其所要求的功能进行处理。 对于宏指令,则根据定义展开。

4.3.3 操作数项 操作数项通常是由常数、寄存器、标号、变量或表达式组成。数值表达式是在汇编过程中能够由汇编程序计算其值的表达式,其组成部分在汇编时就能完全确定。它通常是一些常量的运算组合。 常量 常量是一个立即数,直接写在汇编语言语句中,在程序的执行过程中,它不可能发生变化。通常,我们用二进制、八进制、十进制或十六进制来书写常量。 例如:10101011B、324Q、1234D、1234H、0abcdH、'AB'等都是常量。

算术运算符 算术运算符包括符号:+(正)、-(负),运算符:+(加)、-(减)、*(乘)、/(除)和MOD(取模)。这些运算符和常量、括号可组成数值表达式。 如:120+(321-90)mod 3,322*5/32,0abcdH+5,-590等 逻辑运算符 逻辑运算符包括按位操作符和移位操作符。具体是:AND(逻辑与)、OR(逻辑或)、NOT(逻辑非)、XOR(异或)、SHL(左移位)和SHR(右移位)。这些逻辑运算符和常量、括号可组成数值表达式。 如:1 SHL 3,47H AND 0FH,NOT 56H等,它们的计算结果分别为:8,7和0A9H。

【例】用算术运算符进行数值表达式运算。 ┆ NUM1 EQU 25*4 –50 ;NUM1=50 NUM2 EQU NUM1 / 7 ;NUM2=7 NUM3 DB NUM1 MOD 7 ;NUM3=1 VAR1 DB 1,2,3,4,5 VAR2 DB ‘12345’ NUM4 EQU VAR2-VAR1 ;NUM4=5 NUM5 EQU 0FH MOV AL,NUM5 SHL 4 ;(AL)=11110000B MOV BL,NUM5 SHR 4 ; (BL)=00000000B

若关系不成立,则该数值表达式的计算结果为0;否则,其结果为0FFFFH。 关系运算符 关系运算符包括符号:EQ(相等)、NE(不等)、LT(小于)、GT(大于)、LE(小于等于)和GE(大于等于)。这些关系运算符和常量、括号也可组成数值表达式。该表达式的计算结果规定如下: 若关系不成立,则该数值表达式的计算结果为0;否则,其结果为0FFFFH。 【例】用关系运算符进行数值表达式运算。 NUM1 DB 10 LT 5 ;NUM1=0 NUM2 DB 0AAAAH GT 7FFFH ;NUM2=0FFFFH MOV AX,‘A‘ EQ 41H ;0FFFFH→AX MOV BX,NUM2 LT NUM1 ;0→BX

功能:分离出其后变量或标号的类型。如果是变量,将返回该变量的类型对应字节数;如果是标号,则返回代表标号类型的数值。它们之间的关系见下表所示。 数值回送运算符 ①TYPE运算符 格式:TYPE 变量或标号 功能:分离出其后变量或标号的类型。如果是变量,将返回该变量的类型对应字节数;如果是标号,则返回代表标号类型的数值。它们之间的关系见下表所示。 类型值 1 2 4 -1 -2 类型 BYTE WORD DWORD NEAR FAR 变量 标号 例: ARRAY DW 1,2,3 ADD SI,TYPE ARRAY 则加法指令被汇编成: ADD SI,2

② LENGTH运算符 格式:LENGTH 变量 功能:取出变量所含的数据存储单元个数。它返回重复操作符DUP中的重复数。如果有嵌套的DUP,则只返回最外层的重复数;如果没有操作符DUP,则返回1。 【例】取出变量占存储单元个数。 DATA SEGMENT A DB ‘ABCDEF’ B DW 10 DUP(1,2DUP(2)) C DB 3,20 DUP(0) DATA ENDS ┆ MOV AX,LENGTH A ;1→AX MOV BX,LENGTH B ;10→BX MOV CX,LENGTH C ;1→CX

③ SIZE运算符 格式:SIZE 变量 功能:取出变量所含的数据存储区大小。其返回值为: LENGTH 变量 * TYPE 变量 例如:上例中A、B、C三变量: SIZE A = LENGTH A*TYPE A = 1 SIZE B = LENGTH B*TYPE B = 20 SIZE C = LENGTH C*TYPE C = 1

④ OFFSET运算符 格式:OFFSET 变量或标号 功能:分离出其后变量或标号的偏移地址。 ⑤ SEG 运算符 格式:SEG 变量或标号 功能:分离出其后变量或标号所在段的段首址。

由于SCORE和NAME在同一段中定义,所以,寄存器AX和BX的值是相等的。 【例】假设有下面变量定义: FIRST  DD 12345678H, 0  ;数据段的变量定义 SCORE DW ?, 12H NAME  DB 10 DUP(10) … MOV AX,SEG SCORE ;代码段的指令 MOV BX,SEG NAME MOV CX,OFFSET SCORE MOV DX,OFFSET NAME 由于SCORE和NAME在同一段中定义,所以,寄存器AX和BX的值是相等的。 假设FIRST是数据段的第一个被定义的变量名,它的偏移量为0,SCORE的偏移量为8,因为它要跳过二个双字,其它如此类推。由于NAME在SCORE之后,且SCORE之后有二个字,占四个字节,所以,DX的值要比CX的值大4。

属性操作符 ① PTR 格式:类型 PTR 地址表达式 在程序中,我们有时需要对同一个存储单元以不同的属性来访问,或对一些不确定的存储属性需要显式指定等,这时我们就需要强制属性操作符PTR。该操作符的作用有点象C语言中的类型强制方法。 其中:数据类型是前面所学的各种数据类型,常用的数据类型有:BYTE、WORD、DWORD、NEAR和FAR等。 例如指令 MOV [BX],1H是错误的,可改写成: MOV  BYTE PTR [BX],1H 或 MOV  WORD PTR [BX],1H

② 段操作符 格式:段寄存器:地址表达式 功能:用来表示一个标号、变量或地址表达式的段属性。如: MOV AX,ES:[BX+SI] ③ SHORT 功能:用来修饰JMP指令中转向地址的属性。如: ┆ JMP SHORT NEXT NEXT:MOV AX,BX

如果引用变量名BUFFER,则是按“字节”属性来访问。 ④THIS 格式:THIS 数据类型 功能:它为同一存储单元取另一别名,该别名可具有其自身的数据属性,但其段地址和偏移量是不变的。其中:数据类型是前面所学的各种数据类型,常用的数据类型有:BYTE、WORD、DWORD、NEAR和FAR等。如: WBUFFER EQU THIS WORD BUFFER DB 20 DUP(?) 这样就给同一片存储单元,取了二个具有不同数据类型的变量名。于是,在指令中,引用不同的变量名,就使用其不同的数据属性: 如果引用变量名WBUFFER,则是按“字”属性来访问; 如果引用变量名BUFFER,则是按“字节”属性来访问。

⑤ HIGH和LOW 格式:HIGH 常量或地址表达式 LOW 常量或地址表达式 功能:HIGH 用来分离出其后16位常量或地址表达式的偏移量的高字节;LOW用来分离出其后16位常量或地址表达式偏移量的低字节。如: HIGH (1234H+100H),LOW 1234H 它们的选取结果分别为:13H和34H。

LENGTH、SIZE、( )、[ ]、< > PTR、OFFSET、SEG、TYPE、THIS 运算符的优先级 运算符 优先级 LENGTH、SIZE、( )、[ ]、< > 1 :(段超越) 2 PTR、OFFSET、SEG、TYPE、THIS 3 HIGH、LOW 4 *、/、MOD、SHL、SHR 5 +、- 6 EQ、NE、LT、LE、GT、GE 7 NOT 8 AND 9 OR、XOR 10 SHORT 11

4.4 汇编语言程序上机过程 编辑 文本编辑器,如 EDIT.COM 源程序:文件名.asm 汇编 汇编程序,如MASM.EXE 4.4 汇编语言程序上机过程 编辑 文本编辑器,如 EDIT.COM 源程序:文件名.asm 汇编 汇编程序,如MASM.EXE 目标模块:文件名.obj 连接 连接程序,如 LINK.EXE 可执行文件:文件名.exe 调试 调试程序,如 DEBUG.EXE 错误 应用程序

开发过程1:源程序的编辑 源程序文件要以ASM为扩展名。 源程序文件的形成(编辑)可以通过任何一个文本编辑器实现。 本书介绍的MASM程序员工作平台DOS中的全屏幕文本编辑器EDIT,也可其他程序开发工具中的编辑环境。例如:EDIT test01.asm

开发过程2:源程序的汇编 汇编是将源程序翻译成由机器代码组成的目标模块文件的过程。 使用提供的汇编程序是MASM.EXE: C:\>MASM test01.asm 如果源程序中没有语法错误,MASM将自动生成一个目标模块文件(test01.obj),否则MASM将给出相应的错误信息。这时应根据错误信息,重新编辑修改源程序后,再进行汇编。

开发过程3:目标模块的连接 连接程序能把一个或多个目标文件和库文件合成一个可执行程序(.EXE、.COM文件): C:\>LINK test01.obj 如果没有严重错误,LINK将生成一个可执行文件(test01.exe);否则将提示相应的错误信息。这时需要根据错误信息重新修改源程序后再汇编、链接,直到生成可执行文件。

开发过程4:可执行程序的调试 经汇编、连接生成的可执行程序在操作系统下只要输入文件名就可以运行: C:\>test01(回车) 操作系统装载该文件进入主存,开始运行。 如果出现运行错误,可以从源程序开始排错,也可以利用调试程序帮助发现错误。 采用DEBUG.EXE调试程序: C:\>DEBUG test01.exe -U

汇编语言程序的上机过程 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 (1)建立汇编语言的工作环境 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 汇编语言程序的上机过程 (1)建立汇编语言的工作环境 为了运行汇编语言程序至少要在磁盘上建立以下文件 编辑程序,如EDIT.EXE 汇编程序,如MASM.EXE 连接程序,如LINK.EXE 调试程序,如DEBUG.COM 必要时,还可以建立如CREF.EXE,EXE2BIN.EXE等文件。

安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 (2)建立ASM文件 C>EDIT MYFILE . ASM 例: code segment 'code' assume cs:code,ds:code,ss:code,es:code org 100H begin: jmp main num1 dw 1199H num2 dw 1166H sum dw ? main proc near mov ax, num1 add ax, num2 mov sum, ax mov ax, 4c00h int 21h main endp code ends end begin

(3)用MASM程序产生OBJ文件 C>MASM MYFILE . ASM Microsoft (R) Macro Assembler Version 5.10 Copyright (C) Microsoft Corp 1981,1988.All rights reserved. Object filename [MYFILE.OBJ]: Source listing [NUL.LST]: MYFILE.LST Cross-reference [NUL.CRF]: 47962 + 413345Bytes symbol space free 0 Warning Errors 0 Severe Errors

在建立了.EXE文件后,就可以直接从DOS执行程序 (4)用LINK程序产生EXE文件 C>LINK MYFILE . OBJ Microsoft (R) Overlay Linker Version 3.64 Copyright (C) Microsoft Corp 1983-1988. All rights reserved. Run File [MYFILE.EXE]: List File [NUL.MAP]: Libraries [.LIB]: LINK : warning L4021: no stack segment (5)程序的运行 在建立了.EXE文件后,就可以直接从DOS执行程序 C>MYFILE

安徽理工大学 计算机科学与技术系 李敬兆 《汇编语言》 第4章作业 Page 155 4.1 4.5 4.8 4.10 4.14 4.17 4.19