Microsoft Word - 新正文(1-12).doc

Size: px
Start display at page:

Download "Microsoft Word - 新正文(1-12).doc"

Transcription

1 第 5 章汇编语言程序设计 汇编语言是一种面向机器的低级语言, 利用汇编语言设计的程序效率高 实时性强, 还能直接控制硬件, 能充分发挥硬件的潜力 但现在主流的开发工具是高级语言, 所以本章不仅介绍 DOS 环境下的汇编语言程序设计, 而且介绍了 Windows 下的汇编开发方法 汇编语言源程序的组成部分有 : 模块 段 子程序和宏等 第 1 部分介绍汇编语言的语法规定, 着重叙述汇编语言程序的格式 各种伪指令的格式及用法 常用标识符的定义及应用 宏汇编的应用 ; 第 2 部分介绍汇编语言程序设计的方法 步骤, 着重叙述汇编语言程序的三大结构, 并通过编程举例介绍常见问题的解决方法 ; 第 3 部分介绍子程序结构及设计方法, 着重叙述子程序调用 / 返回的原理 子程序入 / 出口参数传递方法 子程序的嵌套 / 递归调用, 并结合实例说明子程序设计方法 ; 最后两部分介绍 Windows 汇编语言程序设计以及与高级语言的混合编程方法 汇编语言源程序书写格式及常用伪指令语句 结构化程序设计方法 : 顺序结构程序设计 分支结构程序设计 循环结构程序设计 宏汇编 子程序设计方法 Windows 汇编语言程序设计 汇编语言与高级语言的混合编程 5.1 汇编语言的特点 汇编语言 (Assembly Language) 是一种以处理器指令系统为基础的低级程序设计语言, 它采用助记符来表示操作码, 用标识符来表示操作数地址码 用汇编语言编写的程序具有以下特性 : (1) 与机器相关 汇编语言是一种面向机器的程序设计语言, 是机器指令的符号表示 不同类型 CPU 的机器指令系统不同, 对应的汇编语言也就不同, 所以汇编语言程序与机器有着密切的关系 因此, 汇编语言程序的通用性和可移植性较低 (2) 执行效率高 汇编语言程序能直接管理和控制硬件设备, 直接与存储器 接口电路等打交道, 还能申请中断 程序员在编写程序时, 可以对机器内部的各种资源进行合理的安排,

2 第 5 章汇编语言程序设计 129 编写出最优化的程序, 因而用汇编语言编写的程序执行效率高 占用存储空间小 运行速度快 (3) 编程复杂 利用汇编语言编写程序完成某项工作时, 必须了解 CPU 完成该项工作的每一个细节, 用一系列汇编指令一步一步来实现 ; 另外, 在编写汇编语言程序时, 还要考虑机器资源的限制 汇编指令的细节和限制等, 增加了编写程序的复杂性, 需要程序员对计算机硬件和操作系统有相当深入的了解 5.2 汇编语言程序结构和基本语法 在 MS DOS 环境下, 用 8086/8088 汇编语言开发设计出的既节省空间 又快速高效的程序代码, 可以直接控制计算机的硬件 到了 Windows 环境下, 虽然仍可使用 8086/8088 汇编语言, 但这个环境已不是原有的 MS DOS 环境, 不能像以前那样, 随意对系统编程去控制计算机了 下面首先介绍 DOS 环境下的汇编程序例子 示例程序 通过下面一个完整的汇编语言源程序来讨论汇编语言程序的格式, 该程序的功能是实现 C=A+B, 其中 A B C 均为字节数据 例 5-1 DATA SEGMENT ; 定义段 DATA A DB 12H ; 定义变量 A, 其值为 12H B DB 34H ; 定义变量 B, 其值为 34H C DB? ; 定义变量 C, 但没有赋值 DATA ENDS ;DATA 段定义结束 CODE SEGMENT ; 定义段 CODE ASSUME CS:CODE, DS:DATA ; 规定 DATA CODE 分别为数据段和代码段 START: MOV AX,DATA ; 用标号 START 指明程序执行的起始点 MOV DS,AX ; 给数据段寄存器 DS 赋值 MOV AL,A ; 将变量 A 的值送入寄存器 AL ADD AL,B ; 将 AL 的值与变量 B 的值相加, 并将其和存入 AL MOV C,AL ; 将 AL 的值送给变量 C MOV AH,4CH INT 21H ; 调用 DOS 中断, 退出程序并返回 DOS 状态 CODE ENDS ;CODE 段定义结束 END START ; 整个源程序结束 从该例中可以看出汇编语言源程序具有以下特点 : (1) 汇编语言源程序由若干个段组成 ( 完整的汇编语言源程序由数据段 代码段 附加段 堆栈段组成, 其中代码段是不可缺少的 ), 在代码段中用 ASSUME 伪指令将段地址与段寄存器的对应关系告诉汇编程序, 每个段以 SEGMENT 语句开始, 以 ENDS 语句结束, 整个源程序以 END 结束 (2) 段由若干语句组成, 一条语句一般写在一行上, 书写时语句的各部分应尽量对齐 (3) 汇编语言程序中至少要有一个启动标号, 作为程序开始执行时目标代码的入口地址 启动标号常用 START BEGIN 等命名 (4) 为增加程序的可读性, 可在汇编语言语句 ; 后加上注释 (5) 为保证在执行过程中数据段地址的正确性, 在源程序中需要对 DS 寄存器进行初始化

3 130 微机原理与接口技术 (6) 为了在程序结束时返回 DOS, 一般通过调用 DOS 中断的 4CH 子功能来实现 基本概念 1. 汇编语言中的语句汇编语言源程序由语句序列构成, 其语句序列可分为指令语句 伪指令语句 宏指令语句 3 种类型 (1) 指令语句 指令语句是可执行语句 ( 即第 3 章中介绍的处理器指令系统 ), 在汇编后要产生对应的目标代码,CPU 根据这些代码执行相应的操作 格式 :[ 标号 :] < 指令助记符 > [ 操作数 ] [; 注释 ] 例如 : START: MOV AX,DATA ; 用标号 START 指明程序执行的起始点 (2) 伪指令语句 伪指令是不可执行语句, 在汇编中不产生目标代码, 用于指示汇编程序如何汇编源程序, 利用它定义和说明常量与变量的属性及存储器单元的分配等 格式 :[ 名字 ] < 伪指令助记符 > [ 操作数 ] [; 注释 ] 例如 : A DB 12H ; 定义变量 A, 其值为 12H (3) 宏指令语句 宏指令是以一个宏名定义的一段指令序列, 在汇编中凡是出现宏指令语句的地方, 都会有相应的指令语句序列的目标代码插入 格式 :[ 标号 :] < 宏名 > [ 实参表 ] [; 注释 ] 汇编中的大部分指令语句与 8086 指令相对应, 这里不再赘述 本节将着重介绍伪指令语句和宏指令语句 2. 汇编语句使用说明 (1) 标号和名字称为标识符, 汇编语言中标识符的组成规则如下 : 标识符由字母 数字及规定的特殊符号 ( 如 _ 组成 标识符必须以字母打头 标识符字符长度不得超过 31 默认情况下, 汇编程序不区别标识符中字母的大小写 用户定义标识符必须是唯一的, 且不能与汇编语言专用的保留字重名 (2) 标号用来指向一条指令或宏指令, 表示后面的指令第一个字节存放的内存地址, 标号常作为转移指令的操作数, 确定程序转移的目标地址 ; 名字用来指向一条伪指令, 用作变量名时, 表示变量存放在内存中首字节的地址 (3) 名字和标号都具有以下 3 种属性 : 段属性 : 表示标号或变量所在段基址, 标号的段基址在 CS 段寄存器中, 变量的段基址在 DS 或 ES 中 偏移属性 : 表示标号或变量所在的段内偏移地址, 它代表从段的起始地址到定义标号或变量的位置之间的字节数, 段基址和偏移地址组成标号或变量的逻辑地址 类型属性 : 当标号作为转移类指令的操作数时, 可在段内或段间转移, 其属性有 NEAR ( 段内转移 ) 和 FAR( 段间转移 ) 两种, 若没有对标号进行类型说明, 就默认为 NEAR 属性 ; 对于变量, 类型属性说明变量在内存中占多少个字节, 其属性有 BYTE( 字节 ) WORD( 字 ) DOUBLE WORD( 双字 )3 种

4 第 5 章汇编语言程序设计 131 (4) 指令的操作数可以是立即数 寄存器和存储单元 ; 伪指令的操作数可以是常数 变量名 表达式等 ; 若有多个操作数时, 操作数之间用逗号间隔 (5) 分号 ; 后的部分为注释内容, 用以增加源程序的可读性, 汇编程序在翻译源程序时将跳过该部分, 对它们不做任何处理 3. 汇编语言中的常量与变量 (1) 常量 : 汇编中允许的常量有整数常量和字符串常量两种 1) 整数常量 : 整数常量可以采用 4 种表示方法 : 二进制常量 : 由数字 0 1 组成的序列, 且以字母 B 结尾, 如 B 十进制常量 : 由数字 0~9 组成的序列, 结尾可以加上字母 D, 如 9876D 或 6575 八进制常量 : 由数字 0~7 组成的序列, 且以字母 Q( 或字母 O) 结尾, 如 255Q 377O 十六进制常量 : 由数字 0~9 字母 A~F( 或 A~F) 组成的序列, 且以字母 H 结尾, 如 3456H 0AB19H( 为了避免与标识符相混淆, 十六进制数在语句中必须以数字打头, 凡是以字母 A~F 开始的十六进制数, 必须在前面加上数字 0) 2) 字符串常量 : 字符串常量是由单引号或双引号括起来的单个字符或多个字符构成的, 汇编程序把引号中的字符翻译成它的 ASCII 码值, 如 'A'( 等于 41H) 'BC'( 等于 4243H) "HELLO" 等 (2) 变量 : 汇编语言中的变量用来表示存放在内存中的操作数, 它的值是可以改变的, 变量的值就是操作数在内存中首字节的地址, 变量要事先定义才能使用 ( 详见 节 ) 4. 汇编语言中的运算符与表达式 (1) 运算符 : 汇编语言中的运算符分为六大类 : 算术运算符 移位运算符 逻辑运算符 关系运算符 分析运算符 合成运算符, 如表 5-1 所示 表 5-1 汇编语言中的运算符 运算符 类型符号名称 实例 表达式的值 / 功能说明 + 加 算术运算符 - 减 * 乘 5*6 30 / 除 64/8 8 MOD 取余 9MOD7 2 移位 SHL 逻辑左移 0011B SHL B 运算符 SHR 逻辑右移 1100B SHR B NOT 非 NOT 0001B 1110B 逻辑运算符 AND 与 1000B AND 0001B 0000B OR 或 1000B OR 0001B 1001B XOR 异或 1000B XOR 0001B 1001B 关系运算符 EQ 相等 10H EQ 10 假 ( 用全 0 表示 ) NE 不等 10H NE 10 真 ( 用全 1 表示 ) LT 小于 10H LT 10 假 ( 用全 0 表示 )

5 132 微机原理与接口技术 续表 运算符 类型符号名称 实例 表达式的值 / 功能说明 关系运算符 分析运算符 LE 小于等于 10 LE 0AH 真 ( 用全 1 表示 ) GT 大于 10H GT 10 真 ( 用全 1 表示 ) GE 大于等于 10H GE 100 假 ( 用全 0 表示 ) SEG 求段基址 SEG X X 所在段的段基址 OFFSET 求偏移地址 OFFSET X X 在段内的偏移地址 LENGTH 求变量包含的单元数 LENGTH X X 包含的单元数 ( 详见例 5-4) TYPE 求变量的字节数 TYPE X X 的字节数 ( 详见例 5-4) SIZE 求变量的总字节数 SIZE X X 的总字节数 ( 详见例 5-4) PTR 修改类型 WORD PTR X 访问 X 对应的字数据 ( 详见例 5-4) THIS 指定类型 X EQU THIS BYTE 指定变量 X 为字节属性 ( 详见例 5-6) 合成运算符 : 段超越 ES:[1000H] HIGH 求高字节 HIGH 1234H 12H 指定访问附加段中偏移地址为 1000H 的单元 LOW 求低字节 LOW 1234H 34H SHORT 短转移说明 JMP SHORT NEXT 说明转移地址在下一条指令地址的 -128~127 个字节范围 (2) 表达式 : 表达式是常数 寄存器 标号 变量与一些运算符和操作码相组合的序列 表达式的运算不由 CPU 完成, 而是在程序汇编过程中进行计算确定, 并将表达式的结果作为操作数参与指令所规定的操作 当各种运算符同时出现在同一表达式中时, 按照运算符的优先级进行计算, 对于优先级相同的运算符, 按照从左到右的顺序进行计算 ( 运算符优先级顺序如表 5-2 所示 ) 表 5-2 汇编语言中运算符的优先级 优先级 运算符 1 LENGTH SIZE WIDTH MASK ( ) [ ] < > 高2 PTR OFFSET SEG TYPE THIS 3 HIGH LOW 4 + ( 单目运算, 表示取正 取负 ) 5 * / MOD SHL SHR 6 + ( 双目运算, 表示加 减 ) 7 EQ NE LT LE GT GE 8 NOT 9 AND 低10 OR XOR 11 SHORT

6 第 5 章汇编语言程序设计 133 例 5-2 MOV AX, 1*2+3 ; 等价于 MOV AX,5 MOV AX, X+4 ; 等价于 MOV AX,X[4], 注意这里是 X 地址加 4 ; 不是 X 的值加 4 MOV AH, 0001B SHL 3 ; 等价于 MOV AH, B MOV BH, 1000B SHL(1+2) ; 等价于 MOV BH, B MOV DH, NOT B ; 等价于 MOV DH, B MOV DL, B AND B ; 等价于 MOV DL, B MOV AX, 10 EQ 1010B ; 等价于 MOV AX, 0FFFFH MOV BX, 10H GT 10 ; 等价于 MOV BH, 0FFFFH ADD CX, 99H LE 99 ; 等价于 ADD CX, 0000H MOV DX, SEG X ; 假设 X 为数据段内定义的变量, 则该语句等价于 ;MOV DX, DS MOV AX, OFFSET X ; 等价于 LEA AX,X MOV DL, B AND B ; 等价于 MOV DL, B MOV AX, 10 EQ 1010B ; 等价于 MOV AX, 0FFFFH MOV BX, 10H GT 10 ; 等价于 MOV BH, 0FFFFH ADD CX, 99H LE 99 ; 等价于 ADD CX, 0000H MOV DX, SEG X ; 假设 X 为数据段内定义的变量, 则该语句等价于 ;MOV DX, DS MOV AX, OFFSET X ; 等价于 LEA AX,X MOV AX, [1000H] ; 将数据段中偏移地址为 1000H 的字数据送给 AX MOV AH,HIGH 0ABCDH ; 等价于 MOV AH, 0ABH MOV AL,LOW 0ABCDH ; 等价于 MOV AL, 0CDH MOV AX, ES:[1000H] ; 将附加段中偏移地址为 1000H 的字数据送给 AX ; 段超越用来指定地址是在附加段中 伪指令 汇编语言中有丰富的伪指令 依其功能可将其分为数据定义伪指令 符号定义伪指令 段 定义伪指令 段分配伪指令 过程定义伪指令 模块定义伪指令 结构定义伪指令和记录定义 伪指令等 1. 数据定义伪指令 数据定义伪指令用来为变量申请固定长度的存储空间, 并可同时将相应的存储单元初 始化 格式 :[ 变量名 ] 伪指令助记符 初值表 (1) 变量名为用户自定义标识符, 表示初值表中首个元素的逻辑地址, 可以通过变量名 来访问它所指示的存储单元, 有时也可以省略变量名 (2) 变量定义伪指令有 5 种形式 : DB 定义字节变量, 即其后的每个操作数均占 1 个字节 DW 定义字变量, 即其后的每个操作数均占 2 个字节 DD 定义双字变量, 即其后的每个操作数均占 4 个字节 DQ 定义 4 字变量, 即其后的每个操作数均占 8 个字节

7 134 微机原理与接口技术 DT 定义 10 字节变量, 即其后的每个操作数均占 10 个字节 注意 : 存放多字节数据时, 数据高字节存放在高地址单元, 低字节存放在低地址单元 (3) 初值表给出变量的初始化值, 有多个值时用逗号分隔, 初始化值可以是数值常数, 也可以是表达式?, 还可以由 $ 重复操作符 DUP 组成 其中 :?: 表示未赋初值 $: 表示将要分配的内存单元的偏移地址 DUP: 表示重复初值, 其格式为 : 重复次数 DUP( 重复参数 ) ; 重复参数可以是多个, 之间用逗号间隔例如 : 2 DUP(1,2) ; 等价于 1,2,1,2 2. 起始位置定位伪指令 ORG 在数据段内一般从偏移地址为 0 的存储单元开始, 依次按顺序分配内存单元 ; 使用 ORG 可以指定从某一个偏移地址开始分配内存单元 ORG 指令格式 : ORG 表达式 ; 从表达式的值指定的偏移地址开始分配的内存单元例 5-3 DATA SEGMENT X DB 64*2-100, 'D' ; 两初始化值的十六进制表示分别为 1CH 44H DB 'CHN' ; 省略了变量名, 初始化值的十六进制表示为 43H 48H 4EH DW? ; 只分配两个字节空间, 未赋初值 ORG 0100H ; 指定从偏移地址为 0100H 单元开始分配内存单元 Y DW 2 DUP(100) ; 定义了两个字数据 0064H M DB 2 DUP(1,2 DUP(1,2)) ; 定义了十个字节数据 01H 01H 02H 01H 02H 01H ;01H 02H 01H 02H Z DW $-10 ; 此时要分配的单元偏移地址为 010EH, 故初始化值 ; 为 010EH-10=0104H DATA ENDS 本例中数据段中的数据在内存中的存放如图 5-1 所示 例 5-4 分析运算符的使用 ( 数据定义同例 5-3) ; 说明 :LENGTH 用来求其后的变量包含的单元数, 即变量用 DUP 初始化时, 返回 DUP 重复次数 ; 对于不是用 DUP 初始化的变量, 则返回 1 MOV AX, LENGTH Y ; 等价于 MOV AX, 2 MOV AX, LENGTH M ; 等价于 MOV AX, 2 MOV AX, LENGTH X ; 等价于 MOV AX, 1 ; 说明 :TYPE 用来求其后的变量或标号的属性值 ( 变量或标号的属性值如表 5-3 所示 ) MOV AX, TYPE Y ; 等价于 MOV AX,2 MOV AX, TYPE X ; 等价于 MOV AX,1 ; 说明 :SIZE 用来求其后的变量包含多少个字节, 即 SIZE=LENGTH TYPE MOV AX, SIZE Y ; 等价于 MOV AX,4 MOV AX, SIZE X ; 等价于 MOV AX,1 ; 说明 :PTR 用来求其后的变量或标号的类型, 格式为 : 类型 PTR 表达式 ( 其中, 类型为 BYTE ;WORD DWORD NEAR 或 FAR) MOV AX, X ;( ) 本语句源操作数 X 为字节类型, 目的操作数 AX 为 ; 字类型, 两者类型不匹配 MOV AX, WORD PTR X ;( ) 利用 PTR 运算符修改 X 类型为字类型, 即源操作数 ; 为从 X 开始的字数据, 等价于 MOV AX, 441CH

8 第 5 章汇编语言程序设计 135 存储单元 偏移地址 X 1CH 0000H 44H 0001H 43H 0002H 48H 0003H 4EH 0004H 0005H 0006H 数据段 DATA Y 64H 0100H 00H 0101H 64H 0102H 00H 0103H M 01H 0104H 01H 0105H 02H 0106H 01H 0107H 02H 0108H 01H 0109H 01H 010AH 02H 010BH 01H 010CH 02H 010DH Z 04H 010EH 01H 010FH 图 5-1 例 5-3 中内存数据的存放 表 5-3 变量或标号的属性值 属性名 属性值 DB 1 DW 2 变量 DD 4 DQ 8 DT 10 标号 NEAR -1 FAR 符号定义伪指令符号定义伪指令用来定义符号常量, 系统不会给符号常量分配内存空间 其指令有 EQU =

9 136 微机原理与接口技术 指令格式 : 符号 EQU 表达式符号 = 表达式 ; 左边符号的值为右边表达式的值两者的区别是, 用 = 定义的符号常量可以被重新定义, 而用 EQU 定义的符号常量不能被重新定义 例 5-5 VAR1 EQU 10H MOV AL,VAR1 ; 等价于 MOV AL,10H VAR2 EQU Z MOV AX,VAR2 ; 等价于 MOV AX,Z VAR3 EQU VAR1*3+10 MOV AL,VAR3 ; 等价于 MOV AL,3AH VAR4 EQU [BX+SI+100] MOV AL,VAR4 ; 等价于 MOV AL,[BX+SI+100] VAR5 EQU ADD VAR5 AX,BX ; 等价于 ADD AX,BX VAR6 EQU 01H VAR6 EQU 02H ;( ) 前面已经定义了符号常量 VAR6, 不能再重复定义 VAR6 MAX = 100 MAX = MAX ;( ) 前面符号常量 MAX 的值为 100, 现在其值被修改为 200 ; 说明 : 可以用 PURGE 指令解除对符号常量的定义, 之后就可以对该符号重新定义了 ; 其格式为 :PURGE 符号 1, 符号 2,, 符号 N MIN EQU 01H PURGE MIN MIN EQU 02H ;( ) 前面已经定义了符号常量 MIN,PURGE 解除了对 MIN ; 的定义, 所以可以重新定义 MIN 4.LABEL 伪指令 LABEL 伪指令为其后定义的变量或标号定义一个不同类型的别名 其格式为 : 变量或标号 LABEL 类型 其中, 类型为 BYTE WORD DWORD NEAR 或 FAR 例 5-6 VAR LABEL WORD X DB 'AB' ; 变量 VAR X 指向内存中的同一单元, 但两者类型分别为 ; 字类型 字节类型 MOV AX,VAR ; 等价于 MOV AX,4241H MOV AL,X ; 等价于 MOV AL,41H 例 5-6 还可以改成 : VAR EQU THIS WORD X DB 'AB' ; 变量 VAR X 指向内存中的同一单元, 但两者类型分别 ; 为字类型 字节类型 MOV AX, VAR ; 等价于 MOV AX,4241H MOV AL,X ; 等价于 MOV AL,41H ; 说明 :THIS 为其后定义的变量或标号定义一个不同类型的别名 其格式为 : 变量名 EQU THIS 类型 ; 其中, 类型为 BYTE WORD DWORD NEAR 或 FAR 5. 段定义伪指令汇编语言源程序由若干个段组成, 段定义伪指令 (SEGMENT/ENDS) 用来定义一个段,

10 第 5 章汇编语言程序设计 137 要求给出段名, 由 SEGMENT 指定段的开始,ENDS 指定段的结束 其格式为 : 段名 SEGMENT [ 定位类型 ] [ 组合类型 ] [' 类别 '] ; 语句序列段名 ENDS 说明 : (1)SEGMENT 和 ENDS 必须成对出现 (2) 段名由用户自己命名, 必须符合标识符命名规则, 前后段名必须保持一致 每个段的段名即为该段的段基址 (3) 定位类型用来说明对段起始地址的要求, 可以省略 定位类型有以下 4 种 : BYTE: 段的起始地址可在任意字节边界上, 即段起始地址是任意的 WORD: 要求段的起始地址在任意字边界上, 即段起始地址最低位为 0, 亦即段起始地址必须为偶地址 PARA: 要求段的起始地址在节 (16 字节 ) 的边界上, 即段起始地址低 4 位全部为 0, 如 XXXX0H 缺省定位类型时, 默认为 PARA 类型 PAGE: 要求段的起始地址在页 (256 字节 ) 边界上, 即段起始地址低 8 位全部为 0, 如 XXX00H (4) 组合类型用来说明同类别名的段的连接方式, 可以省略 定位类型有以下 6 种 : NONE: 不与其他段连接 缺省组合类型时, 默认为 NONE 类型 PUBLIC: 将不同程序模块中同名同类型的段按顺序连接成一个共同的段装入内存 STACK: 指定该段为堆栈段, 并将不同程序模块中的堆栈段按顺序连接成一个堆栈段, 即所有程序模块共用一个堆栈段 COMMON: 将不同程序模块中同名同类型的段都从同一个地址开始装入, 即以覆盖方式连接, 各个逻辑段将发生重叠, 段长度为最大段的长度 AT 表达式 : 按照表达式的值指定的段基址将段装入内存 MEMORY: 多个逻辑段连接时, 连接程序将把本段连接在其他所有段之上 若多个段均为 MEMORY 类型时, 则将第一个 MEMORY 段置于所有段之上, 其他 MEMORY 段当成 COMMON 类型来处理 (5) 类别名必须用 引起来, 用来说明该段类别名, 在连接时将同类别名的段按照组合类型进行组合 类别名由用户自定义, 长度不超过 40 个字符 例 5-7 CODE SEGMENT 'CODE' CODE ENDS ; 定义一个段, 段名为 CODE, 类别名为 CODE STACKSEG SEGMENT STACK STACKSEG ENDS ; 定义一个堆栈段, 段名为 STACKSEG, 组合类型为 STACK DATA1 SEGMENT WORD PUBLIC 'CONST' DATA1 ENDS ; 定义一个段, 段名为 DATA1, 定位类型为 WORD, 组合类型为 PUBLIC ; 类别名为 CONST CODESEG SEGMENT PARA PUBLIC 'CODE' CODESEG ENDS ; 定义一个段, 段名为 CODESEG, 定位类型为 PARA, 组合类型为 PUBLIC ; 类别名为 CODE

11 138 微机原理与接口技术 6. 段分配伪指令段分配伪指令用来说明当前哪些逻辑段为代码段 哪些为数据段 哪些为堆栈段 哪些为附加段 其格式为 : ASSUME 段寄存器 : 段名 [, 段寄存器 : 段名, ] 说明 : (1)ASSUME 伪指令只能设置在代码段内, 放在段定义语句之后 (2)ASSUME 伪指令只是建立了逻辑段与段寄存器之间的关系, 并没有为段寄存器赋值 对于代码段和堆栈段, 由连接程序来设置 CS IP SS SP 的值 ; 而数据段和附加段则需要由 用户在程序中对 DS ES 赋值 (3) 每个段的段名即为该段的段基址, 它是一个 16 位的立即数, 因此不能直接将它送给 段寄存器, 通常先将段名送给一个通用寄存器, 然后将该通用寄存器的值再送给段寄存器, 来 对 DS ES 赋值 例 5-8 DATA1 SEGMENT ; 定义一个段, 段名为 DATA1 X DB 100 DATA1 ENDS EXTRA SEGMENT ; 定义一个段, 段名为 EXTRA STR DW 10 DUP(?) EXTRA ENDS STACKSEG SEGMENT STACK ; 定义一个堆栈段, 段名为 STACKSEG BUF DW 50 DUP(?) STACKSEG ENDS CODE SEGMENT ; 定义一个段, 段名为 CODE ASSUME CS: CODE,DS: DATA1,ES: EXTRA,SS: STACKSEG ; 指定 CODE 为代码段,DATA1 为数据段,EXTRA 为附加段,STACKSEG 为堆栈段 START: MOV AX, DATA1 MOV DS, AX ; 将数据段段基址送入 DS MOV AX, EXTRA MOV ES, AX ; 将附加段段基址送入 ES CODE ENDS END START 7. 过程定义伪指令 对于程序中经常用到的具有独立功能的语句组, 可将它定义成一个子过程, 通过 CALL 来调用执行, 可以简化主程序, 实现模块化程序设计, 提高编程效率 (1) 过程定义的格式 : 过程名 PROC [ 属性 ] ; 语句序列 RET 过程名 ENDP 说明 : 1 过程名由用户自己命名, 但必须符合标识符命名规则, 前后过程名必须保持一致 过程名代表过程的入口地址 2 PROC 指定过程的开始,ENDP 指定过程的结束,PROC 和 ENDP 必须成对出现 3 属性 : 过程属性有 NEAR( 段内近调用 ) FAR( 段间远调用 ) 两种, 若缺省则为 NEAR

12 第 5 章汇编语言程序设计 139 NEAR 属性的过程只能被本代码段内的其他程序调用 ;FAR 属性的过程既可以被本代码段内的程序调用, 又可以被其他代码段内的程序调用 4 过程必须以 RET 结尾, 以便返回调用它的程序 5 子过程应安排在代码段的主程序之外, 最好放在主程序执行终止后的位置 ( 返回 DOS 后 汇编结束 END 伪指令前 ), 也可以放在主程序开始执行之前的位置 (2) 过程调用格式 :CALL 过程名例 5-9 CODE SEGMENT ; 定义代码段 CODE ASSUME CS:CODE BEGIN: CALL SUB ; 调用过程 SUB SUB PROC NEAR ; 定义过程 SUB, 其属性为 NEAR RET ; 返回主程序 SUB ENDP ; 过程 SUB 定义结束 CODE ENDS ; 代码段 CODE 定义结束 END BEGIN 主程序与子过程位于同一个代码段时称为段内近调用, 主程序执行到 CALL 指令时, 只需将下一条指令的偏移地址 IP 压入堆栈, 然后转到以 SUB 为偏移地址 ( 只需修改 IP 的值 ) 的过程去执行, 过程执行到 RET 指令时, 从堆栈弹出一个字送入 IP, 这样就返回到主程序中, 去执行主程序 CALL 后的指令 例 5-10 CODE1 SEGMENT CALL SUB SUB PROC FAR RET SUB ENDP CODE1 ENDS CODE2 SEGMENT CALL SUB CODE2 ENDS 主程序与子过程不在同一个代码段时称为段间远调用, 主程序执行到 CALL 指令时, 将下一条指令的段基址 CS 和偏移地址 IP 都压入堆栈 (CS 先入栈 ), 然后转到以 SUB 为入口地址 ( 既要修改 CS 的值, 又要修改 IP 的值 ) 的过程去执行, 过程执行到 RET 指令时, 从堆栈弹出两个字分别送入 IP CS, 这样就返回到主程序中, 去执行主程序 CALL 后的指令 例 5-10 中, 在代码段 CODE2 中, 调用代码段 CODE1 里定义的子过程 SUB 就属于这种情况 ; 但是, 在代码段 CODE1 中, 调用子过程 SUB 时, 虽然属于段内近调用, 但 SUB 属性

13 140 微机原理与接口技术 为 FAR, 仍然要当作段间远调用处理, 即调用时,CS IP 都要入栈, 返回时, 也要分别弹出 IP CS 的值, 才能正确地返回主程序 8. 全局标识符伪指令开发较复杂的大型应用程序时, 通常把程序分解成多个功能独立的模块, 分别编写子程序来实现各个模块的功能, 对各个子程序单独进行汇编产生相应的目标模块 (OBJ 文件 ), 最后再用连接程序把它们连接成一个完整的可执行程序, 称之为模块化程序设计方法 采用模块化程序设计, 各模块之间会存在着数据的交流, 即在一个模块中需要引用在另一个模块中定义的变量 标号或过程 模块中的标识符有两种 :1 仅供本模块使用的标识符, 称为局部标识符 ;2 既可供本模块使用, 又可供另外的模块使用的标识符, 称为全局标识符 (1) 全局标识符定义伪指令 要想让其他模块能调用本模块中的标识符, 就需要在本模块中将该标识符定义为全局标识符, 其格式为 : PUBLIC 标识符 1, 标识符 2, (2) 全局标识符声明伪指令 要想在本模块中调用其他模块里的全局标识符, 需要用 EXTRN 进行声明, 其格式为 : EXTRN 标识符 1: 类型, 标识符 2: 类型, 其中, 类型可为 BYTE WORD DWORD NEAR 或 FAR 例 5-11 ; 模块 1, 文件 1.ASM EXTRN SUB2:FAR ; 声明全局远过程 SUB2 PUBLIC DATA1,RESULT ; 定义全局变量 DATA1 RESULT DSEG SEGMENT DATA1 DB 3 DUP(1) RESULT DB? DSEG ENDS CODE SEGMENT ASSUME CS:CODE,DS:DSEG START: MOV AX, DSEG MOV DS, AX ; 初始化 DS CALL SUB2 ; 调用远过程 SUB2 ADD RESULT, '0' ; 将结果转换成字符显示 MOV DL,RESULT MOV AH,2 INT 21H MOV AH,4CH ; 程序结束, 返回 DOS INT 21H CODE ENDS END START ; 模块 2, 文件 2.ASM EXTRN DATA1:BYTE, RESULT:BYTE ; 声明全局变量字节变量 DATA1 RESULT PUBLIC SUB2 ; 定义全局远过程 SUB2 DSEG2 SEGMENT DATA2 DB 3 DUP(2) DSEG2 ENDS CODE2 SEGMENT ASSUME CS:CODE2,ES:DSEG2 SUB2 PROC FAR ; 定义过程 SUB2

14 第 5 章汇编语言程序设计 141 MOV AX, DSEG2 MOV ES, AX ; 初始化 ES MOV SI, 0 MOV CX, 3 ; 循环次数 MOV BL, 0 ; 存放累加和, 初始化值为 0 LOOP1: MOV AH, DATA1[SI] ; 循环累加, 结果存入 RESULT MOV AL, DATA2[SI] ADD AH, AL ADD BL, AH INC SI LOOP LOOP1 MOV RESULT,BL RET SUB2 ENDP CODE2 ENDS END 程序功能为 :ESULT=(DATA1[0]+DATA2[0])+(DATA1[1]+DATA2[1])+(DATA1[2]+DATA2[2]) 编译, 连接过程如下 : E:\MASM5>MASM 1.ASM ; 编译模块 1 MICROSOFT (R) MACRO ASSEMBLER VERSION 5.00 COPYRIGHT (C) MICROSOFT CORP , ALL RIGHTS RESERVED. OBJECT FILENAME [1.OBJ]: SOURCE LISTING [NUL.LST]: CROSS-REFERENCE [NUL.CRF]: BYTES SYMBOL SPACE FREE 0 WARNING ERRORS 0 SEVERE ERRORS E:\MASM5>MASM 2.ASM ; 编译模块 2 MICROSOFT (R) MACRO ASSEMBLER VERSION 5.00 COPYRIGHT (C) MICROSOFT CORP , ALL RIGHTS RESERVED. OBJECT FILENAME [2.OBJ]: SOURCE LISTING [NUL.LST]: CROSS-REFERENCE [NUL.CRF]: BYTES SYMBOL SPACE FREE 0 WARNING ERRORS 0 SEVERE ERRORS E:\MASM5>LINK 1 2 ; 链接模块 1 模块 2, 模块 1 为主模块 MICROSOFT (R) OVERLAY LINKER VERSION 3.60 COPYRIGHT (C) MICROSOFT CORP ALL RIGHTS RESERVED. RUN FILE [1.EXE]: LIST FILE [NUL.MAP]: LIBRARIES [.LIB]: LINK : WARNING L4021: NO STACK SEGMENT E:\MASM5>1 ; 运行 9 ; 输出结果 9. 程序结束伪指令格式 :END [ 标号 ] 功能 : 表示程序的结束, 汇编程序遇到 END 时结束汇编, 其后的标号为程序执行的起始

15 142 微机原理与接口技术 地址 结构与记录 1. 结构当程序中的数据是由多个数据成员组成时, 如学生信息表中的学生数据, 包含学号 姓名 性别 年龄等多个成员数据, 若用前面的方式来定义多个学生数据就比较麻烦 8086 宏汇编提供了结构 (STRUCTURES) 来实现对这种数据的处理, 结构就是相互关联的一组数据的某种组合形式 使用结构数据前, 需要先定义结构类型, 再用定义好的结构类型去定义结构变量, 并完成结构变量的初始化 (1) 结构类型的定义 格式 : 结构类型名 STRUC 成员数据变量序列结构类型名 ENDS 对于上述学生信息数据, 可定义一个结构类型 STUDENT 例 5-12 STUDENT STRUC NO DB? NAMEX DB 'JACK' SEX DB 'M' AGE DB? STUDENT ENDS 其结构类型名为 STUDENT, 它包含有 4 个成员变量 ( 又叫结构字段名 ):NO NAMEX SEX AGE 定义结构类型时, 结构字段变量可以指定其初始值, 也可以用? 代替 注意 : 这里只是定义了一个结构类型, 系统并不为它分配存储单元 (2) 结构类型变量的定义与初始化 格式 : 结构变量名结构类型名 < 字段值表 > 说明 : 1 字段值表用来给结构变量中各结构字段赋初值, 其类型 顺序应与结构类型定义中的字段保持一致, 各个字段初始化值之间用逗号间隔 2 给结构变量中各结构字段赋初值时, 有一定的限制 : 在结构类型定义中只具有一项数据的结构字段, 可以通过字段值表来修改代替初始定义时的值 ; 用 DUP 定义的字段或一个字段后有多个数据的字段, 则不能修改其定义时的值, 即不能通过字段值表来修改这些字段的值 例 5-13 DATA STRUC X DB 10H ; 简单元素, 可以修改 Y DB 1,2 ; 多重元素, 不能修改 Z DW? ; 简单元素, 可以修改 M DB ' ZXC' ; 可用同长度的字符串修改 N DW 20 DUP (?) ; 多重元素, 不能修改 DATA ENDS 3 若不需要修改某些字段的值 ( 即仍采用其定义时的值 ), 则在字段值表中的对应位置仅 写一个逗号即可

16 第 5 章汇编语言程序设计 若所有字段的值均采用其定义时的值, 不需要修改, 则仅写一对尖括号即可 例 5-14 DATA SEGMENT STUDENT STRUC NO DB? NAMEX DB 'JACK' SEX DB 'M' AGE DB? STUDENT ENDS ; 定义结构类型 X1 STUDENT <1,,,21> X2 STUDENT <2,'ANDY',,22> X3 STUDENT <3, 'ROSE', 'F',20> X4 STUDENT <,,,> ; 定义结构类型变量 X1 X2 X3 X4 DATA ENDS (3) 结构类型变量的引用 在程序中可以直接引用结构类型变量, 也可以引用结构类型变量中的某一字段, 其格式 为 : 结构变量名. 字段名 例如, 将前面定义的 STUDENT 结构类型变量 X1 中的 AGE 字段值送到 AL 中 MOV AL,X1.AGE 也可以写成 : MOV BX,OFFSET X1 MOV AL,[BX].AGE 例 5-15 将四个学生的学号 姓名 性别 年龄用结构的形式存入内存, 并编程求所有 男生年龄之和 DATA SEGMENT STUDENT STRUC ; 定义结构类型 NO DB? NAMEX DB 'JACK' SEX DB 'M' AGE DB? STUDENT ENDS X1 STUDENT <1,,,21> ; 定义结构类型变量 X1 X2 X3 X4 X2 STUDENT <2,'ANDY', 'F',22> X3 STUDENT <3,'ROSE',,20> X4 STUDENT <4,'JOHN',,23> DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX, DATA MOV DS, AX MOV AX, 0 ;AX 清零 MOV CX, 4 ; 设置循环次数 MOV BX, OFFSET X ;BX 指向 X1 的第一字节 LP1: CMP [BX].SEX, 'F' ; 取出结构变量的 SEX 字段, 判断是否为女生 JZ LP2 ; 若为女生, 则转到 LP2 MOV DH, [BX].AGE ; 若不为女生, 则取出结构变量的 AGE 字段到 DH ADD AL, DH ; 将 DH 的值累加到 AL 中 LP2: ADD BX, 7 ; 让 BX 指向下一个结构变量的第一字节 LOOP LP1 ; 循环

17 144 微机原理与接口技术 MOV CL, 10 DIV CL ; 所有男生年龄之和已存放在 AX 中,AX/10 得到的商 ( 即 ; 其十位上的数 ) 在 AL 中, 余数 ( 即其个位上的数 ) ; 在 AH 中 MOV CL, AH ; 将 AH 中的余数保存到 CL 中 ADD AL, '0' ; 将 AL 中的商转换成其对应的数字字符, 并显示 MOV DL, AL MOV AH, 2 INT 21H ADD CL, '0' ; 将保存到 CL 中的余数转换成其对应的数字字符, 并显示 MOV DL, CL MOV AH, 2 INT 21H MOV AH, 4CH ; 程序结束, 返回 DOS INT 21H CODE ENDS END START 2. 记录 一般来说, 访问存储器的最小单位是字节, 但在实际应用中, 某些数据只需要用一个二 进制位来表示, 如何按位访问这些数据呢?8086 宏汇编提供了记录 (RECORD) 来实现对这 类数据的处理 使用记录前, 也需要先定义记录类型, 再用定义好的记录类型去定义记录变量, 并完成记录变量的初始化 (1) 记录类型的定义 格式 : 记录类型名 RECORD < 字段名 >: 宽度 [= 表达式 ][,< 字段名 >: 宽度 [= 表达式 ] ] 说明 : 1 记录类型可由多个字段 ( 至少要有一个字段 ) 组成, 每个字段之间要用逗号分开 2 字段的属性包括字段名 宽度和初值 宽度表示该字段所占的二进制位数, 它必须是 一个常数, 且其取值范围为 1~16, 并且各字段的宽度之和应在 1~16 之间 用 表达式 来 给相应字段赋初值, 且表达式的值不能超过该字段的表示范围能容纳下的正整数, 若缺省初值, 则默认该字段的初值为 0 3 如果记录的总宽度小于等于 8 位, 系统只为该记录分配一个字节空间 ; 如果记录的总 宽度大于 8 位且小于等于 16 位, 则系统为该记录分配两个字节空间 例如, 定义一个表示学生某门功课成绩的记录 SCORE RECORD NO:3,SEX:1,COURSE:2,GRADE:2 记录类型名为 SCORE, 它包含有 4 个字段 :NO( 占 3 位 ) SEX( 占 1 位 ) COURSE( 占 2 位 ) GRADE( 占 2 位 ) (2) 记录类型变量的定义与初始化 格式 : 记录变量名 记录类型名 < 字段值表 > (3) 记录变量中字段值的存放 记录中各字段靠右对齐到字节或字的最低有效位置, 即记录的最后一个字段排在所分配 空间的最低位, 然后对记录中的字段依次 从右向左 分配二进制位, 左边没有分完的二进制 位补 0 例 5-16 DATA SEGMENT

18 第 5 章汇编语言程序设计 145 SCORE RECORD NO:3,SEX:1,COURSE:2,GRADE:2 Y1 SCORE<111B,1B,11B,11B> DATA ENDS 本例中数据段中的数据在内存中的存放如图 5-2 所示 ; 定义记录类型 ; 定义记录类型变量 Y1 NO SEX COURSE GRADE Y 图 5-2 例 5-16 中内存数据的存放 (4) 记录运算符 1)WIDTH: 求记录或记录字段所占的位数 格式 :WIDTH 记录类型名或记录字段名 例如, 对前面已定义的记录类型 SCORE: WIDTH SCORE ; 表达式的值为 8 WIDTH NO ; 表达式的值为 3 2)MASK: 返回一个记录值, 将指定字段各位置为 1, 其他字段各位全部置为 0 格式 :MASK 记录字段名 例如, 对前面已定义的记录类型 SCORE: MASK NO ; 表达式的值为 B MASK SEX ; 表达式的值为 B MASK COURSE ; 表达式的值为 B MASK GRADE ; 表达式的值为 B 3) 记录字段名 记录字段名可以作为一个操作数在程序中单独出现, 它表示该字段最低 位距该记录的最低位有多少位 例如, 对前面已定义的记录类型 SCORE: MOV AL,NO ; 等价于 MOV AL,5 MOV AH,COURSE ; 等价于 MOV AH,2 MOV BH,GRADE ; 等价于 MOV BH,0 例 5-17 将四个学生的学号 性别 成绩用记录的形式存入内存, 并编程求所有女生成 绩之和 ( 以十六进制形式显示 ) DATA SEGMENT SCORE RECORD NO:3,SEX:1,GRADE:4 ; 定义记录类型,SEX 字段为 1 时表示男生 Y1 SCORE<00B,0B,1000B> ; 定义四个记录类型变量 Y1 Y2 Y3 Y4 Y2 SCORE<010B,0B,1011B> Y3 SCORE<101B,0B,1101B> Y4 SCORE<111B,0B,0011B> DISP DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H,41H,42H,43H,44H,45H,46H DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX, DATA MOV DS,AX MOV CX,4 ; 设置循环次数 MOV DH,0 ; 求和初值 DH 置零 MOV BX,OFFSET Y1 ;BX 指向第一个记录变量 L1: MOV AL,[BX] ; 取出记录变量的值到 AL 中 TEST AL,MASK SEX ; 测试记录变量 SEX 字段的值

19 146 微机原理与接口技术 JNZ L2 ; 若为男生, 则不累加, 转去处理下一条记录 AND AL,MASK GRADE ; 若为女生, 则取出记录变量 GRADE 字段的值 ADD DH,AL ; 将女生成绩累加到 DH 中 L2: INC BX ;BX 指向下一个记录 LOOP L1 ; 循环 LEA SI,DISP MOV BH,0 ; 将和的高四位以十六进制形式显示 MOV BL,DH AND BL,0F0H MOV CL,4 SHR BL,CL MOV DL,[BX][SI] MOV AH,02H INT 21H MOV BH,0 ; 将和的低四位以十六进制形式显示 MOV BL,DH AND BL,0FH MOV DL,[BX][SI] MOV AH,02H INT 21H MOV DL,'H' ; 显示字符 H MOV AH,02H INT 21H MOV AH,4CH ; 程序结束, 返回 DOS INT 21H CODE ENDS END START 宏指令 前面讲到, 对于程序中需要重复多次用到的具有独立功能的语句组, 可将它定义成一个子过程, 通过 CALL 来调用执行 实际上, 也可以把它们定义成一个宏指令, 在程序中反复调用, 以达到简化主程序 提高编程效率的目的 1. 宏与子程序的区别 (1) 宏与子程序的相同点 : 用一条指令来代替一段程序, 子程序和宏指令定义好之后都可以被多次调用, 可以起到简化源程序的作用 (2) 宏与子程序的不同点 : 1 从代码开销的角度来讲, 子程序优于宏指令 编译宏指令时, 需要将每一个宏调用指令展开, 有多少次调用, 就要在目标程序中插入多少次宏体程序段, 因而调用次数越多, 占用内存空间就越大 ; 编译子程序时只占用一个程序段 ( 即使是调用多次 ), 因而汇编后产生的目标程序占用内存空间少 2 从时间开销的角度来讲, 宏指令优于子程序 每次调用子程序时都要保护 / 恢复现场和断点, 额外增加了时间开销 ; 而宏指令在执行时不存在保护 / 恢复现场和断点的问题, 执行的时间短, 速度快 一般来说, 当要重复执行的程序不长, 重复次数又多时, 速度是主要问题, 通常用宏指令 ; 而要重复执行的程序较长, 重复次数又不是太多时, 额外操作所附加的时间就不明显了,

20 第 5 章汇编语言程序设计 147 节省内存空间应视为主要问题, 通常采用子程序结构 2. 宏定义格式 : 宏指令名 MACRO [ 形式参数 1][, 形式参数 2 ] 宏体 ; 语句序列 ENDM 说明 : (1) 宏指令名由用户自己命名, 但必须符合标识符命名规则 (2)MACRO 指定宏定义的开始,ENDM 指定宏定义的结束, 它们必须成对出现 (3) 宏体为实现宏指令功能的语句序列 (4) 形式参数列表用来给出宏定义中所用到的参数, 形式参数可有一个或多个, 也可以没有, 有多个形式参数时, 参数之间以逗号隔开 (5) 宏定义不必在任何逻辑段中, 通常写在源程序的开头 (6) 宏定义中的注释语句以 ;; 开头 例 5-18 ADDCAB MACRO ; 定义宏指令 ADDCAB( 没有参数 ), 功能 :CX=AX+BX ADD AX,BX MOV CX,AX ENDM PUTCHAR MACRO CHAR ; 定义宏指令 PUTCHAR, 参数为 CHAR, 功能 : 输出参数 ;CHAR 对应的字符 PUSH AX PUSH DX ; 保护寄存器 AX 和 DX 的值 MOV DL,CHAR MOV AH,2 INT 21H POP DX POP AX ; 恢复寄存器 AX 和 DX 的值 ENDM 3. 宏调用格式 : 宏指令名 [ 实际参数 1][, 实际参数 2 ] 在程序中使用已经定义过的宏指令, 称为宏调用 如果宏指令有形式参数, 在宏调用时, 必须在宏指令名后面写上实际参数, 并与形式参数一一对应, 有多个实际参数时, 参数之间以逗号隔开 具有宏调用的源程序被汇编时, 汇编程序将用宏定义时设计的宏体去代替宏指令名, 并且用实际参数一一代替形式参数, 称为宏展开 汇编程序在所展开的指令前加上 1 号以示区别 例 5-19 用宏指令定义两个字操作数相除, 第一个操作数为被除数, 第二个操作数为除数, 并将商存入第三个操作数, 余数存入第四个操作数 M_DIVIDE MACRO OPR1,OPR2,OPR3,OPR4 ; 定义宏 M_DIVIDE, 其功能为 :OPR3=OPR1/OPR2 ; 余数存放在 OPR4 中 PUSH DX PUSH AX MOV AX, OPR1

21 148 微机原理与接口技术 CWD DIV OPR2 MOV OPR3, AX MOV OPR4,DX POP AX POP DX ENDM DATA SEGMENT A1 DW 2424H A2 DW 1212H A3 DW? A4 DW? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX M_DIVIDE A1,A2,A3,A4 ; 调用宏 M_DIVIDE MOV AH,4CH INT 21H CODE ENDS END START 经宏展开后 : START: MOV AX,DATA MOV DS,AX 1 PUSH DX 1 PUSH AX 1 MOV AX, A1 1 CWD 1 DIV A2 1 MOV A3, AX 1 MOV A4,DX 1 POP AX 1 POP DX MOV AH,4CH INT 21H 补充说明 : (1) 宏定义中的参数还可以是操作码 宏定义 : OP MACRO OPR1,OPR2,OPR3 MOV AX, OPR1 OPR2 AX,OPR3 ENDM 宏调用 : OP X,ADD, Y ; 假设 X Y 为已经在数据段定义好的两个字变量 宏展开 : 1 MOV AX,X 1 ADD AX,Y (2) 在宏定义中还可以使用分隔符 &, 展开时把 & 前后的两个符号连接起来, 形成操作

22 第 5 章汇编语言程序设计 149 码 操作数或字符串 宏定义 : SHIFT MARCO OPR1,OPR2,OPR3 ; 定义宏指令 SHIFT, 用来将 OPR1 逻辑移位 OPR2 次,OPR3 指定是左移还是右移 MOV CL,OPR2 SH&OPR3 OPR1,CL ENDM 宏调用 : SHIFT AL,4,L 宏展开 : 1 MOV CL,4 1 SHL AL,CL (3) 在宏定义中可以调用之前已经定义过的宏 例 5-20 定义一个宏指令求两个数相除的商 PUSHDA MACRO ; 定义宏指令 PUSHDA PUSH DX PUSH AX ENDM POPDA MACRO ; 定义宏指令 POPDA POP AX POP DX ENDM M_DIVIDE MACRO OPR1,OPR2,OPR3,OPR4 ; 定义宏指令 DIVIDE PUSHDA ; 调用宏指令 PUSHDA MOV AX, OPR1 CWD DIV OPR2 MOV OPR3,AX MOV OPR4,DX POPDA ; 调用宏指令 POPDA ENDM 宏调用 : M_DIVIDE A1,A2,A3,A4 ; 假设 A1 A2 A3 A4 为已经在数据段定义好的字变量 宏展开 : 1 PUSH DX 1 PUSH AX 1 MOV AX, A1 1 CWD 1 DIV A2 1 MOV A3, AX 1 MOV A4,DX 1 POP AX 1 POP DX 4. 局部标号伪指令 LOCAL 对于使用了标号的宏, 若多次调用, 展开时将多次出现相同的标号, 这在汇编语言程序 中是不允许的, 汇编时将报错 8086 宏汇编提供了局部标号伪指令 LOCAL 来解决这一问题

23 150 微机原理与接口技术 格式 :LOCAL 标号 1[, 标号 2 ] 说明 : (1) 标号 1 标号 2 为宏定义中的标号 (2)LOCAL 伪指令只能用在宏定义体内, 还必须是 MACRO 伪操作后的第一个语句, 且在 MACRO 与 LOCAL 之间不能出现注释和分号标志 (3) 对 LOCAL 后的标号, 汇编程序将用??0000??FFFF 来依次取代宏展开 时的标号 这样, 在宏展开后, 程序中标号都是唯一的 例 5-21 宏定义 : ABS MACRO OPRW ; 定义宏指令 ABS 求字数据 OPRW 的绝对值 LOCAL L CMP OPRW,0 JGE L NEG OPRW L: MOV AX,OPRW ENDM 宏调用 : ABS X ABS Y ; 假设 X Y 为已经在数据段定义好的两个字变量 宏展开 : 1 CMP X,0 1 JGE?? NEG X 1??0000: MOV AX,X 1 CMP Y,0 1 JGE?? NEG Y 1??0001: MOV AX,Y 5. 文件包含伪指令 INCLUDE 当多个程序要调用同一个宏时, 可以把这些宏组合起来, 建立一个独立的文件, 称为宏 库, 其扩展名是 MAC 或 INC 当需要调用宏库中的宏时, 只需要在该程序的开始用 INCLUDE 伪指令把该宏库文件包含进来即可 格式 :INCLUDE 宏库文件名 汇编时, 将用 INCLUDE 伪指令指定的文件的内容插入到该伪指令所在的位置, 与源程序 一起进行汇编, 所以要注意宏库文件中的标识符不能与源程序中的标识符重名 例如 : INCLUDE OUTPUT.MAC INCLUDE D:\MASM5\INPUT.MAC 6. 重复汇编伪指令 (1)REPT 格式 :REPEAT 重复次数 重复体 ENDM 说明 : 使汇编程序按照指定次数对重复体进行重复汇编 例 5-22 CHAR = 0

24 第 5 章汇编语言程序设计 151 REPEAT 10 DB CHAR CHAR = CHAR +1 ENDM 展开 : 1 DB CHAR ; 等价于 DB 0 1 CHAR = CHAR +1 1 DB CHAR ; 等价于 DB 1 1 CHAR = CHAR +1 1 DB CHAR ; 等价于 DB 9 1 CHAR = CHAR +1 (2)IRP 格式 :IRP 形式参数,< 实际参数表 > 重复体 ENDM 说明 : 重复汇编时, 每作一次汇编就依次将实参表中的一个实参取代重复体中的形参 例 5-23 IRR REG,<AX,BX,CX,DX> POP REG ENDM 展开 : 1 POP AX 1 POP BX 1 POP CX 1 POP DX (3)IRPC 格式 :IRPC 形参, 字符串 重复体 ENDM 说明 : 重复汇编时, 每作一次汇编就依次用字符串中的一个字符取代重复体中的形参 例如 : IRPC CHAR,ABCD PUSH CHAR&X ENDM 展开 : 1 PUSH AX 1 PUSH BX 1 PUSH CX 1 PUSH DX 7. 条件汇编伪指令 利用条件汇编伪指令可以有选择地汇编某段源程序 格式 : IFXX 表达式 ; 定义条件 语句组 1 ; 满足条件时编译语句组 1 [ ELSE ; ELSE 部分也可以省略 语句组 2 ] ; 不满足条件时编译语句组 2

25 152 微机原理与接口技术 ENDIF 常用条件汇编伪指令如表 5-4 所示 条件汇编伪指令 表 5-4 常用条件汇编伪指令 IF 表达式表达式的值不为 0 IFE 表达式表达式的值为 0 IFDEF 符号 符号已定义 成立的条件 IFIDN < 串 1>,< 串 2> < 串 1>=< 串 2>( 区分大小写 ) IFIDNI < 串 1>,< 串 2> < 串 1>=< 串 2>( 不区分大小写 ) 例 5-24 利用条件汇编定义宏指令, 完成多种 DOS 系统功能调用 DOSYS MACRO N,BUF IFE N EXITM ENDIF IFDEF BUF LEA DX,BUF MOV AH,N INT 21H ELSE MOV AH,N INT 21H ENDIF ENDM DATA SEGMENT MSG DB 'INPUT STRING:$' BUF DB 81,0,80 DUP(0) DATA ENDS STACK SEGMENT STACK DB 200 DUP(0) STACK ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE,SS:STACK BEGIN: MOV AX,DATA MOV DS,AX DOSYS 9,MSG DOSYS 10,BUF DOSYS 4CH CODE ENDS END BEGIN 以上三条宏指令展开后的语句为 : 1 LEA DX,MSG 1 MOV AH,9 1 INT 21H 1 LEA DX,BUF 1 MOV AH,10 1 INT 21H 1 MOV AH,4CH

26 第 5 章汇编语言程序设计 INT 21H 简化段定义实际上, 汇编语言源程序可以用两种格式书写 : 一种是前面介绍的完整段定义格式, 另一种是简化段定义格式 例 5-25.MODEL SMALL ; 定义程序的存储模式.STACK 20H.DATA ; 定义数据段 STRING DB 'HELLO, ASSEMBLY',0DH,0AH, '$'.CODE ; 定义代码段.STARTUP ; 程序起始点, 建立 DS SS MOV DX,OFFSET STRING ; 指定字符串 MOV AH,9 INT 21H ; 利用功能调用显示信息.EXIT 0 ; 程序结束点, 返回 DOS.END ; 汇编结束 1. 存储模式伪指令 MODEL 用来表示存储模式, 说明在存储器中代码段 数据段等是如何存放的, 段的大小有什么限制, 数据 代码寻址是近属性还是远属性 存储模式伪指令语句必须位于所有段定义语句之前 格式 :.MODEL 存储模型常用的存储模型有 : (1)TINY: 编译时, 所有段地址寄存器都被设置为同一值, 即代码段 数据段 堆栈段都在同一个段内 段的大小不超过 64KB, 指令转移 程序调用 数据访问等都是近属性 (NEAR) TINY 模式是 MASM 6.0 才引入的, 用于创建 COM 类型程序 ( 其他模式产生 EXE 程序 ),COM 程序必须从段内偏移地址为 0100H 的存储单元开始 一般用于小程序 (2)SMALL: 最多只有两个段 : 一个代码段, 一个数据段, 并且两者是独立的, 即两个段基址不同 两个段的大小都不超过 64KB, 指令转移 程序调用 数据访问等都是近属性 (NEAR), 此模式下程序的最大长度为 128KB 如果还有堆栈段和附加段, 则数据段 堆栈段 附加段共用同一个段基址, 段长度仍不超过 64KB 是一般应用程序常用的模型 (3)MEDIUM: 可以有多个代码段, 但只有一个数据段, 并且段的大小都不超过 64KB 所以数据访问是近属性 (NEAR), 而指令转移 程序调用可以是近属性 (NEAR), 也可以是远属性 (FAR), 缺省时为远属性 (FAR) 适合于数据量小但代码量大的程序 (4)COMPACK: 可以有多个数据段, 但只有一个代码段, 并且段的大小都不超过 64KB 所以指令转移 程序调用是近属性 (NEAR), 而数据访问可以是近属性 (NEAR), 也可以是远属性 (FAR), 缺省时为远属性 (FAR) 适合于数据量大但代码量小的程序 (5)LARGE: 允许有多个代码段和多个数据段 数据段可以超过 64KB, 但静态数据 ( 不能改变的数据 ) 仍限制在 64KB 之内 指令转移 程序调用 数据访问可以是近属性 (NEAR), 也可以是远属性 (FAR), 缺省时均为远属性 (FAR) 适用于较大型程序 (6)HUGE: 与 LARGE 模型相同, 只是静态数据不再被限制在 64KB 之内 (7)FLAT: 允许用 32 位偏移量, 只能在 及其以后的计算机系统中运行, 只能用于 32 位程序, 只能在 OS/2 下或其他保护模式的操作系统下使用, 在 DOS 下不允许使用这种

27 154 微机原理与接口技术 模型 MASM 6.0 可以支持这种模型, 但 MASM 5.0 版本不支持 2. 段定义伪指令 (1) 定义堆栈段.STACK [SIZE] 参数 SIZE 指定堆栈段所占存储区的字节数, 缺省时为 1KB 段名为 STACK (2) 定义数据段 简化段定义中把数据段分得很细 首先把数据段分为常量数据段和变量数据段, 变量数据段又可分为远数据段和近数据段, 然后根据变量是否初始化, 进一步将其分为初始化数据段和未初始化数据段 所以简化段定义中的数据段有以下几种 : 1)CONSTANTS( 常数段 ) 2)INITIALIZED DATA( 初始化数据段 ) 3)UN INITIALIZED DATA( 未初始化数据段 ) 4)FAR INITIALIZED DATA( 远初始化数据段 ) 5)FAR UN INITIALIZED DATA( 远未初始化数据段 ) 所以相对应数据段定义伪指令有 : 1).CONST... ; 定义常量用来定义只读的常量数据段, 段名为 CONST 2).DATA... ; 定义数据用来定义初始化数据段, 段中的变量具有初值, 段名为 _DATA 3).DATA?... ; 定义数据用来定义未初始化数据段, 段中的变量没有初值, 段名为 _BSS 4).FARDATA [NAME]... ; 定义数据用来定义远初始化数据段, 段中的变量有初值, 默认段名为 FAR_DATA 5).FARDATA? [NAME]... ; 定义数据用来定义远未初始化数据段, 段中的变量没有初值, 默认段名为 FAR_BSS (3) 定义代码段.CODE [ 段名 ] 用于定义代码段, 参数 NAME 用来指定代码段的段名 缺省时则采用默认段名 在 TINY SMALL COMPACT 和 FLAT 模式下, 默认的代码段名是 _TEXT 在 MEDIUM LARGE 和 HUGE 模式下, 默认的代码段名是模块名 _TEXT 说明 : 1 采用简化段定义伪指令前, 需要有.MODEL 语句 2 段定义伪指令指明一个逻辑段的开始, 同时自动结束前面的一个段, 所以不必用 ENDS 作为段的结束符

28 第 5 章汇编语言程序设计 在简化段定义中, 可以使用汇编程序提供的预定义符号, 预定义符号如表 5-5 所示 表 5-5 预定义符号表 符号 说明 符号 返回 FAR DATA 返回 FAR DATA? 返回当前段类型属性 例如 : MOV AX,@DATA MOV DS,AX 3..STARTUP 指定程序开始执行的起始点,( 在 DOS 下 ) 用于自动初始化寄存器 DS SS 和 SP 它等价于 : MOV AX,@DATA MOV DS,AX 4..EXIT [ 返回参数 ] 用于终止程序执行, 返回操作系统 它的参数是一个返回的数码, 用 0 表示没有错误 它等价于 : MOV AH,4CH INT 21H 5..END [ 标号 ] 指示汇编程序到此结束汇编, 标号用于指定程序开始执行点, 连接程序将据此设置 CS:IP 值 若采用.STARTUP 指明了程序开始执行点, 则可以省略标号 注意 :MASM 5.0/5.1 不支持.STARTUP.EXIT 0 和.END 5.3 汇编语言程序设计基本方法 程序设计的基本步骤 (1) 分析问题 对题目给出的已知条件和要完成的任务进行详细的了解和分析, 将实际问题转化为计算机可以处理的问题 (2) 确定算法 算法, 即利用计算机解决问题的方法和步骤 计算机一般只能进行最基本的算术运算和逻辑运算, 要完成较为复杂的运算和控制操作, 就必须选择合适的算法 (3) 设计流程 将算法以流程图的方式画出来 画流程图是指用各种图形 符号 指向线等来说明程序设计的过程 国际通用的图形和符号说明如下 :

29 156 微机原理与接口技术 1) 椭圆框 : 起止框, 在程序的开始和结束时使用, 如图 5-3(a) 所示 2) 矩形框 : 处理框, 表示要进行的各种操作, 如图 5-3(b) 所示 3) 菱形框 : 判断框, 表示条件判断, 以决定程序的流向, 如图 5-3(c) 所示 4) 指向线 : 流程线, 表示程序执行的流向, 如图 5-3(d) 所示 (a) 起止框 (b) 处理框 (c) 判断框 (d) 流程线图 5-3 国际通用的流程图图形 (4) 分配空间 合理分配存储空间, 即分段和数据定义, 合理地使用寄存器 (5) 编写程序 根据前面确定的算法流程图, 采用汇编程序设计语言编写程序 (6) 调试运行 程序编写好以后, 检查语法错误, 上机汇编 连接 调试运行, 检验程序是否正确, 能否实现预期功能 顺序 分支与循环程序设计 利用计算机解决实际问题时, 其操作控制执行步骤有时是按顺序执行的, 有时需要根据 实际情况选择某一个分支的操作执行, 有时需要对某一些操作步骤反复执行, 与之相对应, 就 有 3 种程序结构 : 顺序结构 分支结构 循环结构 1. 顺序结构 顺序结构程序完全按指令书写的前后顺序, 从头至尾逐条执行, 是最常用 最基本的程 序结构 常用于处理查表程序 计算表达式程序 例 5-26 编写程序计算表达式 : a*b + f = c d e DATA SEGMENT A DB 5 B DB 10 C DB 15 D DB 30 E DB 20 F DB? DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA START: MOV AX,DATA ; 初始化 DS MOV DS,AX MOV AX,0 MOV AL,A MUL B ;AX=A*B MOV BL,C MOV BH,0 ADD AX,BX ;AX=A*B+C MOV CL, D SUB CL, E ;CL=D-E

30 第 5 章汇编语言程序设计 157 DIV CL ;AL=AX/CL=(A*B+C)/(D-E) MOV F,AL ;F=AL=(A*B+C)/(D-E) MOV AH,4CH ; 程序结束, 返回 DOS INT 21H CODE ENDS END START 2. 分支结构 根据指定的条件选择程序执行的方向, 这种程序结构称为分支程序结构 常根据 CMP TEST 等指令执行后形成的状态标志, 通过转移指令 JXX 判断标志位的变化, 来实现条件判断 控制程序转向某个分支执行 ; 或通过 JMP 实现无条件转移 根据分支转向的不同结构, 可将分支结构分为 3 种 : 单分支结构 双分支结构和多分支 结构 (1) 单分支程序 满足条件时转向分支执行, 否则顺序执行 流程图如图 5-4(a) 所示 例 5-27 求数的绝对值 DATA SEGMENT X DB -25 X_ABS DB? DATA ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE START: MOV AX,DATA MOV DS,AX ; 初始化 MOV AL,X ;X 取到 AL 中 CMP AL,0 ; 测试 AL 正负 JGE NEXT ;X 0, 转 NEXT NEG AL ; 否则 X<0,AL 求补 NEXT: MOV X_ABS,AL ; 送结果 MOV AH,4CH INT 21H ; 返回 DOS CODE ENDS END START (2) 双分支程序 条件成立转向分支语句体 2 执行, 否则顺序执行分支语句体 1, 并且 执行完分支语句体 1 后要跳过分支语句体 2, 用 JMP 无条件跳转到分支语句体 2 后执行 流 程图如图 5-4(b) 所示 例 5-28 奇偶数判断, 是奇数时输出 N, 是偶数时输出 Y DATA SEGMENT X DB -30 DATA ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE START: MOV AX,DATA MOV DS,AX ; 初始化 MOV AL,X SHR AL,1 ; 将 X 最低位右移至 CF 中 JC NEXT ;CF 为 1, 则为奇数, 转 NEXT MOV DL,'Y' ; 否则 CF 为 0, 则为偶数, 输出字符 'Y' JMP DISP NEXT: MOV DL,'N' ; 为奇数时输出字符 'N' DISP: MOV AH,02H INT 21H ; 显示 DL 中的字符

31 158 微机原理与接口技术 MOV AH,4CH INT 21H ; 返回 DOS CODE ENDS END START JXX 条件满足吗? N Y JXX 条件满足吗? N 分支语句体 1 Y 语句体 JMP 分支语句体 分支语句体 2 (a) 单分支结构 图 5-4 单 双分支结构流程图 (b) 双分支结构 (3) 多分支程序 需要对多个条件进行判断, 每个条件都对应一个分支, 满足某个条件时就进入相对应的分支执行 流程图如图 5-5 所示 条件判断 满足条件 1 满足条件 2 满足条件 N 分支语句体 1 分支语句体 2 分支语句体 N 图 5-5 多分支结构流程图 对于多分支程序结构, 可以采用以下两种解决方法 : 1) 逻辑分解方法 将多分支结构以逻辑等效的方法分解为一串双分支结构 1 (X>0) 例 5-29 求符号函数 Y 的值 : Y= 0 (X=0) DATA SEGMENT X DB (X<0) Y DB? DATA ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE

32 第 5 章汇编语言程序设计 159 START: MOV AX,DATA MOV DS,AX ; 初始化 CMP X,0 ; 比较 X 与 0 的大小 JG L1 ;X>0, 转 L1 JE L0 ;X=0, 转 L0 MOV Y,-1 ; 否则 X<0,Y=-1 JMP EXIT L1: MOV Y,1 ;Y=1 JMP EXIT L0: MOV Y,0 ;Y=0 EXIT: MOV AH,4CH INT 21H ; 返回 DOS CODE ENDS END START 2) 地址表方法 在数据段定义一个地址表, 依次存放各分支语句体的入口地址, 用寄存 器间接寻址或寄存器相对寻址方式产生转移目标地址, 实现转移 分支入口地址 = 地址表首地址 + 偏移地址 例 5-30 假设一个程序有 5 个分支, 根据用户输入的数字 (0~4) 转入相应的分支去执 行, 试编写程序 DATA SEGMENT FUN DW FUN0,FUN1,FUN2,FUN3,FUN4 ; 将标号 FUN0 FUN1 FUN2 FUN3 FUN4 偏移地址存入变量 FUN 中 DATA ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE START: MOV AX,DATA MOV DS,AX MOV AH,01H ; 选择输入数字字符 中的一个 INT 21H SUB AL,'0' ; 将输入的数字字符转化成对应的数, 存入 AX 中 MOV AH,0 SHL AX,1 ;AX=AX*2, 各标号偏移地址占两个字节 LEA BX,FUN ADD BX,AX ;BX= 地址表 FUN 首地址 +2*N( 输入的数字 ) JMP [BX] ; 根据输入的数字, 形成分支语句体入口地址, 转移到相应的 ; 分支语句体去执行, 采用的是寄存器间接寻址方式 FUN0: ; 分支语句体 0 JMP EXIT ; 结束 FUN1: ; 分支语句体 1 JMP EXIT ; 结束 FUN2: ; 分支语句体 2 JMP EXIT ; 结束 FUN3: ; 分支语句体 3 JMP EXIT ; 结束 FUN4: ; 分支语句体 4 EXIT: MOV AH,4CH ; 返回 DOS

33 160 微机原理与接口技术 INT 21H CODE ENDS END START (4) 说明 : 1 对于既能用双分支结构, 又能用单分支结构实现的程序, 宜采用单分支结构, 以减少转移次数, 程序结构简单 2 对于多分支结构程序, 宜采用地址表法, 以减少转移次数, 程序结构简单 3 对分支结构程序进行测试时, 应对每一个分支都进行检测, 才能保证整个程序的正确性 3. 循环结构根据某一条件是否成立判断是否需要重复执行某个语句组, 这种程序结构称为循环结构 (1) 说明 : 1 一个循环结构一般由循环条件控制 循环体两部分组成 循环条件控制 : 对循环条件进行判断, 决定是否继续循环 循环体 : 重复执行的语句组 注意 : 循环体中应对循环条件的值进行修改, 否则将会成为死循环 ( 循环无限次 ) 2 根据循环条件控制所在的位置, 可将循环结构分为两种 : 先判断 后循环 : 先判断循环条件, 再决定是否执行循环体 先循环 后判断 : 先执行循环体 ( 至少一次 ), 再判断循环条件 3 用的循环指令有 : 循环指令 :LOOP LOOPE/LOOPZ LOOPNE/LOOPNZ 转移指令 :JCXZ JXX 其中 LOOP JCXZ 常用于循环次数固定的循环结构, 称这种循环结构为计数循环 ; LOOPE/LOOPZ LOOPNE/LOOPNZ JXX 常用于循环次数不定的循环结构, 称这种循环结构为条件控制循环 (2) 应用举例 1) 计数循环 : 循环次数已知, 用计数器 CX 计数来控制循环次数, 要求在循环之前设置 CX 的值, 即将循环次数送入 CX 中, 然后每循环一次计数器值减 1, 直至其值减为 0 则不再循环 例 5-31 设计一个程序, 求 的和, 结果保存在变量 RESULT 中 DATA SEGMENT RESULT DW 0 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AX,1 MOV CX,100 L0: ADD RESULT,AX INC AX LOOP L0 MOV AH,4CH INT 21H CODE ENDS

34 第 5 章汇编语言程序设计 161 END START 2) 条件控制循环 : 循环次数未知, 需要设置一个循环条件, 每次对条件进行判断来确定是否继续转去执行循环体 例 5-32 计算数组 ARRAY 中元素的平均值 最大值 最小值, 数组以 -1 为结束标志 分析 : 数组元素个数不确定, 因而循环次数也不确定, 需要通过判断数组元素是否为 -1 来确定是否结束循环 这里需要取出数组的每个元素累加求和, 并统计数组元素个数, 以计算出平均值 ; 求最大值 ( 或最小值 ) 时, 可以先默认数组第一个元素即为最大值 ( 或最小值 ), 送入 MAX( 或 MIN) 中, 然后依次取出数组剩下的元素与 MAX( 或 MIN) 比较, 若该元素的值大于 MAX( 或小于 MIN), 则将它送入 MAX( 或 MIN) 中, 这样循环结束后,MAX( 或 MIN) 里面存放的就是数组的最大值 ( 或最小值 ) DATA SEGMENT ARRAY DB 10,58,63,94,85,32,-1 SUM DW 0 COUNT DB 0 AVERAGE DB? MAX DB? MIN DB? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA SI,ARRAY MOV BL,[SI] MOV MAX,BL ; 取出第一个元素送入 MAX MIN 中 MOV MIN,BL L0: MOV AL,[SI] CMP AL,-1 JZ L3 ; 判断数组元素是否为 -1, 若是则结束循环 CBW ADD SUM,AX ; 若数组元素不为 -1, 则加入 SUM 中 INC COUNT ; 统计元素个数, 个数值加 1 CMP MAX,AL JGE L1 MOV MAX,AL ; 若数组元素值大于 MAX, 则将它送入 MAX 中 L1: CMP MIN,AL JLE L2 MOV MIN,AL ; 若数组元素值小于 MIN, 则将它送入 MIN 中 L2: INC SI ;SI 指向数组的下一个元素 JMP L0 ; 循环处理数组的下一个元素 L3: MOV AX,SUM DIV COUNT MOV AVERAGE,AL ; 将数组元素的和 SUM 除以数组元素个数 COUNT, 得到商 ; 即为平均值, 送入 AVERAGE MOV AH,4CH ; 返回 DOS INT 21H CODE ENDS END START 3) 循环嵌套 实际应用中, 经常出现在一个循环中又包含另一个循环, 称为循环嵌套, 也称多重循环

35 162 微机原理与接口技术 例 5-33 数组 ARRAY 的长度为 N( 即数组 ARRAY 中共有 N 个数, 假设均为无符号字节数 ), 请将数组中的数按升序 ( 从小到大 ) 排序 分析 : 排序算法有很多种, 这里采用冒泡排序算法, 其算法思想为 : 1 第 1 趟 : 从数组的最左边开始, 依次将相邻两个数作比较, 若前者大于后者, 则交换 两者的值, 经 N-1 次两两相邻比较后, 最大的数已交换到最后一个位置 2 第 2 趟 : 对前 N-1 个数, 按上法两两相邻比较, 经 N-2 次比较后得到次大的数, 安置 在第 N-1 个元素的位置 3 重复上述过程, 经过 N-1 趟冒泡排序后, 数据呈升序排列 DATA SEGMENT ARRAY DB 10,58,23,94,85,32,70,5,42,62 N EQU $-ARRAY ;N 为数组长度 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CX,N-1 ; 设置外层循环次数为 N-1, 即冒泡排序趟数 L0: PUSH CX ; 保存外层循环次数计数器 LEA SI,ARRAY L1: MOV AL,[SI] MOV AH,[SI+1] CMP AL,AH ; 相邻两个数作比较 JLE L2 ; 若前者小于等于后者, 则不交换, 转去比较下一对相邻 ; 的两个数 MOV [SI+1],AL ; 否则 ( 即前者大于后者 ), 交换两者的值 MOV [SI],AH L2: INC SI LOOP L1 ; 内存循环两两比较, 循环次数刚好等于外层循环次数计数器 ; 的值, 所以不需要另外设置内层循环计数器 CX 的值 POP CX ; 恢复外层循环次数计数器 LOOP L0 ; 继续外层循环 MOV AH,4CH ; 返回 DOS INT 21H CODE ENDS END START 子程序设计 通常将一个大的程序按照功能划分为几个子程序 ( 子程序就是一个功能上相对独立的程序段, 可以被多次重复调用 在一个完整的程序中, 可以有多个子程序, 子程序能被别的程序所调用, 也可以调用其他子程序, 也称过程 ), 通过调用各个子程序来实现程序的功能 在定义子程序时, 一般需要包含以下几个部分 : 保护现场 子程序体 恢复现场 子程序返回 调用子程序时, 子程序与主程序之间往往存在着数据的交流, 称主程序传递给子程序的

36 数据为入口参数, 称子程序返回给主程序的结果数据为出口参数 第 5 章汇编语言程序设计 163 常采用的参数传递方法有 : 通过寄存器传递 通过共享变量传递 通过堆栈传递 (1) 通过寄存器传递参数 把入口参数 出口参数存放于约定的寄存器中, 这是最常用的参数传递方式 通过寄存 器传递参数时, 需要视具体情况来选择是否需要对入口参数 出口参数进行保护和恢复 由于 通用寄存器个数有限, 通过寄存器传递参数的方法只适合参数个数较少的场合 例 5-34 编写一个子程序, 在数据块中查找某个指定数据, 若找到则把该数据在数据块 中的序号返回, 若找不到则返回 -1 DATA SEGMENT ARRAY DB 10,58,23,94,85,32,70,5,42,62 N EQU $-ARRAY ;N 为数组长度 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX LEA SI,ARRAY MOV CX,N MOV DL,94 CALL LOOKUP ; 调用子程序 MOV AH,4CH ; 返回 DOS INT 21H ; 子程序名 :LOOKUP ; 功能 : 片内 RAM 中的数据检索 ; 入口参数 :SI 存放数据块首地址,CX 存放数据块长度,DL 存放要查找的数据 ; 出口参数 : 若找到, 则将数据的序号存入 DI, 否则存 -1 到 DI LOOKUP PROC PUSH CX PUSH SI MOV DI,-1 L0: CMP DL,[SI] JZ L1 INC SI LOOP L0 JMP L2 L1: MOV DI,SI SUB DI,OFFSET ARRAY L2: POP SI POP CX RET LOOKUP ENDP CODE ENDS END START (2) 通过共享变量传递参数 把入口参数 出口参数存放于约定的内存共享变量中 若 子程序和调用程序在同一程序模块中, 则子程序可直接访问模块中的变量, 进行参数传递 ; 若 子程序和调用程序在两个不同的程序模块中, 需要利用 PUBLIC EXTREN 对共享变量进行声 明才能访问共享变量

37 164 微机原理与接口技术 若调用程序还要引用共享变量原来的值, 则需要对共享变量进行保护和恢复 通过共享变量传递参数的方法适合于传递参数较多的情况, 以及在多个程序段间传递参 数的情况 但是采用这种参数传递方式的子程序的通用性比较差 例 5-35 编写一个子程序, 从键盘输入若干字符, 以 $ 结束, 并将输入的字符存入数 组 STRING 中 要求 : 若输入的字符为大写, 则需要将其改为小写后存入数组 DATA SEGMENT STRING DB 100 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV SI,OFFSET STRING CALL STOSTR ; 调用子程序 MOV AH,4CH ; 返回 DOS INT 21H ; 子程序名 :STOSTR ; 功能 : 输入字符串, 并将其中的大写字母改为小写字母, 然后存入数组 STRING ; 入口参数 :SI 存放数组 STRING 的首址 ; 出口参数 : 数组 STRING STOSTR PROC PUSH AX AGAIN: MOV AH,1 INT 21H CMP AL,'$' JZ OVER ; 结束 CMP AL,'A' JL NEXT ; 不是大写 CMP AL,'Z' JG NEXT ; 不是大写 ADD AL,32 ; 是大写 NEXT: MOV [SI],AL ; 存入 INC SI JMP AGAIN OVER: POP AX RET STOSTR ENDP CODE ENDS END START (3) 通过堆栈传递参数 把入口参数 出口参数存放于堆栈当中 在调用子程序前, 主 程序将入口参数压入堆栈, 子程序从堆栈中取出入口参数 ; 在子程序返回前, 子程序将出口参 数压入堆栈, 主程序从堆栈中取到出口参数 采用堆栈传递参数方法是编译程序处理参数传递, 以及汇编语言与高级语言混合编程时 的常规方法 通过堆栈传递参数的方法适合于传递参数较多的情况, 采用堆栈传递参数时要 : 保证子程序中堆栈操作的正确性, 对堆栈的压入和弹出操作要成对使用, 保持堆栈的平衡, 避 免因堆栈操作而造成子程序不能正确返回的错误 例 5-36 编写程序, 求数据块 BUF 中存放的若干个无符号字节数据的平均值 DATA SEGMENT

38 第 5 章汇编语言程序设计 165 BUF DW 10,58,23,94,85,32,70,5,32,62 N EQU ($-BUF)/2 ;N 为数据块长度 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AX,OFFSET BUF PUSH AX CALL AVERAGE ; 调用子程序 MOV AH,4CH ; 返回 DOS INT 21H ; 子程序名 :AVERAGE ; 功能 : 求数据块中若干数据的平均值 ; 入口参数 : 数据块的首地址, 压入堆栈 ; 出口参数 : 平均值, 压入堆栈 AVERAGE PROC POP BX POP SI MOV AX,0 MOV CX,N L0: ADD AX,[SI] ADD SI,2 LOOP L0 MOV CL,N DIV CL CBW PUSH AX PUSH BX RET AVERAGE ENDP CODE ENDS END START 子程序的嵌套与递归 1. 子程序的嵌套 在一个子程序中调用其他的子程序, 称为子程序的嵌套, 如图 5-6 所示 嵌套的层数不限, 只要堆栈空间足够即可 主程序子程序 SUB1 子程序 SUB2 CALL SUB1 SUB1 PROC CALL SUB2 RET 图 5-6 子程序嵌套 SUB2 PROC RET

39 166 微机原理与接口技术 例 5-37 ALDISP PROC PUSH AX PUSH CX ; 实现 AL 内容的显示 PUSH AX ; 暂存 AX MOV CL,4 SHR AL,CL ; 转换 AL 的高 4 位 CALL HTOASC ; 子程序调用 ( 嵌套 ) POP AX ; 转换 AL 的低 4 位 CALL HTOASC ; 子程序调用 ( 嵌套 ) POP CX POP AX RET ALDISP ENDP ; 将 AL 低 4 位表达的一位十六进制数转换为 ASCII 码 HTOASC PROC PUSH AX PUSH BX PUSH DX MOV BX,OFFSET ASCII ;BX 指向 ASCII 码表 AND AL,0FH ; 取得一位十六进制数 XLAT ASCII ; 换码 :AL CS:[BX+AL], 注意数据在代码段 CS MOV DL,AL ; 显示 MOV AH,2 INT 21H POP DX POP BX POP AX RET ; 子程序返回 ; 子程序的数据区 ASCII DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H HTOASC ENDP 注意 : 子程序可以与主程序共用一个数据段, 也可以使用不同的数据段 ( 注意修改 DS), 还可以在子程序最后设置数据区 ( 利用 CS 寻址 ) 2. 子程序的递归 在一个子程序中又直接或间接调用子程序本身, 称为子程序的递归, 如图 5-7 所示 主程序子程序 SUB1 子程序 SUB1 CALL SUB1 SUB1 PROC CALL SUB1 RET 图 5-7 子程序递归 SUB1 PROC RET

40 第 5 章汇编语言程序设计 167 例 5-38 求自然数 N(N 1) 的阶乘 DATA SEGMENT N DB 3 F_MUL DW? DATA ENDS STACK SEGMENT PARA STACK 'STACK' DB 100 DUP(?) STACK ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK BEGIN: MOV AX, DATA MOV DS, AX MOV AH, 0 MOV AL, N CALL FACTOR MOV F_MUL,AX MOV AH,4CH INT 21H FACTOR PROC PUSH AX SUB AX, 1 JNE RECUR POP AX JMP OVER RECUR: CALL FACTOR POP CX MUL CL OVER: RET FACTOR ENDP CODE ENDS END BEGIN 5.4 Windows 汇编语言程序设计 前面介绍了基于 DOS 的 8086 汇编语言程序设计, 了解了 8086 汇编语言程序设计的思路和方法 本节对 Windows 下的汇编程序设计进行简要介绍 在 Windows 环境下, 不需要掌握更多的硬件知识就能够应用 Win32 汇编语言编制应用程序 在 DOS 系统中用汇编语言编制程序是借助中断来调用操作系统内核提供的功能, 而 Win32 汇编是借助应用编程接口 API(Application Program Interface) 去调用操作系统内核 Windows 环境下的很多高级语言对功能调用与实现的细节进行了不同程度的封装, 如多线程处理和消息循环等都被隐藏封装起来 虽然能够使用它们进行可视化编程, 却无法全面了解 Win32 操作系统程序的具体运行方式 由于封装使操作出现了某种缺陷和不足 如 VB 不支持指针, 而程序员编程需要有指针的 API, 结果操作起来十分不方便, 使多线程一类特征在 VB 中无法实现 但用 Win32 汇编语言能洞察到操作系统的真实工作情况, 充分发挥 Windows 系统的各种功能, 如对 Windows 环境的文件进行加密保护, 编制出在 Windows 操作系统管理下各种文件的防病毒程序

41 168 微机原理与接口技术 Windows 汇编语言程序的例子 在 Windows 操作系统下用消息框显示一个字符串 Good morning! 的汇编程序如下 :.386.MODEL FLAT,STDCALL OPTION CASEMAP:NONE INCLUDE WINDOWS.INC INCLUDE USER32.INC INCLUDELIB USER32.LIB INCLUDE KERNEL32.INC INCLUDELIB KERNEL32.LIB.DATA GDCAPTION DB "A Good cation!",0 GOOD DB "Good morning!",0.code START: INVOKE MessageBox,NULL,OFFSET GOOD,OFFSET GDCAPTION,MB_YESNO INVOKE ExitProcess,NULL END start 伪指令在上述程序中, 首先进行模式定义.386 表明 Win32 汇编程序工作于 及以上的处理器 也可以使用 等伪指令 但是, 如果程序没有使用特定的基于 386 以上 CPU 的指令, 从软件的兼容性考虑, 建议使用 MODEL 伪指令.MODEL 是用来指定内存模式的伪指令, 在 Win32 下, 只有一种内存模式, 即 FLAT Windows 操作系统为每一个应用程序建立一个 4GB 的线性空间 代码段 数据段和堆栈段都使用同一个段, 内存寻址从 0 到 4GB, 没有 64KB 的段大小限制 汇编程序自动为各段寄存器做如下段约定 : ASSUME CS:FLAT,DS;FLAT,SS:FLAT,ES:FLAT 即 CS DS ES SS 指向同一段 FLAT,FS 和 GS 在 Win32 汇编中不用 STDCALL 用于指出调用子程序或编程接口 API 时参数传递的次序和堆栈平衡的方法 3.OPTION 伪指令语句 OPTION CASEMAP:NONE, 用以说明程序中的变量和子程序名是不分大小写的 与 DOS 汇编程序不同,Win32 汇编程序不考虑堆栈, 系统会为程序分配一个向下扩展的段作为堆栈段, 因此, 堆栈段定义会被忽略 4.INCLUDE 伪指令 MASM32 工具包包含有各种 DLL 的 API 函数声明列表, 每个 DLL 都有相对应的 DLL.INC 文件, 程序中如果用到某个 DLL 文件中包含的函数, 必须用 INCLUDE 语句将其包含进来, 如 : INCLUDE USER32.INC INCLUDE KERNEL32.INC 5.INCLUDELIB 伪指令不同类的 API 函数存放在不同的动态链接库 DLL 中, 为了让连接程序快速地搜索到 API 函数在哪个 DLL 库,Win32 还定义了一种库文件, 称为导入库文件 一个 DLL 库对应一个导

42 第 5 章汇编语言程序设计 169 入库 INCLUDELIB 语句用于指定链接时所用的导入库, 以便通知连接程序在哪个 DLL 库中去找连接所需的 API 函数 例如,USER32.DLL 对应的导入库是 USER32.LIB, 导入 USER32DLL 中的 API 函数可通过语句 INCLUDELIB USER32.DLL 来实现 LIBC.LIB 库中包含了大部分的运行库函数连接信息, 程序的入口函数 _main 也是在 LIBC. LIB 中声明的 因此在程序中包含 INCLUDELIB LIBC.LIB 伪指令是非常有必要的, 否则连接时将会出现无法解析外部符号的错误 6. 分段 伪指令.DATA.DATA?.CONST 和.CODE 是 4 个 分段 伪指令 Win32 FLAT 内存模式隐藏了分段机制, 因此只有两种性质的 分段 :DATA 和 CODE 在程序的.CODE 分段中, 包括函数定义, 是程序 代码 部分 对于 Win32 控制台程序, 入口函数名必须是 _main, 而不能像 DOS 汇编程序那样自定义入口函数名称 在 Win32 环境中, 可以像 DOS 汇编那样对程序入口进行定义 本 Win32 例程入口为标号 START, 程序结束处用 END 语句加标号 START 来实现, 其用法与 DOS 汇编中完全相同 Win32 汇编程序的数据段有 3 类 :.DATA.DATA? 和.CONST, 在生成的可执行文件中不同的数据会被放在相应的节区中 第一类是可读写的已定义变量, 这些数据必须定义在.DATA 段中 ; 第二类是可读写的未定义变量, 这些数据一般定义在.DATA? 段中, 也可以定义在.DATA 段中 ; 第三类是常量, 这些数据在程序装入时已经有效, 在执行过程中也不需要修改, 可以放在.CONST 段中.CONST 段作为常量段, 它是可读不可写的 当然, 也可以像本例一样把常量放到.DATA 段中 7.END 伪指令指示汇编结束位置, 其后的任何文本 ( 包括指令和伪指令 ) 都会被汇编程序忽略 再次强调, 由于 Win32 控制台程序的入口函数名必须是 _main, 所以 end 伪指令不能像在 DOS 汇编程序中那样指定除 _main 外的任何其他标号 8.Windows API 调用 Win32 环境中的编程接口 API 代替了 DOS 调用系统功能的中断方式 但和 DOS 不同, Win32 把系统功能模块放在 Windows 的动态链接库中,Win32 汇编程序中的功能实现是通过编程接口 API 调用存放在 DLL 中的函数, 从而完成 DOS 环境中借助中断方式来调用系统的功能 在本例中以 INVOKE 伪操作指令实现对 MessageBox 的调用 : INVOKE MessageBox,NULL,OFFSET GOOD,OFFSET GDCAPTION,MB_YESNO 需要指出的是,INVOKE 并不是 处理器的指令, 而是宏汇编 MASM 编译器的伪指令, 它完成了汇编调用 MessageBox 函数的功能 此外, 本例还用到另外一个 API 函数 : ExitProcess, 它位于 KERNEL32.DLL 中 通过以上实例, 可以了解在 Windows 环境下应用汇编语言编程的方法, 以及 Win32 汇编程序的基本结构 Windows 程序设计的特点 汇编语言和微处理器及操作系统是紧密相关的 随着 Windows 操作系统占领市场, 汇编语言程序设计也相应地从 DOS 下的实地址模式过渡到 Windows 下的 32 位保护模式 Windows 汇编程序设计和 DOS 汇编程序设计有许多相似之处, 如它们有相同的指令系统 类似的寻址

43 170 微机原理与接口技术 方式等 但也有不少根本性的区别, 如内存管理 寻址模式 中断和异常处理等 与 DOS 汇编程序设计相比,Windows 汇编程序设计主要有以下不同特点 : (1) 工作模式不同 DOS 应用程序工作在实模式方式下 Windows 应用程序工作在保护模式下, 系统的一些重要资源对 Windows 应用程序来说是受保护的,Windows 应用程序不能直接访问这些资源, 而必须通过某种方式进行间接访问 (2) 内存使用方式不同 DOS 汇编采用分段机制, 通过段地址加偏移地址得到相应内存单元的物理地址 在 Windows 中, 则使用了 平坦 内存模型, 每个 Windows 应用程序都可以使用 32 位地址来访问 4GB 空间的内存单元, 不过这个地址一般是虚地址, 需要经过分段和分页机构的转换才能得到相应的物理地址 (3) 提供丰富的 API 函数 与 DOS 提供的中断调用类似,Windows 系统提供了丰富的 API 函数供选用 Windows API 支持上千种函数的调用, 涉及网络 消息 文件处理 打印 文本 字体 菜单 位图 图标 光栅运算 绘图 设备场景 硬件与系统 进程和线程 控件与消息等各个方面, 从而使程序员可以把更多的时间放在程序的逻辑结构和用户界面上 (4) 基于事件的消息驱动机制 Windows 应用程序的重要特点是采用基于事件的消息驱动机制 应用程序对象的每一次操作都对应一个事件的发生, 该事件完成应用程序的相关操作, 如鼠标的移动 窗口的缩小和关闭等 消息实际上就是 Windows 系统预先定义的常量标识, 它具有唯一性 消息发生时, 该消息被送往消息队列, 应用程序或操作系统依据消息的种类调用相应的事件处理过程 Windows 的消息种类繁多, 大致有以下 4 种 : 控件消息, 主要是控件子窗口向父窗口发送的消息, 如 WM_COMMAND 菜单 快捷键等的 WM_COMMAND 消息 标准消息, 除以上消息外, 多为 WM_ 的格式, 如 WM_CHAR WM_NOTIFY 另外, 各控件也具有自身的特定消息, 如 LB_ 开头的列表框消息 TV_ 开头的树形视图消息等 各控件消息不可混用, 其使用情况可参考 MSDN(Microsoft Development Network) 相关文档 自定义消息, 该类消息的消息号不小于 400H 在 Windows 应用程序中, 消息产生源相对固定, 程序设计的重点是完善消息对应的事件处理过程 (5) 应用程序独立于硬件设备 Windows 提供了图形设备接口 (GDI) 技术, 使应用程序能够真正独立于硬件设备, 与设备无关, 从而方便程序的移植 在 Windows 中, 相关设备的驱动程序安装完毕并置于当前设备状态后, 会形成一个相关设备的环境, 即设备上下文 DC (Device Context) 当应用程序需要与相关设备通信时, 只要获得 DC 并与之通信即可, 其余的全部交由操作系统去处理 (6) 中断 保护模式下的微处理器设置了 4 个特权级, 从高到低分别为特权级 级 Windows 操作系统只使用了其中的两个级别, 操作系统内核及各种设备驱动程序运行在最高级 (0 级 ), 应用程序运行在最低级 (3 级 ) 在 Windows 操作系统中, 使用 API 来代替中断服务子程序提供的系统功能, 所以在 Win32 汇编中,INT n 指令失去了存在的意义 Windows 的 API 函数能够被应用程序直接调用, 并且它比 DOS 下的中断调用具有更丰富的功能 (7) 程序结构不同 DOS 程序普遍采用结构化程序设计方法, 程序整体通常采用顺序执

44 第 5 章汇编语言程序设计 171 行的方式, 中间穿插有分支结构和循环结构 Windows 应用程序一般不采用顺序执行的方式, 而是采用 GUI( 图形用户界面 ) 和基于消息的机制, 应用程序的主要任务是捕获用户在图形用户界面触发的消息并对其做出响应 (8) 资源丰富, 使用方便 Windows 提供了丰富的资源, 如菜单 对话框 字符串表 图标 位图 光标 字体, 甚至快捷键等 这些资源在 Windows 中都有固定的定义格式, 操作方法非常简便 Windows 汇编程序设计基础为了充分理解 Windows 下汇编运行的机理和工作过程, 需要理解以下知识和概念 : (1) 微处理器工作模式选择 及后续的 x86 系列是典型的 32 位 CPU, 它们提供了实模式 保护模式和虚拟 8086 模式等多种操作模式 在保护模式下,32 位处理器可以充分利用 CPU 架构特性并使用所有的指令, 拥有最高的性能和兼容性 同时提供了内存分段和分页保护, 在硬件级别实现了逻辑地址到线性地址 线性地址再到物理地址的转换, 最大程度地保护了操作系统和应用程序 下面以 为例介绍 3 种不同的工作模式 1) 实模式 处理器在复位或加电时以实模式方式启动 此时处理器中的各寄存器以实模式的初始化值工作 在实模式下,80386 处理器只使用了 32 位地址线中的低 20 位, 不能对内存进行分页管理, 所以指令寻址的地址就是内存中实际的物理地址 实模式下, 所有的段均可以读 写和执行 实模式下的 不支持优先级, 所有的指令都工作在特权级 ( 优先级 0), 因此可以执行所有特权指令, 包括读写控制寄存器 CR0 等 实际上,80386 就是通过在实模式下初始化控制寄存器 GDTR LDTR IDTR 与 TR 等管理寄存器以及页表, 然后再通过加载 CR0, 使 CR0 中的 保护模式使能位 置 1 而进入保护模式的 实模式不支持硬件上的多任务切换 实模式下的中断处理方式和 8086 处理器相同, 也用中断向量表来定位中断服务程序地址 中断向量表的结构也和 8086 处理器一样, 每 4 个字节组成一个中断向量, 其中包括两个字节的段地址和两个字节的偏移地址 从编程的角度看, 在 处理器的实模式方式下, 程序员可以访问 新增的一些寄存器, 同时可以使用 处理器中的 32 位寄存器 ( 在 8086 中只能使用 16 位寄存器 ), 从而使程序运行过程更加简洁, 同时也加快了执行速度 2) 保护模式 32 位 Windows 操作系统和应用程序都运行在保护模式下, 操作系统把每一个 Win32 应用程序放到单独的虚拟地址空间中去运行, 每一个应用程序都拥有相互独立的 4GB 逻辑地址空间 在应用程序运行时, 操作系统完成虚拟地址到物理地址的转换 而 DOS 运行于实模式下, 操作系统和各应用程序运行于同一个地址空间中, 并通过物理地址访问代码与数据, 很容易导致一个应用程序破坏另一个应用程序甚至是操作系统的数据或代码 Win32 只有一种内存模式, 即 FLAT 模式, 又称为 平坦 的内存模式, 操作系统和应用程序运行在一个平坦 连续 单独的 4GB 的逻辑地址空间中 FLAT 模式隐藏了内存的分段机制, 操作系统负责对段寄存器和描述符表进行初始化, 不必像 DOS 汇编编程时那样再对段寄存器进行设置 FLAT 内存模式如图 5-8 所示 Win32 为实现 FLAT 内存模式创建了两个段

45 172 微机原理与接口技术 描述符, 一个引用到代码段而另一个引用到数据段 但是这些段都映射到整个线性地址空间, 段描述符有相同的基地址 0, 段界限最大为 4GB 段寄存器 CS DS 段描述符段属性段界限段基地址 线性地址空间 代码 ES SS 段属性 段界限 FS 段基地址 数据或堆栈 GS 图 5-8 FLAT 内存模式 当 工作在保护模式时, 它的所有功能都是可用的 这时 所有的 32 根地址线都可供寻址, 寻址空间高达 4GB 保护模式支持内存分段和分页机制, 提供了对虚拟内存的良好支持 支持多任务, 通过硬件可以在一条指令中实现任务切换 任务环境的保护工作也是由处理器自动完成的 在保护模式下, 不同的程序可以运行在不同的优先级上 通过良好的检查机制, 一方面使 可在任务间实现数据的安全共享, 同时, 也可实现各个任务之间的安全隔离 实模式切换到保护模式是通过修改控制寄存器 CR0 的控制位 PE( 位 0, 又称保护模式使能位 ) 来实现的 在此之前还要建立保护模式所必需的一些数据表, 如全局描述符表 GDT 局部描述符表 LDT 和中断描述符表 IDT 等 支持分页机制, 从而有效解决了内存碎片问题 通过将物理内存地址通过 页目录 和 页表 映射成连续的线性地址, 页表中除了映射信息外, 还记录了页的访问属性等信息, 以支持虚拟内存的实现, 每个应用程序都有自己的 4GB 的寻址空间 可以用 CR0 寄存器中的位 31(PG 位 ) 开启或关闭分页机制 3) 虚拟 8086 模式 虚拟 8086 模式是为了在保护模式下执行 8086 程序而设置的 虽然 处理器提供了实模式来兼容 8086 程序, 但实模式下的 8086 程序实际上只是运行得快了一点, 对 CPU 的资源还是独占的 在保护模式的多任务环境下运行这些程序时, 它们中的很多指令和保护模式环境格格不入, 如段寻址方式 对中断的处理和 I/O 操作的特权问题等 虚拟 8086 模式是以任务形式在保护模式上执行的, 在 上可以同时支持由多个真正的 任务和虚拟 8086 模式构成的任务 在虚拟 8086 模式下,80386 支持任务切换和内存分页 在 Windows 操作系统中, 有一部分程序专门用来管理虚拟 8086 模式的任务, 称为虚拟 8086 管理程序 虚拟 8086 模式实际上是以保护模式为基础, 实模式和保护模式的混合 为了和 8086 程

46 第 5 章汇编语言程序设计 173 序的寻址方式兼容, 虚拟 8086 模式采用和 8086 一样的寻址方式, 即用段寄存器乘以 16 作为段基址再配合偏移地址形成线性地址, 寻址空间为 1MB 但显然多个虚拟 8086 任务不能同时使用同一物理位置的 1MB 地址空间, 否则必然引发冲突 操作系统利用分页机制将不同虚拟 8086 任务的地址空间映射到不同的物理地址上去, 这样每个虚拟 8086 任务看起来都认为自己在使用 0~1MB 的地址空间 8086 代码中有相当一部分指令在保护模式下属于特权指令, 如屏蔽中断的 CLI 和中断返回指令 IRET 等, 它们是无法在保护模式下运行的 但这些指令在 8086 程序中是合法的 如果不让这些指令执行,8086 代码就无法工作 为了解决这个问题, 虚拟 8086 管理程序采用模拟的方式来完成这些指令 这些特权指令执行的时候引发保护异常 虚拟 8086 管理程序在异常处理程序中检查产生异常的指令, 如果是中断指令, 则从虚拟 8086 任务的中断向量表中取出中断处理程序的入口地址, 并将控制转移过去 ; 如果是危及操作系统的指令, 如 CLI 等, 则简单地忽略这些指令, 在异常处理程序返回的时候直接返回到下一条指令 通过这些措施, 8086 程序既可以正常地运行下去, 同时在执行这些特权指令的时候又觉察不到已经被虚拟 8086 管理程序执行了特殊处理 由上可见,80386 处理器的 3 种工作模式各有特点且相互联系 实模式是 处理器工作的基础, 这时 作为一个快速的 8086 处理器工作 在实模式下可以通过指令切换到保护模式, 也可以从保护模式退回到实模式 虚拟 8086 模式则以保护模式为基础, 在保护模式和虚拟 8086 模式之间可以互相切换, 但不能从实模式直接进入虚拟 8086 模式或从虚拟 8086 模式直接退到实模式 2. 动态链接库动态链接库 (Dynamic-Link Libraries,DLL) 不能直接被执行, 它们一般也不会接收消息 而只是一些包含着函数的独立文件, 其中的函数可以被 Windows 程序或者其他 DLL 调用以完成某项任务 动态链接 是与 静态链接 相对而言的 动态链接 是指 Windows 程序在运行时才把自己需要的存在于某个库中的函数链接进来 静态链接 是指 Windows 程序在编译阶段就把各种对象模块 (.OBJ) 运行时库(.LIB) 和资源文件 (.RES) 链接到一起以创建一个可执行文件 (.EXE) 动态链接库标准的扩展名是.dll 具有标准扩展名的动态链接库模块才可以被 Windows 自动加载 而其他扩展名的动态链接库模块, 必须使用 LoadLibrary 或 LoadLibraryEx 函数来显式加载 某些动态链接库 ( 如字体文件 ) 称为 resource-only 它们只包括数据, 而不包括代码 这些动态链接库为许多不同的程序提供资源 动态链接库模块也可以作为一个单独的产品来发布 这样第三方程序开发人员就可以使用该动态链接库的模块来开发自己的应用程序, 不但提高了程序的复用率, 也节省了大量的时间和精力 除了动态链接库之外, 还有目标库 (Object Libraries) 和导入库 (Import Libraries) 下面介绍这三种库的异同点 目标库是扩展名为.lib 的文件, 包括了用户程序要用到的各种函数 它在用户程序进行链接时, 静态链接 到可执行程序文件当中 例如, 在 Visual C++ 中最常使用到的 C 运行时目标库文件就是 LIBC.LIB

47 174 微机原理与接口技术 导入库是一种特殊形式的目标库文件形式 导入库文件的扩展名也是.LIB, 在用户程序被链接时, 被 静态链接 到可执行文件当中 但不同的是, 导入库文件中并不包含有程序代码 它包含了相关的链接信息, 帮助应用程序在可执行文件中建立起正确的对应于动态链接库的重定向表 比如 KERNEL32.LIB USER32.LIB 和 GDI32.LIB 是我们常用到的导入库, 通过它们, 就可以调用 Windows 提供的函数了 如果程序中使用了 Rectangle 这个函数,GDI32.LIB 就可以告诉链接器, 这个函数在 GDI32.DLL 动态链接库文件中 这样, 当用户程序运行时, 它就 动态链接 到 GDI32.DLL 模块中以使用这个函数 目标库和导入库都是在程序开发过程中才用到的, 而动态链接库是在程序运行时使用的 在程序运行时, 相应的动态链接库文件必须已经存在于程序运行机器的硬盘上 3. 指令集选择在汇编程序设计中, 当使用处理器特定的指令时, 必须由相应的伪指令指定相应的处理器 汇编程序中说明处理器类型的伪指令及相应功能如下 :.8086: 只支持对 8086 指令的汇编.186: 只支持对 指令的汇编.286: 支持对 指令的汇编 ( 不包括特权指令 ).286P: 支持对 所有指令的汇编.386: 支持对 指令的汇编 ( 不包括特权指令 ).386P: 支持对 所有指令的汇编.486: 支持对 指令的汇编 ( 不包括特权指令 ).486P: 支持对 所有指令的汇编.586: 支持对 Pentium 指令的汇编 ( 不包括特权指令 ).586P: 支持对 Pentium 所有指令的汇编.686: 支持对 Pentium Pro 指令的汇编 ( 不包括特权指令 ).686P: 支持对 Pentium Pro 所有指令的汇编 只有用伪指令说明了处理器类型, 汇编程序才知道如何更好去编译 连接程序, 更好地去检错报错 4. 函数的原型定义对于程序中所有要用到的 API 函数, 在程序的开始部分都必须预先声明, 也就是进行函数的原型定义, 包括函数的名称 参数的类型等 函数原型定义的作用是告诉编译器和连接器该函数的属性 ( 即如上所说的函数名 参数个数及相应的类型 ), 以便在编译和连接时编译器和连接器进行相关的类型检查 函数原型定义的语法如下 : FunctionName PROTO [ParameterName]:DataType,[ParameterName]:DataType, 通过在函数名后面加伪指令 PROTO, 表明该语句是函数原型定义语句 函数参数列表紧跟在 PROTO 伪指令之后, 参数名称和参数类型之间用冒号分隔 比如经常在 Windows 应用程序中使用的消息框, 其函数原型定义如下 : MessageBox PROTO hwnd:dword,lptext:dword,lpcaption:dword,utype:dword 其中,hWnd 是父窗口的句柄,lpText 是指向消息框要显示的文本的指针,lpCaption 是指向消息框标题文本串的指针,uType 是显示在对话框窗口上的小图标的类型 Windows API 函数的原型声明已经写好, 保存在 INC 格式的文件中, 使用时, 只要用伪

48 第 5 章汇编语言程序设计 175 指令 INCLUDE 将其包含进来即可 比如以下包含语句 :INCLUDE \MASM32\INCLUDE\ KERNEL32.INC, 编译器会打开文件夹 \MASM32\INCLUDE 中的文件 KERNEL32.INC, 并使用其中的函数声明执行编译过程 Win32 汇编语言知识介绍 1.Windows 窗口知识介绍 在 Windows 系统中, 窗口是指屏幕上的一块矩形区域 它可以从键盘或者鼠标接收用户的输入, 并在其内部向用户显示输出信息 应用程序窗口通常包含标题栏 菜单栏 边框 滚动条和状态栏等 窗口以 消息 的形式接收用户的输入, 同时也可以通过消息与其他窗口通信 比如当用户通过最大化按钮改变窗口的大小时, 操作系统会捕获用户发送的消息, 然后将其转发给相应的应用程序, 从而使程序能够响应这个系统功能, 并调整窗口中的内容, 以响应窗口大小的变化 窗口是在 窗口类 的基础上创建的 Windows 定义了默认的窗口过程, 如果所有的消息都让 Windows 自己处理, 将能得到一个标准的窗口, 当然, 也可以选择处理自己感兴趣的消息, 这样, 相当于产生了不同的子类, 也就形成了不同的应用程序 子窗口也是基于同一个窗口类, 并且使用同一个窗口过程 Windows 程序开始执行后,Windows 为该程序创建一个 消息队列 这个消息队列用来存放该程序可能创建的各种不同窗口的消息 程序中有一段代码, 叫做 消息循环, 其作用是从队列中取出消息, 并且将这些消息发送给相应的窗口过程 创建一个窗口的过程如下 : (1) 取得程序的实例句柄 (hinstance) (2) 注册窗口类, 实际上就是为所创建的窗口指定处理消息的过程, 定义光标 窗口风格 颜色等参数 (3) 创建窗口 (4) 显示窗口 (5) 进入消息循环, 也就是不停地检测有无消息, 并把它发送给窗口进程去处理 下面, 来看一个创建窗口的简单程序 2. 创建窗口程序的源代码.386.model flat, stdcall option casemap :none ; ; Include 文件定义 ; include..\include\windows.inc include..\include\user32.inc include..\include\kernel32.inc include..\include\comctl32.inc include..\include\comdlg32.inc include..\include\gdi32.inc includelib..\lib\user32.lib

untitled

untitled 8086/8088 CIP /. 2004.8 ISBN 7-03-014239-X.... TP313 CIP 2004 086019 16 100717 http://www.sciencep.com * 2004 8 2004 8 1 5 500 787 1092 1/16 16 1/2 391 000 1 2 ii 1 2 CAI CAI 3 To the teacher To the student

More information

,768 32,767 32K JMP Jnnn (386+) LOOP CALL [Label:] JMP short/near/far address L10: jmp jmp L20: L10 L20

,768 32,767 32K JMP Jnnn (386+) LOOP CALL [Label:] JMP short/near/far address L10: jmp jmp L20: L10 L20 (Jump) (Loop) (Conditional jump) CMP CALL AND SAR/SHR TEST JMP NOT SAL/SHL Jnnn* OR RCR/ROR LOOP XOR RCL/ROL RETn * nnn, JNE JL -128 127-32,768 32,767 32K JMP Jnnn (386+) LOOP CALL [Label:] JMP short/near/far

More information

《微型计算机原理》

《微型计算机原理》 第五章汇编语言程序设计 1 画图说明下列语句所分配的存储器空间及初始化的数据值 难度:2 (1) BYTE_VAR DB BYTE,12,-12H,3 DUP(0,2 DUP(1,2),7) (2) WORD_VAR DW 3 DUP(0,1,2),7,-5, BY, TE,256H ( 1) (2) 07H BYTE_VAR 42H WORD_VAR 59H FBH 54H FFH 45H 59H

More information

42 2141601026 2016 11 27 2 1.1............................................. 2 1.2....................................... 2 1.2.1......................................... 2 1.3.............................................

More information

幻灯片 1

幻灯片 1 3 8086 Tel:2656809 tjx@csu.edu.cn 2005-9-14 1 2005-9-14 2 8086 8 8086 8086 7 2005-9-14 3 PC 2005-9-14 4 2005-9-14 5 81616 2005-9-14 6 [ ] MOV AX, 3064H AX=3064H 16AX OP 64H 30H 2005-9-14 7 16 AX BX CX

More information

第四章 8086汇编语言程序设计

第四章 8086汇编语言程序设计 第四章汇编语言程序设计 几个概念 8086 汇编语言的语句 8086 汇编中的伪指令 8086 汇编中的运算符 汇编语言程序设计 系统调用 几个概念 1. 汇编语言 2. 汇编语言源程序 3. 汇编 4. 汇编程序 5. 什么是汇编语言 (Assembly Language)? 6. 使用指令的助记符 符号地址和标号等编写的程序设计语言 7. 每条指令都有对应的机器码, 不同的 CPU 使用不同的汇编语言

More information

<4D6963726F736F667420576F7264202D20C7B6C8EBCABDCFB5CDB3C9E8BCC6CAA6B0B8C0FDB5BCD1A75FD1F9D5C22E646F63>

<4D6963726F736F667420576F7264202D20C7B6C8EBCABDCFB5CDB3C9E8BCC6CAA6B0B8C0FDB5BCD1A75FD1F9D5C22E646F63> 因 为 路 过 你 的 路, 因 为 苦 过 你 的 苦, 所 以 快 乐 着 你 的 快 乐, 追 逐 着 你 的 追 逐 内 容 简 介 本 书 根 据 2005 年 下 半 年 实 施 的 全 国 计 算 机 技 术 与 软 件 专 业 技 术 资 格 ( 水 平 ) 考 试 嵌 入 式 系 统 设 计 师 级 考 试 大 纲 精 神, 在 深 入 研 究 历 年 计 算 机 技 术 与 软

More information

<4D F736F F F696E74202D DB5DAB0CBBDB22DBBE3B1E0D3EFD1D4B3CCD0F22E >

<4D F736F F F696E74202D DB5DAB0CBBDB22DBBE3B1E0D3EFD1D4B3CCD0F22E > 第八讲 授课教师 : 陆俊林王箫音 2012 年春季学期 主要内容 一 汇编语言的主要特点 二 汇编语言程序的结构 三 汇编语言的基本语法 四 汇编语言程序的开发调试 教材相关章节 : 微型计算机基本原理与应用 ( 第二版 ) 第 5 章汇编语言的基本语法第 6 章汇编语言程序设计及应用 1 主要内容 一 汇编语言的主要特点 二 汇编语言程序的结构 三 汇编语言的基本语法 四 汇编语言程序的开发调试

More information

提纲. 1 实验准备. 2 从实模式进入保护模式. 3 小结 陈香兰 ( 中国科学技术大学计算机学院 ) 软件综合实验之操作系统 July 1, / 11

提纲. 1 实验准备. 2 从实模式进入保护模式. 3 小结 陈香兰 ( 中国科学技术大学计算机学院 ) 软件综合实验之操作系统 July 1, / 11 .. 软件综合实验之操作系统 进入保护模式 陈香兰 中国科学技术大学计算机学院 July 1, 2016 陈香兰 ( 中国科学技术大学计算机学院 ) 软件综合实验之操作系统 July 1, 2016 1 / 11 提纲. 1 实验准备. 2 从实模式进入保护模式. 3 小结 陈香兰 ( 中国科学技术大学计算机学院 ) 软件综合实验之操作系统 July 1, 2016 2 / 11 实验准备 实验环境准备

More information

(2) Function 0BH: Function 0CH: (pixel, picture element) Function 0DH: Function 0FH: Function 13H:

(2) Function 0BH: Function 0CH: (pixel, picture element) Function 0DH: Function 0FH: Function 13H: (1) INT 10H Function 00H: Function 01H: Function 02H: Function 03H: Function 05H: Function 06H: Function 07H: Function 08H: Function 09H: Function 0AH: (2) Function 0BH: Function 0CH: (pixel, picture element)

More information

第5章:汇编语言程序设计

第5章:汇编语言程序设计 第 5 章 : 汇编语言程序设计 程 汇编语言指令格式 系统伪指令 存储器选择方式 常用子程序 1 汇编语言程序设计 PIC 指令系统 语言系统 指 CPU 编 器语言 器语言 器语言 设计 用 语言 设计 语言 汇编语言 2 汇编语言指令格式 汇编语言指令格式 ( 指令 ) label opcode operand comment 指令 用 存 指令 指令语 3 汇编语言指令格式 1 指令 用 指令

More information

<4D F736F F F696E74202D D D6B8C1EECFB5CDB DC6E4CBFBD6B8C1EE2E BBCE6C8DDC4A3CABD5D>

<4D F736F F F696E74202D D D6B8C1EECFB5CDB DC6E4CBFBD6B8C1EE2E BBCE6C8DDC4A3CABD5D> 2018 版 微机原理与接口技术 第三章 8086CPU 指令系统 董明皓 dminghao@xidian.edu.cn 1 2 3 4 5 汇编语言基本概念汇编语言指令分类数据与转移地址的寻址方式 8086 的六类指令总结 1 2 3 4 5 汇编语言基本概念汇编语言指令分类数据与转移地址的寻址方式 8086 的六类指令总结 4. 8086 的指令系统 b b b b b 数据传送指令算术运算指令逻辑运算指令移位

More information

主要内容 : 汇编语言源程序的结构汇编语言语句格式伪指令语句功能调用汇编语言程序设计方法宏汇编和条件汇编 2015 年 3 月 30 日星期一 7 时 58 分 57 秒 2

主要内容 : 汇编语言源程序的结构汇编语言语句格式伪指令语句功能调用汇编语言程序设计方法宏汇编和条件汇编 2015 年 3 月 30 日星期一 7 时 58 分 57 秒 2 第 4 章 汇编语言程序设计 (1) 2015 年 3 月 30 日星期一 7 时 58 分 56 秒 1 主要内容 : 汇编语言源程序的结构汇编语言语句格式伪指令语句功能调用汇编语言程序设计方法宏汇编和条件汇编 2015 年 3 月 30 日星期一 7 时 58 分 57 秒 2 机器语言 二进制数形式的指令和数据 B0 64 是什么意思? 这就是机器语言 既不直观, 又不易理解和记忆. MOV

More information

Microsoft PowerPoint - 微原-第3章2.ppt [兼容模式]

Microsoft PowerPoint - 微原-第3章2.ppt [兼容模式] 本教案内容 第 3 章 8086CPU 指令系统 1. 汇编语言指令 9. 转移指令 10. 2. 8086 指令分类循环控制指令 11. 子程序调用返回 3. 数据与转移地址的指令寻址方式 12. 中断调用返回指 4. 数据传送类指令令 5. 算术运算类指令 13. 字符串操作指令 6. 逻辑运算类指令 14. I/O 输入输出指令 7. 移位类指令 15. 其它指令 8. 标志位操作指令 16.

More information

数据库系统概论

数据库系统概论 所谓寻址方式, 就是指令中用于说明操 作数所在地或者所在地地址的方法 8088/8086 的寻址方式分为两类 : 关于寻找数据的寻址方式 关于寻找转移地址的寻址方式 下面讲关于数据的寻址方式时, 均以数 据传送指令 MOV 为例讲解 MOV 指令格式如下 : MOV DST, SRC 助记符 目的操作数 指令完成的功能 : (DST) 源操作数 (SRC) 一. 关于寻找数据的寻址方式 ( 共 8

More information

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,

More information

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63>

<4D F736F F D20B5DAC8FDCBC4D5C2D7F7D2B5B4F0B0B82E646F63> 第三章 Q3 1 1. 省略了 I/O 操作的复杂逻辑, 易实现, 耗费低 ; 2. 可以利用丰富的内存寻址模式实现灵活的 I/O 操作 Q3 2 假设存储单元 ds1 处寄存器地址为 0x2000, 代码如下 #define ds1 0x2000 while ( *ds1 == 0 ) ; Q3 3 假设设备 (dev1) 中有两个寄存器 ds1 和 dd1,dev1 的地址为 0x1000,ds1

More information

微机原理--汇编、连接和调试

微机原理--汇编、连接和调试 微机原理课程 汇编语言程序的编辑 汇编 连接和调试 西安电子科技大学 探测制导系 内容提要 编写汇编语言程序的五个重要步骤 编写源程序 汇编过程 连接过程 汇编语言编程过程 DEBUG 主要功能 DEBUG 命令 程序设计举例 结束语 编写汇编语言程序的五个重要步骤 1. 编写源程序, 如 L1.ASM 2. 汇编源程序, 得到目标代码,L1.OBJ 3. 目标代码文件的连接, 生成可执行文件 L1.EXE

More information

指令系统 可分成如下 6 类 : 数据传送指令 算术运算指令 逻辑运算和移位指令 串操作指令 程序控制指令 处理器控制指令 2015 年 3 月 26 日星期四 8 时 41 分 27 秒 2

指令系统 可分成如下 6 类 : 数据传送指令 算术运算指令 逻辑运算和移位指令 串操作指令 程序控制指令 处理器控制指令 2015 年 3 月 26 日星期四 8 时 41 分 27 秒 2 第 3 章 8086 的寻址方式和指令系统 (2) 2015 年 3 月 26 日星期四 8 时 41 分 27 秒 1 3.3 8086 指令系统 可分成如下 6 类 : 数据传送指令 算术运算指令 逻辑运算和移位指令 串操作指令 程序控制指令 处理器控制指令 2015 年 3 月 26 日星期四 8 时 41 分 27 秒 2 3.3.1 数据传送指令 可实现 存储器 立即数 段寄存器 CS DS

More information

Microsoft PowerPoint - CH3_1.ppt [兼容模式]

Microsoft PowerPoint - CH3_1.ppt [兼容模式] 第三章汇编语言程序设计 Assembly Language Programming 格式 # 伪指令 # DOS/BIOS 调用 ( 简单了解 ) 重点 数据结构表示变量 指针程序结构程序流控制 ( 条件 分支 循环 ) 程序设计方法微机系统与接口东南大学 1 计算机程序设计语言 程序设计语言与汇编语言 机器语言 汇编语言和高级语言 高级语言 (High Level Language) 通用, 一般不要求了解结构原理

More information

<4D F736F F F696E74202D BDE1B9B9BBAFB3CCD0F2C9E8BCC D20D1ADBBB7>

<4D F736F F F696E74202D BDE1B9B9BBAFB3CCD0F2C9E8BCC D20D1ADBBB7> 能源与动力工程学院 结构化编程 结构化程序设计 循环 循环结构 确定性循环 非确定性循环 I=1 sum=sum+i I = I +1 陈 斌 I>100 Yes No 目录 求和 :1+2+3++100 第四节循环的应用 PROGRAM GAUSS INTEGER I, SUM 计数器 SUM = 0 DO I = 1, 100, 1 SUM = SUM + I print*, I, SUM DO

More information

Microsoft PowerPoint - 微原-第3章3.ppt [兼容模式]

Microsoft PowerPoint - 微原-第3章3.ppt [兼容模式] 本教案内容 第 3 章 8086CPU 指令系统 1. 汇编语言指令 9. 转移指令 10. 2. 8086 指令分类循环控制指令 11. 子程序调用返回 3. 数据与转移地址的指令寻址方式 12. 中断调用返回指 4. 数据传送类指令令 5. 算术运算类指令 13. 字符串操作指令 6. 逻辑运算类指令 14. I/O 输入输出指令 7. 移位类指令 15. 其它指令 8. 标志位操作指令 16.

More information

主要内容 指令系统的一般概念 指令操作方式操作码的含义指令对操作数的要求指令执行的结果 寻址方式 指令说明 2015 年 3 月 16 日星期一 8 时 2 分 37 秒 2

主要内容 指令系统的一般概念 指令操作方式操作码的含义指令对操作数的要求指令执行的结果 寻址方式 指令说明 2015 年 3 月 16 日星期一 8 时 2 分 37 秒 2 第 3 章 8086 的寻址方式和指令系统 (1) 2015 年 3 月 16 日星期一 8 时 2 分 37 秒 1 主要内容 指令系统的一般概念 指令操作方式操作码的含义指令对操作数的要求指令执行的结果 寻址方式 指令说明 2015 年 3 月 16 日星期一 8 时 2 分 37 秒 2 3.1 8086 的寻址方式 两种不同的类型 : 一类是程序地址 ( 在代码段中 ) 的寻址方式 ; 另一类是操作数地址的寻址方式

More information

微型计算机原理及应用试题 机电96

微型计算机原理及应用试题   机电96 微 机 原 理 试 题 ( 一 ) 总 分 : 一 : 单 项 选 择 题 ( 每 题 1 分, 共 10 分 ) 1. 微 型 计 算 机 中 主 要 包 括 有 ( ) A) 微 处 理 器 存 储 器 和 I/O 接 口 B) 微 处 理 器 运 算 器 和 存 储 器 C) 控 制 器 运 算 器 和 寄 存 器 组 D) 微 处 理 器 运 算 器 和 寄 存 器 2. DMA 控 制 器

More information

Microsoft PowerPoint - Ch3-8086CPUæ„⁄令系ç»�(3)-æŁ°æ“®ä¼€é•†æ„⁄令

Microsoft PowerPoint - Ch3-8086CPUæ„⁄令系ç»�(3)-æŁ°æ“®ä¼€é•†æ„⁄令 2017 版 微机原理与系统设计 第 3 章 8086CPU 指令系统 董明皓, 博士 西安电子科技大学 dminghao@xidian.edu.cn 目录 (12 课时 ) 1 2 3 4 5 汇编语言基本概念 8086 指令分类数据与转移地址的寻址方式 8086 的六类指令总结 微机原理与系统设计 8086CPU 的指令系统董明皓 dminghao@xidian.edu.cn 2 基础知识引入

More information

习 题 一

习  题  一 第 1 页共 13 页 微机原理与接口技术 A 卷 一 填空题 ( 共计 20 分 每个空 2 分 ) 1 已知 [X] 补 =01100011B, 求 X=( ) ( 结果用十进制表示 ) [Y] 补 =11111001B, 求 Y=( ) ( 结果用十进制表示 ) 2 8088CPU 的地址总线为多少条 ( ); 直接寻址的内存空间为多少 ( ) 3 已知 DS=2000H, 内存 (20200H)=FFH,(20201H)=22H

More information

数据库系统概论

数据库系统概论 2. 减法指令 8086/8088 共有 5 条减法指令 1 不带 CF 的减法指令 (SUB) 格式 :SUB DST, SRC 功能 :(1)DST (DST)-(SRC) (2) 根据差设置 6 个状态标志 2 带 CF 的减法指令 (SBB) 格式 :SBB DST, SRC 功能 : (1)DST (DST)-(SRC)-CF (2) 根据差设置 6 个状态标志 3 减 1 指令 (DEC)

More information

Microsoft PowerPoint - 05-第五讲-寻址方式.pptx

Microsoft PowerPoint - 05-第五讲-寻址方式.pptx 第五讲 授课教师 : 陆俊林王箫音 2012 年春季学期 主要内容 一 寻址方式概述 二 数据的寻址方式 三 转移地址的寻址方式 教材相关章节 : 微型计算机基本原理与应用 ( 第二版 ) 第 4 章寻址方式与指令系统 1 主要内容 一 寻址方式概述 二 数据的寻址方式 三 转移地址的寻址方式 2 指令的组成 指令由操作码和操作数两部分组成 操作码操作数 MOV AX, 8726H ADD AX,

More information

数据库系统概论

数据库系统概论 指令系统 是指 CPU 能完成的所有 指令的集合, 它是在 CPU 设计时就确定了的 所以, 对不同的 CPU, 其指令系统中所包含的具体指令将是各不相同的 但 8088/8086 CPU 的指令系统是完全一样的 8088/8086 CPU 的指令系统可分成下面 9 类 : (1) 数据传送指令 ; (2) 算术运算指令 ; (3) 逻辑运算指令 ; (4) 移位指令 ; (5) 标志处理指令和 CPU

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

微机第02章1(指令寻址)

微机第02章1(指令寻址) 微机原理及应用 主讲 : 谢维成 http://xweicheng.ys168.com scxweicheng@yahoo.com.cn 西华大学电气信息学院 1 第 03 章 80X86 的寻址方式和指令 ( 本章内容 ) 3.1 指令的格式 3.2 8086/8088 的寻址方式 3.3 指令系统 3.3.1 数据传送指令 3.3.2 算术运算指令 3.3.3 逻辑运算与移位指令 3.3.4 串操作指令

More information

Microsoft PowerPoint - CH3_3.ppt [只读] [兼容模式]

Microsoft PowerPoint - CH3_3.ppt [只读] [兼容模式] 第三章汇编语言程序设计 ( 三 ) Assembly Language Programming(3) 格式 # 伪指令 # DOS/BIOS 调用 ( 简单了解 ) 重点 : 数据结构表示 程序结构 变量 指针 程序流控制 ( 条件 分支 循环 ) 程序设计方法 ----- 程序设计举例 微机系统与接口东南大学 1 DATA 汇编语言程序举例 (1) 分块传送 SEGMENT STRG DB 256

More information

組譯與連結(Ver6

組譯與連結(Ver6 Intel 8088/86 CPU GND 1 40 VCC GND 1 40 VCC A14 2 39 A15 AD14 2 39 AD15 A13 3 38 A16/S3 AD13 3 38 A16/S3 A12 4 37 A17/S4 AD12 4 37 A17/S4 A11 5 36 A18/S5 AD11 5 36 A18/S5 A10 A9 6 7 35 34 A19/S6 SS0 (

More information

幻灯片 1

幻灯片 1 字符串处理是指对一系列的字母或数字的代码进行相同功能的处理 计算机中字符代码一般都采用 ASCII 码, 每个字符的代码占一个字节, 一组字符串存放在一个连续的存储区中 存放在连续的存储区中的这组字符串, 可看为一个数据块 为了提高对字符串 ( 或数据块 ) 的处理效率,8086/8088 指令系统中专门提供了一组对字符串处理的指令, 这些指令包括 : 字符串传送指令 (MOVS) 字符串比较指令

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

Microsoft PowerPoint - Ch3-8086CPU指令系统(2)-寻址.pptx

Microsoft PowerPoint - Ch3-8086CPU指令系统(2)-寻址.pptx 2018 版 微机原理与系统设计 第 3 章 8086CPU 指令系统 董明皓, 博士 西安电子科技大学 dminghao@xidian.edu.cn 目录 1 2 3 4 5 汇编语言基本概念 8086 指令分类数据与转移地址的寻址方式 8086 的六类指令总结 2 目录 1 2 3 4 5 汇编语言基本概念 8086 指令分类数据与转移地址的寻址方式 8086 的六类指令总结 3 8086 指令分类

More information

Microsoft Word - em78 sub program.doc

Microsoft Word - em78 sub program.doc 一 二进制数转换为 ASCⅡ 码 将一个字节的二进制数转换为两位 16 进制数的 ASCⅡ 码 main: mov a,@0x9f ; 二进制数为 0x9f mov 0x30,a ; 二进制数存入 0x30 mov a,@0x02 mov 0x10,a ;0x10 中存放转换次数 mov a,@0x31 mov 0x04,a ;0x04 中为转换后数据存放地址 mov a,0x30 B1: ; 取

More information

学习MSP430单片机推荐参考书

学习MSP430单片机推荐参考书 MSP430 16 MSP430 C MSP430 C MSP430 FLASH 16 1 CPU 16 ALU 16 PC SP SR R4~R15 2 3 00-FFH 100-1FFH 4 5 1 2 51 24 27 6 1 2 3 4 5 6 4 12 SR SP SR CPU SR CPU C Z N GIE CPUOff CPU OscOff SCG0 SCG1 CPU EXIT SP

More information

移动平台应用软件开发 C/C++/JAVA 基础 C 中的预处理指令 主讲 : 张齐勋 移动平台应用软件开发 课程建设小组北京大学二零一五年

移动平台应用软件开发 C/C++/JAVA 基础 C 中的预处理指令 主讲 : 张齐勋 移动平台应用软件开发 课程建设小组北京大学二零一五年 移动平台应用软件开发 C/C++/JAVA 基础 C 中的预处理指令 主讲 : 张齐勋 zhangqx@ss.pku.edu.cn 移动平台应用软件开发 课程建设小组北京大学二零一五年 预处理 2 预处理器 C 语言的编译系统分为编译预处理和正式编译 预处理作用 : 对源程序编译之前做一些处理, 生成扩展 C 源程序 预处理器的行为是由预处理指令控制的 宏定义 文件包含 条件编译 #define #ifdef

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

Microsoft PowerPoint - C15_LECTURE_NOTE_05.ppt

Microsoft PowerPoint - C15_LECTURE_NOTE_05.ppt 8088/8086 MICROPROCESSOR PROGRAMMING INTEGER INSTRUCTIONS AND COMPUTATIONS 8088/8086 MICROPROCESSOR PROGRAMMING INTEGER INSTRUCTIONS AND COMPUTATIONS 5.1 Data-Transfer Instructions 5.2 Arithmetic Instructions

More information

数据库系统概论

数据库系统概论 2. 减法指令 8086/8088 共有 5 条减法指令 1 不带 CF 的减法指令 (SUB) 格式 :SUB DST, SRC 功能 :(1)DST (DST)-(SRC) (2) 根据差设置 6 个状态标志 2 带 CF 的减法指令 (SBB) 格式 :SBB DST, SRC 功能 : (1)DST (DST)-(SRC)-CF (2) 根据差设置 6 个状态标志 3 减 1 指令 (DEC)

More information

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]

Microsoft PowerPoint - 5. 指针Pointers.ppt [兼容模式] 指针 Pointers 变量指针与指针变量 Pointer of a variable 变量与内存 (Variables and Memory) 当你声明一个变量时, 计算机将给该变量一个内存, 可以存储变量的值 当你使用变量时, 计算机将做两步操作 : - 根据变量名查找其对应的地址 ; - 通过地址对该地址的变量内容进行读 (retrieve) 或写 (set) 变量的地址称为变量的指针! C++

More information

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas 目录 1 IPv6 快速转发 1-1 1.1 IPv6 快速转发配置命令 1-1 1.1.1 display ipv6 fast-forwarding aging-time 1-1 1.1.2 display ipv6 fast-forwarding cache 1-1 1.1.3 ipv6 fast-forwarding aging-time 1-3 1.1.4 ipv6 fast-forwarding

More information

Microsoft PowerPoint - C15_LECTURE_NOTE_06

Microsoft PowerPoint - C15_LECTURE_NOTE_06 61 Flag-Control 8088/8086 MICROPROCESSOR PROGRAMMING CONTROL FLOW INSTRUCTIONS AND PROGRAM STRUCTURES LAHF SAHF CLC STC CMC CLI STI Load AH from flags Store AH into flags Clear carry flag Set carry flag

More information

PowerPoint Presentation

PowerPoint Presentation 一. 上机环境 应用软件系统软件硬件 4.5 汇编语言程序设计上机步骤与调试方法 用户程序 :ABC.exe 等 操作系统 :DOS 系统编辑器 : EDIT.exe 编程序 : MASM.exe 连接程序 :LINK.exe 调试程序 :DEBUG.exe CPU 存储器 (ROM RAM) I/O 接口 输入 输出设备 编辑源程序 EDIT ABC.ASM 二. 上机步骤 1 D:>EDIT ABC.ASM

More information

第三章 宏汇编语言程序设计

第三章 宏汇编语言程序设计 微机原理与接口技术 实验指导书 淮阴师范学院计算机科学与技术系 实验一代码转换 一 实验目的 : 1 掌握顺序 分支程序的设计方法 2 编制顺序 分支程序 3 上机调试顺序 分支程序, 掌握源代码转换的基本方法 4 学会用 INT 21 功能实现人机对话 二 实验内容 本程序所实现的功能是 : 键入小写字母 ( 最多 20 个 ) 以. 号作为结束标志, 输出相应的大写字母 用 INT 21H 中的的

More information

MSP430ϵÁе¥Æ¬»úµÄÖ¸Áîϵͳ.pps [¼æÈÝģʽ]

MSP430ϵÁе¥Æ¬»úµÄÖ¸Áîϵͳ.pps [¼æÈÝģʽ] 作者 : 利尔达 MSP430 系列单片机的指令系统 1 CPU 内核组成 : 16 位的 (ALU) 算术运算单元 16 个寄存器 (PC SP SR R4~R15) 指令控制单元 2 存储器组织结构 3 外围模块寄存器地址 它们被分配在相应的字模块或字节模块当中 分配在 00-FFH 中为字节, 分配在 100-1FFH 中为字 4 寻址模式 : 5 指令格式 : 1) 书写格式标号指令助记符源操作数,

More information

Microsoft PowerPoint - C15_LECTURE_NOTE_06

Microsoft PowerPoint - C15_LECTURE_NOTE_06 8088/8086 MICROPROCESSOR PROGRAMMING CONTROL FLOW INSTRUCTIONS AND PROGRAM STRUCTURES 8088/8086 MICROPROCESSOR PROGRAMMING CONTROL FLOW INSTRUCTIONS AND PROGRAM STRUCTURES 61 Flag-Control 62 Compare 63

More information

第4章 80X86指令系统

第4章  80X86指令系统 第 4 章 80x86 指令系统 一 练习题 ㈠选择题 1.MOV AX,[BX+SI] 的源操作数的物理地址是 ( ) A.(DS) 16+(BX)+(SI) B. (ES) 16+(BX)+(SI) C.(SS) 10H+(BX)+(SI) D.(CS) 10H+(BX)+(SI) 2.MOV AX,[BP+Sl] 的源操作数的物理地址是 ( ) A.(DS) 10H+(BP)+(SI) A.

More information

本次习题课中提到的 课本, 均指机械工业出版社的 Intel 微处理器 ( 原书第八版 ) 中文版, 使用其他版本课本的同学需要自己对应

本次习题课中提到的 课本, 均指机械工业出版社的 Intel 微处理器 ( 原书第八版 ) 中文版, 使用其他版本课本的同学需要自己对应 微机原理习题课 助教 : 王骏腾 本次习题课中提到的 课本, 均指机械工业出版社的 Intel 微处理器 ( 原书第八版 ) 中文版, 使用其他版本课本的同学需要自己对应 习题 33:Core2 处理器可寻址 存储器? 答案 :4GB 64GB 1TB ( 课本 P18 表 1-6) 第一章 习题 53: 信号的作用是什么? 答案 :I/O 读控制, 低电平有效 ( 两点都要答上, 详细可见课本 P20)

More information

图 内部结构图 8251 的外部引脚如图 所示, 共 28 个引脚, 每个引脚信号的输入输出方式如图中的箭 头方向所示

图 内部结构图 8251 的外部引脚如图 所示, 共 28 个引脚, 每个引脚信号的输入输出方式如图中的箭 头方向所示 实验题目 : 串行接口芯片 8251 实验目的 : 1. 掌握 8251 的工作方式及应用 2. 了解有关串口通讯的知识 串行接口芯片 8251 3. 掌握使用 8251 实现双机通讯的软件编程和电路连接 实验设备 : IA-32 架构的微机系统及应用教学平台两套 实验原理 : 1. 8251 的基本性能 性能 : 8251 是可编程的串行通信接口, 可以管理信号变化范围很大的串行数据通信 有下列基本

More information

手册 doc

手册 doc 1. 2. 3. 3.1 3.2 3.3 SD 3.4 3.5 SD 3.6 3.7 4. 4.1 4.2 4.3 SD 4.4 5. 5.1 5.2 5.3 SD 6. 1. 1~3 ( ) 320x240~704x288 66 (2G SD 320x2401FPS ) 32M~2G SD SD SD SD 24V DC 3W( ) -10~70 10~90% 154x44x144mm 2. DVR106

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

Ps22Pdf

Ps22Pdf ( ) ( 150 ) 25 15 20 40 ( 25, 1, 25 ), 1. A. B. C. D. 2. A. B. C. D. 3., J = 1 H = 1 ( A B, J', J, H ) A. A = B = 1, J' =0 B. A = B = J' =1 C. A = J' =1, B =0 D. B = J' = 1, A = 0 4. AB + AB A. AB B. AB

More information

2010-10-8 22:23:13 solo estoy(276441700) 老 师 SIMD 技 术 ALU 同 时 处 理 的 数 据 长 度 只 能 是 ALU 最 大 位 数 的 整 数 分 之 一 对 吗 2010-10-8 22:25:16 solo estoy(276441700)

2010-10-8 22:23:13 solo estoy(276441700) 老 师 SIMD 技 术 ALU 同 时 处 理 的 数 据 长 度 只 能 是 ALU 最 大 位 数 的 整 数 分 之 一 对 吗 2010-10-8 22:25:16 solo estoy(276441700) 微 机 系 统 与 接 口 技 术 群 答 疑 集 锦 08 级 学 生 QQ 群 答 疑 杨 全 胜 整 理 2011.9 2010-10-8 22:23:13 solo estoy(276441700) 老 师 SIMD 技 术 ALU 同 时 处 理 的 数 据 长 度 只 能 是 ALU 最 大 位 数 的 整 数 分 之 一 对 吗 2010-10-8 22:25:16 solo estoy(276441700)

More information

Microsoft PowerPoint - chapter6.ppt

Microsoft PowerPoint - chapter6.ppt 本章目標 了解模組化與結構化程式設計技巧 了解 80x86 的程式連結與程式模組宣告方式 了解副程式 巢路副程式 與遞回副程式 了解副程式的參數傳遞方式 了解巨集指令的定義與使用 了解巨集指令相關的假指令 6.1 模組化程式設計 組合語言的模組化程式設計通常由下列幾個層次輔助完成 : 1. 副程式 (subroutine) 2. 組譯程式假指令 3. 巨集指令 (macro) 4. 中斷結構 (interrupt

More information

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc 第 3 章流程控制和数组 3.1 实验目的 (1) 熟练掌握控制台应用程序的代码编写和调试, 以及运行方法 (2) 掌握选择结构的一般语法格式和应用 (3) 掌握 switch 语句的用法 (4) 掌握选择结构的嵌套的用法, 能灵活使用选择结构解决实际问题 (5) 掌握 while 循环语句的一般语法格式 (6) 掌握 for 循环语句的一般语法格式 (7) 掌握循环嵌套的语法格式 (8) 掌握一维数组的定义

More information

// HDevelopTemplateWPF projects located under %HALCONEXAMPLES%\c# using System; using HalconDotNet; public partial class HDevelopExport public HTuple

// HDevelopTemplateWPF projects located under %HALCONEXAMPLES%\c# using System; using HalconDotNet; public partial class HDevelopExport public HTuple halcon 与 C# 混合编程之 Halcon 代码调用 写在前面 完成 halcon 与 C# 混合编程的环境配置后, 进行界面布局设计构思每一个按钮所需要实现 的功能, 将 Halcon 导出的代码复制至相应的 C# 模块下即可 halcon 源程序 : dev_open_window(0, 0, 512, 512, 'black', WindowHandle) read_image (Image,

More information

<4D F736F F D20CAB5D1E BACDBBE3B1E0D3EFD1D4B5C4BBECBACFB1E0B3CCCAB5D1E92E646F63>

<4D F736F F D20CAB5D1E BACDBBE3B1E0D3EFD1D4B5C4BBECBACFB1E0B3CCCAB5D1E92E646F63> 1 实验目的 实验 2 C 和汇编语言的混合编程实验 学习在 C 程序中使用嵌入式汇编编写程序 了解嵌入式汇编的格式 语言特点 2 实验设备 S3C2410 开发板 ADS1.2 集成开发环境,JTAG 调试器 串口连接线 3 实验原理 在 ARM 的应用开发中,C 语言功能强大且容易编写程序, 但是汇编程序在底层的操作仍然具有 C 程序无法替代的功能, 有时候我们需要在 C 程序中嵌入汇编程序来完成一些直接对底层的诸如寄存器的操作

More information

没有幻灯片标题

没有幻灯片标题 指针作为函数参数 : 原因 : 1 需要修改一个或多个值,( 用 return 语句不能解决问题 ) 2 执行效率的角度 使用方法 : 在函数原型以及函数首部中需要声明能够接受指针值的形参, 具体的写法为 : 数据类型 * 形参名 如果有多个指针型形参, 则用逗号分隔, 例如 : void swap(int *p1, int *p2) 它说明了形参 p1 p2 是指向整型变量的指针 在函数调用时,

More information

目 录

目 录 1 Quick51...1 1.1 SmartSOPC Quick51...1 1.2 Quick51...1 1.3 Quick51...2 2 Keil C51 Quick51...4 2.1 Keil C51...4 2.2 Keil C51...4 2.3 1 Keil C51...4 2.4 Flash Magic...9 2.5 ISP...9 2.6...10 2.7 Keil C51...12

More information

(1) 若两个数种有一个是奇数, 则将奇数存入 A 中, 偶数存入 B 中 ; (2) 若两个数均为奇数, 则将两数均加 1 后存回原变量 ; (3) 若两个数均为偶数, 则两个变量均不改变 19. 写一段子程序 SKIPLINES, 完成输出空行的功能 空行的行数由用户在主程序中通过键盘输入, 并

(1) 若两个数种有一个是奇数, 则将奇数存入 A 中, 偶数存入 B 中 ; (2) 若两个数均为奇数, 则将两数均加 1 后存回原变量 ; (3) 若两个数均为偶数, 则两个变量均不改变 19. 写一段子程序 SKIPLINES, 完成输出空行的功能 空行的行数由用户在主程序中通过键盘输入, 并 汇编语言程序设计练习题 1. 逆序输出字符串 BASEDADDRESSING 2. 从键盘上输入 2 个一位数, 求出它们的和 ( 假设和不超过 1 位 ) 3. 试编写一段程序, 要求在长度为 100H 字节的数组中, 找出大于 42H 的无符号数的个数并存入字节单元 UP 中 ; 找出小于 42H 的无符号数的个数并存入字节单元 DOWN 中 4. 试编写一段程序, 要求对键盘输入的小写字母用大写字母显示出来

More information

上海市本科教学质量年度报告

上海市本科教学质量年度报告 上 海 市 本 科 教 学 质 量 年 度 报 告 数 据 内 涵 说 明 V2.0 版 上 海 市 教 委 高 教 处 上 海 喆 思 (2015.07.02) 目 录 一 基 本 统 计 挃 标 说 明... 4 二 挃 标 解 释... 4 1. 全 日 制 在 校 本 科 生 数 及 占 在 校 生 总 数 的 比 例 ( 学 年 )... 4 2. 当 年 本 科 招 生 与 业 总 数

More information

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas 目录 1 IPv6 快速转发 1-1 1.1 IPv6 快速转发配置命令 1-1 1.1.1 display ipv6 fast-forwarding aging-time 1-1 1.1.2 display ipv6 fast-forwarding cache 1-1 1.1.3 ipv6 fast-forwarding aging-time 1-3 1.1.4 ipv6 fast-forwarding

More information

一、填空题

一、填空题 微机原理及汇编语言复习题一 选择题 1. 完整的计算机系统应包括 ( ) A. 运算器 控制器 寄存器组 总线接口 B. 外设和主机 C. 主机和应用程序 D. 配套的硬件设备和软件系统 2. 计算机系统中的存储器系统是指 ( ) A.RAM B.ROM C. 主存储器 D. 内存和外存 3. 机器语言是指 ( ) A. 用英语缩写词表示的面向机器的程序设计语言 B. 用二进制代码表示的程序设计语言

More information

<4D F736F F F696E74202D BDE1B9B9BBAFB3CCD0F2C9E8BCC D20D1A1D4F1>

<4D F736F F F696E74202D BDE1B9B9BBAFB3CCD0F2C9E8BCC D20D1A1D4F1> 能源与动力工程学院 结构化编程 结构化程序设计 选择 结构化编程的三种基本结构 : 顺序结构 I=1 选择 ( 分支 ) 结构 循环结构 sum=sum+i I = I +1 陈 斌 A?=B NO I>100 No YES Yes 目录 第一节逻辑运算 第一节逻辑运算 第二节 I 语句 逻辑运算 算术运算 关系运算 逻辑运算 关系运算符 运算优先级 第三节浮点数及字符的逻辑运算 90 77 功能

More information

untitled

untitled MODBUS 1 MODBUS...1 1...4 1.1...4 1.2...4 1.3...4 1.4... 2...5 2.1...5 2.2...5 3...6 3.1 OPENSERIAL...6 3.2 CLOSESERIAL...8 3.3 RDMULTIBIT...8 3.4 RDMULTIWORD...9 3.5 WRTONEBIT...11 3.6 WRTONEWORD...12

More information

Microsoft Word - 实验8_ADDA.doc

Microsoft Word - 实验8_ADDA.doc 一. 实验目的 实验八数模与模数转换 (1) 了解数 / 模转换器的基本原理, 掌握 DAC0832 芯片的使用方法 (2) 了解模 / 数转换的基本原理, 掌握 ADC0809 的使用方法 二. 实验环境 1. 硬件环境 微型计算机 (Intel x86 系列 CPU) 一台, 清华科教仪器厂 TPC-2003A 微机接口实验装置一台 ; 数字 2. 软件环境 记忆示波器一台, 万用表一台 (1)Windows

More information

《C语言程序设计》教材习题参考答案

《C语言程序设计》教材习题参考答案 教材名称 : C 语言程序设计 ( 第 1 版 ) 黄保和 江弋编著清华大学出版社 ISBN:978-7-302-13599-9, 红色封面 答案制作时间 :2011 年 2 月 -5 月 一 选择题 1. 设已定义 int a, * p, 下列赋值表达式中正确的是 :C)p=&a 2. 设已定义 int x,*p=&x;, 则下列表达式中错误的是 :B)&*x 3. 若已定义 int a=1,*b=&a;,

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢   学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 Email: 51141201063@ecnu.cn 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Java 类型 引用 不可变类型 对象存储位置 作用域 OOP

More information

Microsoft PowerPoint - C15_LECTURE_NOTE_05.ppt

Microsoft PowerPoint - C15_LECTURE_NOTE_05.ppt 8088/8086 MICROPROCSOR PROGRAMMING INTEGER INSTRUCTIONS AND COMPUTATIONS The MOVE The move (MOV) instruction is used to transfer a byte or a word of data from a source operand to a destination operand

More information

bingdian001.com

bingdian001.com 1. DLL(Dynamic Linkable Library) DLL ± lib EXE DLL DLL EXE EXE ± EXE DLL 1 DLL DLL DLL Windows DLL Windows API Visual Basic Visual C++ Delphi 2 Windows system32 kernel32.dll user32.dll gdi32.dll windows

More information

微處理機期末專題

微處理機期末專題 微 處 理 機 期 末 專 題 自 動 鋼 琴 組 員 :b92611004 羅 鈞 瑋 b92611008 吳 妍 儂 b92611038 吳 韋 靜 b92611042 林 佳 穎 一 簡 介 本 組 的 主 題 是 自 動 鋼 琴 在 播 放 音 樂 的 同 時, 鋼 琴 會 自 動 按 下 琴 鍵, 被 按 下 的 琴 鍵 所 對 應 到 的 音 階, 就 是 正 在 撥 放 的 樂 曲 的

More information

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3

Generated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3 浙江大学 C 程序设计及实验 试题卷 2002-2003 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:30-10:30 注意 : 答题内容必须写在答题卷上, 写在本试题卷上无效 一. 单项选择题 ( 每题 1 分, 共 10 分 ) 1. 下列运算符中, 优先级最低的是 A.

More information

JAVA 单元 2.1 四则运算机 ( 一 ) 单元教学进度设计 教学环节 教学内容 教师学生活动活动 反馈 反馈课前作业完成情况 反馈加分 1. 下面哪些是合法的变量名? ( ) A.2variable 答案 :DEG B..variable2 解答 : C.._whatavariable A:/

JAVA 单元 2.1 四则运算机 ( 一 ) 单元教学进度设计 教学环节 教学内容 教师学生活动活动 反馈 反馈课前作业完成情况 反馈加分 1. 下面哪些是合法的变量名? ( ) A.2variable 答案 :DEG B..variable2 解答 : C.._whatavariable A:/ 单元 2.1 四则运算机 ( 一 ) 单元教学进度设计 教学环节 教学内容 教师学生活动活动 反馈 反馈课前作业完成情况 反馈加分 1. 下面哪些是合法的变量名? ( ) A.2variable 答案 :DEG B..variable2 解答 : C.._whatavariable A:// 不能以数字开头 D._3_ B:// 不能用点和空格 提问 抢答 E.$anothervar C: // 不能用点和空格

More information

Microsoft PowerPoint - 07 派生数据类型

Microsoft PowerPoint - 07 派生数据类型 能源与动力工程学院 目录 派生类型 陈 斌 固有数据类型 数值型 (numerical) 整型 INTEGER 实型 REAL 复数型 COMPLEX 非数值型 字符型 CHARACTER 逻辑型 ( 布尔型 )LOGICAL 自定义数据类型 ( 派生类型, derived type) 派生类型是指用户利用 Fortran 系统内部类型, 如整型 实型 复数型 逻辑型 字符型等的组合自行创建出一个新的数据类型,

More information

器之 间 向一致时为正 相反时则为负 ③大量电荷的定向移动形成电 流 单个电荷的定向移动同样形成电流 3 电势与电势差 1 陈述概念 电场中某点处 电荷的电势能 E p 与电荷量 q Ep 的比值叫做该点处的电势 表达式为 V 电场中两点之间的 q 电势之差叫做电势差 表达式为 UAB V A VB 2 理解概念 电势差是电场中任意两点之间的电势之差 与参考点的选择无关 电势是反映电场能的性质的物理量

More information

大侠素材铺

大侠素材铺 编译原理与技术 词法分析 Ⅱ 计算机科学与技术学院李诚 13/09/2018 主要内容 记号 (token) 源程序 词法分析器 getnexttoken 语法分析器 符号表 词法分析器的自动生成 正则表达式 NFA DFA 化简的 DFA 词法分析器的生成器 Lex: flex jflex Fst lexicl nlyzer genertor 2/51 Regulr Expr to NFA 正则表达式

More information

F515_CS_Book.book

F515_CS_Book.book /USB , ( ) / L R 1 > > > 2, / 3 L 1 > > > 2 + - 3, 4 L 1 了解显示屏上显示的图标 Wap 信箱收到一条 Wap push 信息 ( ) GSM 手机已连接到 GSM 网络 指示条越多, 接收质量越好 2 ...........................4.............................. 4 Micro SD (

More information

06721 main() lock pick proc() restart() [2][4] MINIX minix2.0 GDT, IDT irq table[] CPU CPU CPU CPU (IDTR) idt[] CPU _hwint00:! Interrupt

06721 main() lock pick proc() restart() [2][4] MINIX minix2.0 GDT, IDT irq table[] CPU CPU CPU CPU (IDTR) idt[] CPU _hwint00:! Interrupt MINIX ( 730000) ( 730000) MINIX MINIX2.0 MINIX : MINIX TP3 1 MINIX UNIX Tanenbaum UNIX MINIX LINUX MINIX MINIX MINIX1.0 UNIX V7 MINIX2.0[3] POSIX MINIX3 MINIX Gabriel A. Wainer 1994-1995 [5] 1998 I/O 2002

More information

DPJJX1.DOC

DPJJX1.DOC 8051 111 2K 1 2 3 ' ' 1 CPU RAM ROM / A/D D/A PC CPU 40 68 10 20 8 51 PIII 8051 2 MCS51 8051 8031 89C51 8051 8031 89C51? MCS51 INTEL INTEL 8031 8051 8751 8032 8052 8752 8051 8051 8051 MCS51 8031 8031

More information

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]

Microsoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式] Arrays and Strings 存储同类型的多个元素 Store multi elements of the same type 数组 (array) 存储固定数目的同类型元素 如整型数组存储的是一组整数, 字符数组存储的是一组字符 数组的大小称为数组的尺度 (dimension). 定义格式 : type arrayname[dimension]; 如声明 4 个元素的整型数组 :intarr[4];

More information

instructions.PDF

instructions.PDF 94 SIMATIC (END) (END) Micro/WIN 32 (STOP) (STOP) CPU RUN STOP STOP CPU RUN STOP (WDR) (Watchdog Reset) (WDR) CPU WDR WDR ( ) I/O ( I/O ) SM (SM0 SM5 SM29 ) 25 0 ms 00 ms STOP 300ms 300ms WDR S7-200 CPU

More information

Microsoft Word - 《C语言开发入门》课程教学大纲-2.doc

Microsoft Word - 《C语言开发入门》课程教学大纲-2.doc C 语言开发入门 课程教学大纲 ( 课程英文名称 ) 课程编号 :201409210011 学分 :5 学分学时 :60 学时 ( 其中 : 讲课学时 :37 学时上机学时 :23 学时 ) 先修课程 : 计算机导论后续课程 :C++ 程序设计适用专业 : 信息及其计算机相关专业开课部门 : 计算机系 一 课程的性质与目标 C 语言开发入门 是计算机各专业必修的基础课程, 是数据结构 C++ Java

More information

标题

标题 汇编语言程序设计 4.1 汇编语言程序设计基础 单片机的汇编语言程序设计步骤如下 : (1) 明确要解决的问题和要求 (2) 根据要解决的问题, 制定程序流程图 如程序较长, 可以先画出粗框图, 再根据要求进行细化 (3) 根据程序流程图, 编写程序 如果程序较长, 可按功能模块进行编写 (4) 对汇编语言程序进行调试, 并进行优化处理 程序流程图是用几何图形 ( 方框和圆框 ) 直线及文字说明描述程序

More information

《C语言程序设计》第2版教材习题参考答案

《C语言程序设计》第2版教材习题参考答案 教材 C 语言程序设计 ( 第 2 版 ) 清华大学出版社, 黄保和, 江弋编著 2011 年 10 月第二版 ISBN:978-7-302-26972-4 售价 :35 元 答案版本 本习题答案为 2012 年 2 月修订版本 一 选择题 1. 设已定义 int a, * p, 下列赋值表达式中正确的是 :C)p = &a A. *p = *a B. p = *a C.p = &a D. *p =

More information

Microsoft PowerPoint sun-arm isa2.ppt [Compatibility Mode]

Microsoft PowerPoint sun-arm isa2.ppt [Compatibility Mode] 嵌入式系统设计与应用 第二章 ARM 指令系统 (2) 西安交通大学电信学院 孙宏滨 汇编伪指令 汇编伪指令 : 在 ARM 汇编语言里, 有一些特殊指令助记符, 没有相对应的操作码 ( 或直接对应指令 ) 通常称这些特殊指令助记符为伪指令, 它们所完成的操作叫做伪操作 伪指令在源程序中的作用是为完成汇编程序作各种准备工作 这些伪指令仅在汇编过程中起作用, 一旦汇编结束, 伪指令的使命完成 ADR:

More information

今天刚发现的, 比较简单, 于是就来简单分析下吧 该感染样本很简单, 新加了个区段放病毒执行代码, 执行病毒代码, 最后跳回原入口点来执行原文件 下面就是感染后的代码的简单分析 : ; =============== S U B R O U T I N E =====================

今天刚发现的, 比较简单, 于是就来简单分析下吧 该感染样本很简单, 新加了个区段放病毒执行代码, 执行病毒代码, 最后跳回原入口点来执行原文件 下面就是感染后的代码的简单分析 : ; =============== S U B R O U T I N E ===================== 吾爱破解论坛 [LCG] [LSG] 立足软件安全和病毒分析最前端, 丰富的技术版块交相辉映, 由无数加密解密及反病毒爱好者共同维护, 留给世界一抹值得百年回眸的惊 艳, 沉淀百年来计算机应用之精华与优雅, 信息线条与生活质感淡定交融, 任岁月流转, 低调而奢华的技术交流与研究却是亘古不变 标题 : 一个感染样本的简单分析 作者 :ximo 今天刚发现的, 比较简单, 于是就来简单分析下吧 该感染样本很简单,

More information

chap07.key

chap07.key #include void two(); void three(); int main() printf("i'm in main.\n"); two(); return 0; void two() printf("i'm in two.\n"); three(); void three() printf("i'm in three.\n"); void, int 标识符逗号分隔,

More information

Chapter #

Chapter # 第三章 TCP/IP 协议栈 本章目标 通过本章的学习, 您应该掌握以下内容 : 掌握 TCP/IP 分层模型 掌握 IP 协议原理 理解 OSI 和 TCP/IP 模型的区别和联系 TCP/IP 介绍 主机 主机 Internet TCP/IP 早期的协议族 全球范围 TCP/IP 协议栈 7 6 5 4 3 应用层表示层会话层传输层网络层 应用层 主机到主机层 Internet 层 2 1 数据链路层

More information

Microsoft PowerPoint - OPVB1基本VB.ppt

Microsoft PowerPoint - OPVB1基本VB.ppt 大 綱 0.VB 能 做 什 麼? CH1 VB 基 本 認 識 1.VB 歷 史 與 版 本 2.VB 環 境 簡 介 3. 即 時 運 算 視 窗 1 0.VB 能 做 什 麼? Visual Basic =>VB=> 程 式 設 計 語 言 => 設 計 程 式 設 計 你 想 要 的 功 能 的 程 式 自 動 化 資 料 庫 計 算 模 擬 遊 戲 網 路 監 控 實 驗 輔 助 自 動

More information

目 录(目录名)

目  录(目录名) 目录 目录...1-1 1.1 域名解析配置命令... 1-1 1.1.1 display dns domain... 1-1 1.1.2 display dns dynamic-host... 1-1 1.1.3 display dns server... 1-2 1.1.4 display ip host... 1-3 1.1.5 dns domain... 1-4 1.1.6 dns resolve...

More information

Office Office Office Microsoft Word Office Office Azure Office One Drive 2 app 3 : [5] 3, :, [6]; [5], ; [8], [1], ICTCLAS(Institute of Computing Tech

Office Office Office Microsoft Word Office Office Azure Office One Drive 2 app 3 : [5] 3, :, [6]; [5], ; [8], [1], ICTCLAS(Institute of Computing Tech - OfficeCoder 1 2 3 4 1,2,3,4 xingjiarong@mail.sdu.edu.cn 1 xuchongyang@mail.sdu.edu.cn 2 sun.mc@outlook.com 3 luoyuanhang@mail.sdu.edu.cn 4 Abstract. Microsoft Word 2013 Word 2013 Office Keywords:,, HTML5,

More information

<4D F736F F D20C7B0CBC4D5C2D7F7D2B5CCE22E646F6378>

<4D F736F F D20C7B0CBC4D5C2D7F7D2B5CCE22E646F6378> 第一章第二章 Q2 1: 高序 : 最低位字节存储在字的最低位 ; 低序 : 最低位字节存储在字的最高位 ; Q2 2: 冯. 诺依曼结构 : 数据和指令都存储在同一存储器中 ; 哈佛结构 : 数据和程序存储在各自独立的存储器中 Q2 3: a) ARM 有 16 个通用寄存器,r0 r15, 其中 r15 还被用作程序计数器 b) CPSR 是程序状态寄存器, 包含了条件码标识 中断禁止位 当前处理器模式和其他状态

More information

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 odps-sdk 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基 开放数据处理服务 ODPS SDK SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基础功能的主体接口, 搜索关键词 "odpssdk-core" 一些

More information

Microsoft PowerPoint - os_4.ppt

Microsoft PowerPoint - os_4.ppt 行 程 資 科 系 林 偉 川 行 程 概 念 行 程 與 程 式 主 要 的 不 同 點 : 程 式 是 被 放 在 外 部 的 儲 存 裝 置 如 磁 碟 上, 而 行 程 則 被 放 在 記 憶 體 中 程 式 在 儲 存 裝 置 中 是 靜 態 的, 而 行 程 在 記 憶 體 中 是 動 態 的, 它 會 隨 著 一 些 事 件 的 發 生 而 產 生 相 對 的 改 變 行 程, 就 是

More information

Microsoft Word - 11.doc

Microsoft Word - 11.doc 除 錯 技 巧 您 將 於 本 章 學 到 以 下 各 項 : 如 何 在 Visual C++ 2010 的 除 錯 工 具 控 制 下 執 行 程 式? 如 何 逐 步 地 執 行 程 式 的 敘 述? 如 何 監 看 或 改 變 程 式 中 的 變 數 值? 如 何 監 看 程 式 中 計 算 式 的 值? 何 謂 Call Stack? 何 謂 診 斷 器 (assertion)? 如 何

More information

目 录(目录名)

目  录(目录名) 目录 1 域名解析配置命令... 1-1 1.1 域名解析配置命令...1-1 1.1.1 display dns domain... 1-1 1.1.2 display dns dynamic-host... 1-2 1.1.3 display dns proxy table... 1-2 1.1.4 display dns server... 1-3 1.1.5 display ip host...

More information