微机原理第4章
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
61
数据定义如下,写出各条指令执行后 相应寄存器的内容
DATA SEGMENT X1 X3 ORG X4 DD 12345678H DW 1234H 100H EQU $-X1 BX=( AX=( ) )
62
DATA ENDS
(1)MOV BX, OFFSET X3 (2)MOV AX, X4
45
编程实例:
编写完整的8086汇编语言程序,将寄 存器AX的高8位传送到寄存器BL,低8 位传送到寄存器DL。
46
编程实例:
编写完整的汇编语言程序,将MEM1和 MEM2两个字节单元中存放的数相加, 并将结果送到MEM3单元
47
编程实例:
编写完整的汇编语言程序,将MEM1和 MEM2两个字节单元中存放的压缩BCD 相加,并将结果送到MEM3单元
第4章
汇编语言程序设计
1
主要内容
汇编语言源程序的结构 汇编语言语句格式 伪指令 功能调用 汇编语言程序设计
2
§4.1 汇编语言源程序
了解:
汇编语言源程序的结构
汇编语言语句类型及格式
3
一、汇编语言源程序结构
4
1. 汇编语言源程序与汇编程序
汇编语言源程序 汇编程序
用助记符编写 源程序的编译程序
37
二、符号定义伪指令
格式: 符号名 EQU 表达式
操作: 用符号名取代后边的表达式,不可重新定义 例: CONSTANT EQU 100 VAR EQU 30H+99H
EQU说明的表达式不占用内存空间
38
练习
根据下面的指令和伪指令序列,执行后,AX 寄存器的内容为( ) TAB ENTRY DW 1, 2, 3, 4, 5, 6 EQU 3
将断点地址由堆栈弹出
52
过程调用
段内直接调用
段内调用 段内间接调用 段间直接调用 段间调用
段间间接调用
53
1. 段内调用
被调用程序与调用程序在同一代码段
调用前只需保护断点的偏移地址
调用程序 被调用程序
格式: CALL OPRD 子程序入口偏移地址 执行过程:
将断点的偏移地址压入堆栈
代码 段1
代码 段1
54
将子程序入口偏移地址送IP
段内调用例
(1)CALL TIMRE 直接调用 间接调用
CALL
代 码 段
(2)CALL WORD PTR[SI] 设:SI=1200H CS=6000H 执行第(2)条指令后:
┇
1200H
CS = 6000H IP = 3344H
44H 33H
数 据 段
55
2. 段间调用
子程序与原调用程序不在同一代码段
调用前需保护断点的段基地址和偏移地址
先将断点的CS压栈,再压入IP。
56
段间调用例
格式:
CALL OPRD
CALL
格式例:
子程序入口地址
代 码 段
┇
SI
CALL FAR PTR TIMRE
CALL DWORD PTR[SI]
CS IP
例:’ABCD’
汇编时被译成对应的ASCII 码41H,42H,43H,44H
16
变量
代表内存中的数据区,程序中视为存储器 操作数
变量的属性:
段 值
偏移量 类 型
变量所在段的段地址 变量单元地址与段首地址之
间的位移量。
字节型、字型和双字型
17
标号
指令性语句的标号代表存放一条指令的存储单 元的符号地址。
9
2. 汇编语言语句格式
指令性语句:
[标号:] [前缀] 助记符 [操作数],[操作数] [ ;注释]
指令的符号地址 标号后要有冒号
操作码 注释前加分号
10
指示性语句格式
[名字] 伪指令助记符 [操作数 ,操作数,…] [ ;注释]
变量/过程/段的符号地址 其后不加冒号
告诉汇编程序执行什么操作
11
XXH XXH XXH XXH
数 据 段
57
3. 返回指令
功能:
从堆栈中弹出断点地址,返回原程序
格式: RET
RET指令一般位于子程序的最后。
58
八、其它伪指令
ORG
段内程序代码或变量的起始偏移地址
格式: ORG 表达式
计算值为 非负常数
例: ORG 2000H
A
DB 1,2,3
59
入口地址
调用程序 子程序
入口 地址
子程序执行结束后要返回 原调用处
断点地址
CALL
断点 地址
RET
51
调用及返回指令的执行过程
保护断点;
将调用指令的下一条指令的地址(断点)压入堆栈
获取子程序的入口地址;
从调用指令中获取子程序第1条指令的地址
执行子程序; 通过返回指令恢复断点,返回原程序。
3. 标号、名字
标号后有冒号,在指令性语句前;名字后不加
冒号,在指示性语句前。
英文字母、数字及专用字符组成,最大长度不 能超过31个,且不能由数字打头,不能用保留字 (如寄存器名,指令助记符,伪指令)。
12
4. 操作码
指令码 伪指令助记符
命令CPU要完成的操作
指示汇编程序要完成的操作。 作用:
48
编程实例:
求从TABLE开始的5个无符号字节数的和,结 果放SUM字单元中。
49
六、过程定义伪指令
用于定义一个过程体
格式:
┇
过程入口的 符号地址
过程名 PROC [ NEAR / FAR ]
过程名 ENDP
50
过程调用和返回
用于调用一个过程; 子程序由程序员预先设计
并装入内存
标号的属性:
段 值 偏移量 类 型 标号所在段的段地址
标号所在段的段首到定义该标号
的地址之间的字节数。 NEAR、FAR
18
表达式
算术运算 逻辑运算 关系运算 取值运算和属性运算 其它运算
19
算术运算和逻辑运算符
算术运算符
+,-,*,/,MOD AND,OR,NOT,XOR
逻辑运算符
MOV BX, OFFSET TAB
ADD BX, ENTRY
MOV AX, WORD PTR [BX]
39
三、段定义伪指令
功能:
说明逻辑段的起始和结束
格式:
段名 SEGMENT ┇
段名 ENDS
40
段定义伪指令例
DATA SEGMENT MEM1 DB 11H,22H
DATA ENDS
‘ A’ ‘ B’ ‘ C’ ‘ D’
32
2. 重复操作符
Biblioteka Baidu
作用:
为一个数据区的各单元设置相同的初值
目的:
常用于声明一个数据区
[变量名] 伪指令助记符 n DUP(初值,…)
格式:
例:
ABC DW 3 DUP(0)
33
3. “?”的作用
表示随机值,用于预留存储空间
MEM1 DB 34H,’A’,?
定义变量
分配存储单元 指示程序开始和结束等
13
5. 注 释
用分号作为注释的开始; 用于说明程序或语句的功能,以便于阅读 和理解
14
6. 操作数
寄存器
存储器单元 常量 变量或标号 表达式
15
常量
数字常量
字符串常量
例:‘A’
用单引号引起的字符或字符串
MOV AL,’A’
$的应用
地址计数器$用在指令中表示本条指令的起始 地址 当$用在伪指令的操作数字段时,则和指令中 的情况有所不同,它表示地址计数器的当前值
例:jnz $ 相当于 $: jnz $
例:ORG 0100H ARRAY DW 1,2,$+4,3,4,$+4
60
练习
已知
ORG 100H ARY DW 3, $+4, 5, 6 CNT EQU $-ARY DB 7, 8, CNT, 9 执行指令MOV AX,ARY+2和 MOV BX,ARY+10后, AX=( ),BX=( )
用于分析存储器操作数的属性 OFFSET SEG
取得其后变量或标号的偏移地址
取得其后变量或标号的段地址
22
取值运算符例
MOV AX,SEG DATA MOV DS,AX
MOV BX,OFFSET DATA
等价于
LEA BX,DATA
23
属性运算符
用于指定其后存储器操作数的类型 运算符:PTR
汇编语言 源程序
汇编程序
机器语言 目标程序
5
2. 汇编语言程序设计与执行过程
输入汇编语言源程序(EDIT)
汇编(MASM)
源文件 . ASM
目标文件 .OBJ 可执行文件.EXE
链接(LINK)
调试运行(DEBUG)
最终程序
6
3. 汇编语言源程序结构
数据段名 SEGMENT … 堆栈段名 SEGMENT
M3
22H 11H XX 22H 11H XX 22H 11H XX
随机数
36
练习
请图示下面伪指令定义的数据在内存中的存放形 式
(1)BUF1
(2)BUF2
DB
DW
‘12’,12, 12H,2*6,-1
’12’,12H,1234H 2 DUP(5, ?, 3 DUP(8))
(3)BUF3 DB
41
四、设定段寄存器伪指令
说明所定义逻辑段的性质
格式:
ASSUME 段寄存器名:段名
[,段寄存器名:段名,…]
42
五、结束伪指令
表示源程序结束 格式: END [标号]
43
一个完整源程序结构例
DSEG DATA1 DATA2 DSEG ESEG ESEG SSEG SSEG SEGMENT DB 1,2, DW 1234H ENDS SEGMENT DB 20 DUP(?) ENDS SEGMENT DB 200 DUP(?) ENDS
定义变量; 分配存储区;
定义逻辑段;
指示程序开始和结束; 定义过程等。
27
常用伪指令
数据定义伪指令
符号定义伪指令
段定义伪指令
结束伪指令 过程定义伪指令
28
一、数据定义伪指令
用于定义数据区中变量的类型、给变量附初值或给变 量分配存储空间。 格式:
[变量名] 伪指令助记符 操作数,… ;[注释]
例:
MOV AL,8+4-1 MOV AL,0ADH AND 0CCH
20
关系运算符
表示关系是否成立的运算符 参与关系运算的必须是两个数值
关系成立,结果=0FFFFH
关系不成立,结果=0。 运算符:
EQ,NE,LT,GT,LE,GE
例:MOV AX,3 LT 4
21
取值运算符
…
堆栈段名 ENDS
代码段名 SEGMENT
数据段名 ENDS
附加段名 SEGMENT … 附加段名 ENDS
…
代码段名 ENDS END
7
二、汇编语言语句类型及格式
8
1. 汇编语言语句类型
指令性语句 CPU执行的语句, 能够生成目标代码
指示性语句
CPU不执行,而由汇 编程序执行的语句, 不生成目标代码
M1 DB ‘How are you?’ M2 DW 3 DUP(11H),3344H DB 4 DUP(?) M3 DB 3 DUP(22H,11H,?)
M1
‘H’ ‘o’ ‘w’ ‘ ‘ ‘a’ ‘r’ ‘e’ ‘ ‘ ‘y’ ‘o’ ‘u’ ‘?’
M2
11H 00H 11H 00H 11H 00H 44H 33H XX XX XX XX
DATA2 DW 11H,22H,3344H
DATA3 DD 11H*2,22H,33445566H
以上变量在内存 中的存放形式
31
数据定义伪指令的几点说明
伪指令的性质决定所定义变量的属性;
定义字符串必须用DB伪指令
例:
DATA1 DB ‘ABCD’,66H
DATA1
41H 42H 43H 44H 66H
DW 20 DUP(?)
随机数 占1个字节单元
预留40个字节单元,每单元为随机值
34
数据定义伪指令例
M1 DB ‘How are you?’ M2 DW 3 DUP(11H),3344H
DB 4 DUP(?)
M3 DB 3 DUP(22H,11H,?)
变量在内存中的分区
35
表示符号地址 定义变量类型
定义变量值 及区域大小
29
1. 数据定义伪指令助记符
DB DW DD DQ DT
定义的变量为字节型 定义的变量为字类型(双字节) 定义的变量为双字型(4字节) 定义的变量为4字型(8字节) 定义的变量为10字节型
30
数据定义伪指令例
DATA1 DB 11H,22H,33H,44H
44
一个完整源程序结构例
CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG, ES:ESEG,SS:SSEG START:MOV AX,DSEG MOV DS,AX MOV AX,ESEG MOV ES,AX MOV AX,SSEG MOV SS,AX ┇ 源程序 CSEG ENDS 代码 END START
例:
MOV BYTE PTR [BX],12H
24
其它运算符
方括号: [ ]
方括号中内容为操作数的偏移地址
段重设符
段寄存器名:[ ] 用于修改默认的段基地址
25
§4.2 伪指令
掌握:
伪指令的格式及实现的操作
伪指令的应用
26
伪指令
由汇编程序执行的“指令”
作用:
数据定义如下,写出各条指令执行后 相应寄存器的内容
DATA SEGMENT X1 X3 ORG X4 DD 12345678H DW 1234H 100H EQU $-X1 BX=( AX=( ) )
62
DATA ENDS
(1)MOV BX, OFFSET X3 (2)MOV AX, X4
45
编程实例:
编写完整的8086汇编语言程序,将寄 存器AX的高8位传送到寄存器BL,低8 位传送到寄存器DL。
46
编程实例:
编写完整的汇编语言程序,将MEM1和 MEM2两个字节单元中存放的数相加, 并将结果送到MEM3单元
47
编程实例:
编写完整的汇编语言程序,将MEM1和 MEM2两个字节单元中存放的压缩BCD 相加,并将结果送到MEM3单元
第4章
汇编语言程序设计
1
主要内容
汇编语言源程序的结构 汇编语言语句格式 伪指令 功能调用 汇编语言程序设计
2
§4.1 汇编语言源程序
了解:
汇编语言源程序的结构
汇编语言语句类型及格式
3
一、汇编语言源程序结构
4
1. 汇编语言源程序与汇编程序
汇编语言源程序 汇编程序
用助记符编写 源程序的编译程序
37
二、符号定义伪指令
格式: 符号名 EQU 表达式
操作: 用符号名取代后边的表达式,不可重新定义 例: CONSTANT EQU 100 VAR EQU 30H+99H
EQU说明的表达式不占用内存空间
38
练习
根据下面的指令和伪指令序列,执行后,AX 寄存器的内容为( ) TAB ENTRY DW 1, 2, 3, 4, 5, 6 EQU 3
将断点地址由堆栈弹出
52
过程调用
段内直接调用
段内调用 段内间接调用 段间直接调用 段间调用
段间间接调用
53
1. 段内调用
被调用程序与调用程序在同一代码段
调用前只需保护断点的偏移地址
调用程序 被调用程序
格式: CALL OPRD 子程序入口偏移地址 执行过程:
将断点的偏移地址压入堆栈
代码 段1
代码 段1
54
将子程序入口偏移地址送IP
段内调用例
(1)CALL TIMRE 直接调用 间接调用
CALL
代 码 段
(2)CALL WORD PTR[SI] 设:SI=1200H CS=6000H 执行第(2)条指令后:
┇
1200H
CS = 6000H IP = 3344H
44H 33H
数 据 段
55
2. 段间调用
子程序与原调用程序不在同一代码段
调用前需保护断点的段基地址和偏移地址
先将断点的CS压栈,再压入IP。
56
段间调用例
格式:
CALL OPRD
CALL
格式例:
子程序入口地址
代 码 段
┇
SI
CALL FAR PTR TIMRE
CALL DWORD PTR[SI]
CS IP
例:’ABCD’
汇编时被译成对应的ASCII 码41H,42H,43H,44H
16
变量
代表内存中的数据区,程序中视为存储器 操作数
变量的属性:
段 值
偏移量 类 型
变量所在段的段地址 变量单元地址与段首地址之
间的位移量。
字节型、字型和双字型
17
标号
指令性语句的标号代表存放一条指令的存储单 元的符号地址。
9
2. 汇编语言语句格式
指令性语句:
[标号:] [前缀] 助记符 [操作数],[操作数] [ ;注释]
指令的符号地址 标号后要有冒号
操作码 注释前加分号
10
指示性语句格式
[名字] 伪指令助记符 [操作数 ,操作数,…] [ ;注释]
变量/过程/段的符号地址 其后不加冒号
告诉汇编程序执行什么操作
11
XXH XXH XXH XXH
数 据 段
57
3. 返回指令
功能:
从堆栈中弹出断点地址,返回原程序
格式: RET
RET指令一般位于子程序的最后。
58
八、其它伪指令
ORG
段内程序代码或变量的起始偏移地址
格式: ORG 表达式
计算值为 非负常数
例: ORG 2000H
A
DB 1,2,3
59
入口地址
调用程序 子程序
入口 地址
子程序执行结束后要返回 原调用处
断点地址
CALL
断点 地址
RET
51
调用及返回指令的执行过程
保护断点;
将调用指令的下一条指令的地址(断点)压入堆栈
获取子程序的入口地址;
从调用指令中获取子程序第1条指令的地址
执行子程序; 通过返回指令恢复断点,返回原程序。
3. 标号、名字
标号后有冒号,在指令性语句前;名字后不加
冒号,在指示性语句前。
英文字母、数字及专用字符组成,最大长度不 能超过31个,且不能由数字打头,不能用保留字 (如寄存器名,指令助记符,伪指令)。
12
4. 操作码
指令码 伪指令助记符
命令CPU要完成的操作
指示汇编程序要完成的操作。 作用:
48
编程实例:
求从TABLE开始的5个无符号字节数的和,结 果放SUM字单元中。
49
六、过程定义伪指令
用于定义一个过程体
格式:
┇
过程入口的 符号地址
过程名 PROC [ NEAR / FAR ]
过程名 ENDP
50
过程调用和返回
用于调用一个过程; 子程序由程序员预先设计
并装入内存
标号的属性:
段 值 偏移量 类 型 标号所在段的段地址
标号所在段的段首到定义该标号
的地址之间的字节数。 NEAR、FAR
18
表达式
算术运算 逻辑运算 关系运算 取值运算和属性运算 其它运算
19
算术运算和逻辑运算符
算术运算符
+,-,*,/,MOD AND,OR,NOT,XOR
逻辑运算符
MOV BX, OFFSET TAB
ADD BX, ENTRY
MOV AX, WORD PTR [BX]
39
三、段定义伪指令
功能:
说明逻辑段的起始和结束
格式:
段名 SEGMENT ┇
段名 ENDS
40
段定义伪指令例
DATA SEGMENT MEM1 DB 11H,22H
DATA ENDS
‘ A’ ‘ B’ ‘ C’ ‘ D’
32
2. 重复操作符
Biblioteka Baidu
作用:
为一个数据区的各单元设置相同的初值
目的:
常用于声明一个数据区
[变量名] 伪指令助记符 n DUP(初值,…)
格式:
例:
ABC DW 3 DUP(0)
33
3. “?”的作用
表示随机值,用于预留存储空间
MEM1 DB 34H,’A’,?
定义变量
分配存储单元 指示程序开始和结束等
13
5. 注 释
用分号作为注释的开始; 用于说明程序或语句的功能,以便于阅读 和理解
14
6. 操作数
寄存器
存储器单元 常量 变量或标号 表达式
15
常量
数字常量
字符串常量
例:‘A’
用单引号引起的字符或字符串
MOV AL,’A’
$的应用
地址计数器$用在指令中表示本条指令的起始 地址 当$用在伪指令的操作数字段时,则和指令中 的情况有所不同,它表示地址计数器的当前值
例:jnz $ 相当于 $: jnz $
例:ORG 0100H ARRAY DW 1,2,$+4,3,4,$+4
60
练习
已知
ORG 100H ARY DW 3, $+4, 5, 6 CNT EQU $-ARY DB 7, 8, CNT, 9 执行指令MOV AX,ARY+2和 MOV BX,ARY+10后, AX=( ),BX=( )
用于分析存储器操作数的属性 OFFSET SEG
取得其后变量或标号的偏移地址
取得其后变量或标号的段地址
22
取值运算符例
MOV AX,SEG DATA MOV DS,AX
MOV BX,OFFSET DATA
等价于
LEA BX,DATA
23
属性运算符
用于指定其后存储器操作数的类型 运算符:PTR
汇编语言 源程序
汇编程序
机器语言 目标程序
5
2. 汇编语言程序设计与执行过程
输入汇编语言源程序(EDIT)
汇编(MASM)
源文件 . ASM
目标文件 .OBJ 可执行文件.EXE
链接(LINK)
调试运行(DEBUG)
最终程序
6
3. 汇编语言源程序结构
数据段名 SEGMENT … 堆栈段名 SEGMENT
M3
22H 11H XX 22H 11H XX 22H 11H XX
随机数
36
练习
请图示下面伪指令定义的数据在内存中的存放形 式
(1)BUF1
(2)BUF2
DB
DW
‘12’,12, 12H,2*6,-1
’12’,12H,1234H 2 DUP(5, ?, 3 DUP(8))
(3)BUF3 DB
41
四、设定段寄存器伪指令
说明所定义逻辑段的性质
格式:
ASSUME 段寄存器名:段名
[,段寄存器名:段名,…]
42
五、结束伪指令
表示源程序结束 格式: END [标号]
43
一个完整源程序结构例
DSEG DATA1 DATA2 DSEG ESEG ESEG SSEG SSEG SEGMENT DB 1,2, DW 1234H ENDS SEGMENT DB 20 DUP(?) ENDS SEGMENT DB 200 DUP(?) ENDS
定义变量; 分配存储区;
定义逻辑段;
指示程序开始和结束; 定义过程等。
27
常用伪指令
数据定义伪指令
符号定义伪指令
段定义伪指令
结束伪指令 过程定义伪指令
28
一、数据定义伪指令
用于定义数据区中变量的类型、给变量附初值或给变 量分配存储空间。 格式:
[变量名] 伪指令助记符 操作数,… ;[注释]
例:
MOV AL,8+4-1 MOV AL,0ADH AND 0CCH
20
关系运算符
表示关系是否成立的运算符 参与关系运算的必须是两个数值
关系成立,结果=0FFFFH
关系不成立,结果=0。 运算符:
EQ,NE,LT,GT,LE,GE
例:MOV AX,3 LT 4
21
取值运算符
…
堆栈段名 ENDS
代码段名 SEGMENT
数据段名 ENDS
附加段名 SEGMENT … 附加段名 ENDS
…
代码段名 ENDS END
7
二、汇编语言语句类型及格式
8
1. 汇编语言语句类型
指令性语句 CPU执行的语句, 能够生成目标代码
指示性语句
CPU不执行,而由汇 编程序执行的语句, 不生成目标代码
M1 DB ‘How are you?’ M2 DW 3 DUP(11H),3344H DB 4 DUP(?) M3 DB 3 DUP(22H,11H,?)
M1
‘H’ ‘o’ ‘w’ ‘ ‘ ‘a’ ‘r’ ‘e’ ‘ ‘ ‘y’ ‘o’ ‘u’ ‘?’
M2
11H 00H 11H 00H 11H 00H 44H 33H XX XX XX XX
DATA2 DW 11H,22H,3344H
DATA3 DD 11H*2,22H,33445566H
以上变量在内存 中的存放形式
31
数据定义伪指令的几点说明
伪指令的性质决定所定义变量的属性;
定义字符串必须用DB伪指令
例:
DATA1 DB ‘ABCD’,66H
DATA1
41H 42H 43H 44H 66H
DW 20 DUP(?)
随机数 占1个字节单元
预留40个字节单元,每单元为随机值
34
数据定义伪指令例
M1 DB ‘How are you?’ M2 DW 3 DUP(11H),3344H
DB 4 DUP(?)
M3 DB 3 DUP(22H,11H,?)
变量在内存中的分区
35
表示符号地址 定义变量类型
定义变量值 及区域大小
29
1. 数据定义伪指令助记符
DB DW DD DQ DT
定义的变量为字节型 定义的变量为字类型(双字节) 定义的变量为双字型(4字节) 定义的变量为4字型(8字节) 定义的变量为10字节型
30
数据定义伪指令例
DATA1 DB 11H,22H,33H,44H
44
一个完整源程序结构例
CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG, ES:ESEG,SS:SSEG START:MOV AX,DSEG MOV DS,AX MOV AX,ESEG MOV ES,AX MOV AX,SSEG MOV SS,AX ┇ 源程序 CSEG ENDS 代码 END START
例:
MOV BYTE PTR [BX],12H
24
其它运算符
方括号: [ ]
方括号中内容为操作数的偏移地址
段重设符
段寄存器名:[ ] 用于修改默认的段基地址
25
§4.2 伪指令
掌握:
伪指令的格式及实现的操作
伪指令的应用
26
伪指令
由汇编程序执行的“指令”
作用: