汇编语言

来源:互联网 发布:网络21 编辑:程序博客网 时间:2024/06/06 01:05
 

第6章 汇编语言
6.1 实方式执行环境
6.2 源程序和语句
6.3 操作数表示
6.4 伪指令语句和变量
6.5 段声明和段间转移
6.6 目标文件和段模式
6.7 宏   
 

6.1 实方式执行环境
6.1.1 寄存器和指令集

6.1.2 存储器分段管理

6.1.3 16位存储器寻址方式

 
 

6.1.1 寄存器和指令集
.寄存器


.
32
位寄存器
EAX

EBX

ECX

EDX

ESP

EBP

ESI

EDI

16
位寄存器
AX

BX

CX

DX

SP

BP

SI

DI

8
位寄存器
AH

AL

BH

BL

CH

CL

DH

DL

.

寄存器
CS

DS

SS

ES
,以及段
寄存器
FS

GS
。寄存

CS
含有当前代码段的段值,寄存器
DS
含有当前数据段
的段值,寄存器
SS
含有当前堆栈段的段值。
.

方式
下指令指针寄存器
EIP
中的高
16
位必须是
0

相当
于只有低
16
位的
IP
起作用

.

方式
下堆栈指针寄存器
ESP
中的高
16
位必须是
0

相当
于只有低
16
位的
SP
起作用

.32位寄存器EAX、EBX、ECX、EDX、ESP、EBP、ESI和EDI;
16位寄存器AX、BX、CX、DX、SP、BP、SI和DI;
8位寄存器AH、AL、BH、BL、CH、CL、DH和DL。
.段寄存器CS、DS、SS和ES,以及段寄存器FS和GS。寄存
器CS含有当前代码段的段值,寄存器DS含有当前数据段
的段值,寄存器SS含有当前堆栈段的段值。
.实方式下指令指针寄存器EIP中的高16位必须是0,相当
于只有低16位的IP起作用。
.实方式下堆栈指针寄存器ESP中的高16位必须是0,相当
于只有低16位的SP起作用。


 
 

.指令集


.
数据
传送指令

.
算术运算指令

.
逻辑运算指令

.
移位指令

.
转移指令

.
字符串操作指令

.
位操作指令

.
条件字节设置指令

.
其他指令
.数据传送指令组
.算术运算指令组
.逻辑运算指令组
.移位指令组
.转移指令组
.字符串操作指令组
.位操作指令组
.条件字节设置指令组
.其他指令


6.1.1 寄存器和指令集   
 

6.1.2 存储器分段管理

.存储器分段条件


.
IA
-
32
系列处理器的物理地址空间规模达到
4G
.

方式下可访问的物理
地址空间
只有
1M
00000H
--
FFFFFH
.

方式下每个逻辑段必须满足如下两个条件

第一
,逻辑段的起始地址必须是
16

倍数
第二
,逻辑段的最大长度为
64K
.
存储
段,既可以相连,也可以
重叠
.IA-32系列处理器的物理地址空间规模达到4G
.实方式下可访问的物理地址空间只有1M
00000H -- FFFFFH
.实方式下每个逻辑段必须满足如下两个条件:
第一,逻辑段的起始地址必须是16的倍数
第二,逻辑段的最大长度为64K
.存储段,既可以相连,也可以重叠


最初的
Intel 8086
处理器是
16
位的


两个条件是为了方便地计算
1M
空间中的
20
位地址。
最初的Intel 8086处理器是16位的,
这两个条件是为了方便地计算1M空间中的20位地址。   
 

.物理地址计算


.

方式下,由于段的起始地址必须是
16
的倍数,因此段
起始地址有如下形式:
bbbbbbbbbbbbbbbb
0000
.
段起始地址采用
十六进制可表示成
XXXX
0
。这种
20
位的
段起始地址,可压缩表示成
16
位的
XXXX
形式。把
20
位段
起始地址的高
16

XXXX
称为

.

起始地址与段值的关系如下:
段起始地址
=
段值
×
16
.
物理
地址、段值和偏移之间有如下关系:
物理地址
=
段值
×
16

偏移
.实方式下,由于段的起始地址必须是16的倍数,因此段
起始地址有如下形式:
bbbbbbbbbbbbbbbb0000
.段起始地址采用十六进制可表示成XXXX0。这种20位的
段起始地址,可压缩表示成16位的XXXX形式。把20位段
起始地址的高16位XXXX称为段值。
.段起始地址与段值的关系如下:
段起始地址 = 段值×16
.物理地址、段值和偏移之间有如下关系:
物理地址 = 段值×16 + 偏移


6.1.2 存储器分段管理   
 

.物理地址计算


16位 段值
16151930 0 0 00
起始地址
416位 偏移
1930
段内偏移
40 0 0 020位 物理地址
190
物理地址
+
=
分段的条件:
第一
,逻辑段的起始地址必须是
16
的倍数
第二,逻辑段的最大长度为
64K
分段的条件:
第一,逻辑段的起始地址必须是16的倍数
第二,逻辑段的最大长度为64K

20
位段起始地址的高
16

XXXX
称为段值
把20位段起始地址的高16位XXXX称为段值
6.1.2 存储器分段管理   
 

.地址计算示例


 
1234:3456 15796
1234:34A8 157E8
FFF0:0000
FFF00
1234:3456 15796
1234:34A8 157E8
FFF0:0000 FFF00
采用十六进制表示
采用十六进制表示
一些存储单元的逻辑地址和对应的物理地址如下所列,
左边是逻辑地址,右边是对应的物理地址
6.1.2 存储器分段管理   
 

.地址计算示例


由于段可以重叠
,一
个物理地址可对应多个逻辑
地址
由于段可以重叠,一个物理地址可对应多个逻辑地址
100201233012345232500151002:2325 = 12345
1233:0015 = 12345
1002:2325 = 12345
1233:0015 = 12345
6.1.2 存储器分段管理
采用十六进制表示
采用十六进制表示   
 

.段寄存器引用


.

方式下,段寄存器中的内容是段值

.
代码
段寄存器
CS
给出当前代码段的段值,堆栈段寄存器
SS
给出当前堆栈段的段值,数据段寄存器
DS
给出当前缺
省数据段的段值。附加段寄存器
ES

FS

GS
也可以给出
其他数据段的段值

.
每当
需要产生一个
20
位的物理地址时,
CPU
会自动引用
一个段寄存器获得段值,形成
20
位的段起始地址,再加
上有效地址(偏移)。
.实方式下,段寄存器中的内容是段值。
.代码段寄存器CS给出当前代码段的段值,堆栈段寄存器
SS给出当前堆栈段的段值,数据段寄存器DS给出当前缺
省数据段的段值。附加段寄存器ES、FS、GS也可以给出
其他数据段的段值。
.每当需要产生一个20位的物理地址时,CPU会自动引用
一个段寄存器获得段值,形成20位的段起始地址,再加
上有效地址(偏移)。


6.1.2 存储器分段管理   
 

.段寄存器引用示例一


 
MOV
AX

0F000H
MOV
DS

AX
;DS
含段值
F000H
MOV
ESI

0
;
使
ESI

0
(最低地址偏移

0

MOV
EAX

[ESI]
;
取出最低的
4
个字节
MOV
EDX

[ESI+4]
;
再取出次低的
4
个字节
MOV AX,0F000H
MOV DS,AX ;DS含段值F000H
MOV ESI,0 ;使ESI为0(最低地址偏移为0)
MOV EAX,[ESI] ;取出最低的4个字节
MOV EDX,[ESI+4] ;再取出次低的4个字节
在实方式下,某个段的段值为
F000H
,现要把段内最低的
8

字节的内容送到两个
32
位的通用寄存器(
EAX

EDX
)中。
在实方式下,某个段的段值为F000H,现要把段内最低的8个
字节的内容送到两个32位的通用寄存器(EAX和EDX)中。
6.1.2 存储器分段管理   
 

.段寄存器引用示例二


 
MOV
AX,
0F000H
;
对应
源段的段值
MOV
DS, AX
;
使
DS
含源数据段的段值
MOV
AX,
0B800H
;
对应目标段的段值
MOV
ES, AX
;
使
ES
含目标数据段的段值
MOV
ESI, 0
;
ESI=0
MOV
EDI, 2000H
;
EDI=2000H
MOV
ECX, 8 ;
ECX=8
,作为循环计数
MOV AX, 0F000H ;对应源段的段值
MOV DS, AX ;使DS含源数据段的段值
MOV AX, 0B800H ;对应目标段的段值
MOV ES, AX ;使ES含目标数据段的段值
MOV ESI, 0 ;ESI=0
MOV EDI, 2000H ;EDI=2000H
MOV ECX, 8 ;ECX=8,作为循环计数
在实方式下,现要求把位于
F000H
段开始处的
32
个字节的数据
复制到开始地址为
B800:2000H
的区域。
在实方式下,现要求把位于F000H段开始处的32个字节的数据
复制到开始地址为B800:2000H的区域。

方式下,
F000H

B800H
都是段值。
实方式下,
F000H和B800H都是段值。
6.1.2 存储器分段管理   
 

.段寄存器引用示例二


NEXT
:
MOV
EAX,
[ESI
]
;
自动引用
DS
,偏移为
ESI

MOV
[
ES:EDI]
, EAX
;
引用
段寄存器
ES
,偏移为
EDI

ADD
ESI,
4
ADD
EDI,
4
LOOP NEXT
NEXT:
MOV EAX, [ESI] ;自动引用DS,偏移为ESI值
MOV [ES:EDI], EAX ;引用段寄存器ES,偏移为EDI值
ADD ESI, 4
ADD EDI, 4
LOOP NEXT
如何利用
字符串操作指令

如何利用字符串操作指令?
在实方式下,现要求把位于
F000H
段开始处的
32
个字节的数据
复制到开始地址为
B800:2000H
的区域。
在实方式下,现要求把位于F000H段开始处的32个字节的数据
复制到开始地址为B800:2000H的区域。
6.1.2 存储器分段管理   
 

.段寄存器引用示例二


……
……
66C68B10……
F000066C68B10B8000……
BA000C68BEAX6610ES=B800EDI=2000DS=F000ESI=0000
在实方式下,现要求把位于
F000H
段开始处的
32
个字节的数据
复制到开始地址为
B800:2000H
的区域。
在实方式下,现要求把位于F000H段开始处的32个字节的数据
复制到开始地址为B800:2000H的区域。
6.1.2 存储器分段管理   
 

.16位存储器寻址方式


.
为了
保持与早先处理器的兼容,
IA
-
32
系列处理器还支

16
位的存储器寻址方式,也就是给出
16
位的存储单元
有效地址,或者说给出
16
位的偏移

.
16
位的存储器寻址方式,主要应用于实方式。在实方式
下,存储段的长度不超过
64K
,存储单元的有效地址是
16


.为了保持与早先处理器的兼容,IA-32系列处理器还支
持16位的存储器寻址方式,也就是给出16位的存储单元
有效地址,或者说给出16位的偏移。
.16位的存储器寻址方式,主要应用于实方式。在实方式
下,存储段的长度不超过64K,存储单元的有效地址是
16位。


32
位寻址方式同时有效!
32位寻址方式同时有效!
6.1.3 16位存储器寻址方式   
 

.16位存储器寻址方式


.
16
位有效地址
EA
可以有多种表示形式
.16位有效地址EA可以有多种表示形式


基址
部分可以是寄存器
BX

BP

变址
部分可以是寄存器
SI

DI

位移
量采用补码形式表示,在计算有效地址时,如位移
量是
8
位,则被带符号扩展成
16
位。
基址部分可以是寄存器BX或BP;
变址部分可以是寄存器SI或DI;
位移量采用补码形式表示,在计算有效地址时,如位移
量是8位,则被带符号扩展成16位。
+EA =
BXBP+SIDI8位
16位
基址变址位移量
6.1.3 16位存储器寻址方式   
 

6.1.3 16位存储器寻址方式

.演示16位存储器寻址方式的使用


.
演示
16
位存储器寻址方式的
使用
.演示16位存储器寻址方式的使用


 
MOV
[DI],
AX
ADD
DL, [SI+100H
]
SUB
CX, [BX+DI
-
4
]
MOV
[BX+SI+1230H],
AL
MOV
DX, [BP+8
]
MOV [DI], AX
ADD DL, [SI+100H]
SUB CX, [BX+DI-4]
MOV [BX+SI+1230H], AL
MOV DX, [BP+8]
操作数

8
位或者
16

操作数是8位或者16位   
 

.演示16位存储器寻址方式的使用


.
演示
16
位存储器寻址方式的
使用
.演示16位存储器寻址方式的使用


 
MOV
EAX, [SI
]
ADD
EDX, [DI
-
4
]
SUB
[BX+DI],
ECX
MOV
[BX+SI+3],
EAX
MOV EAX, [SI]
ADD EDX, [DI-4]
SUB [BX+DI], ECX
MOV [BX+SI+3], EAX
操作数是
32

操作数是32位
6.1.3 16位存储器寻址方式   
 

.演示16位存储器寻址方式的使用


.
如下指令中的
16
位存储器寻址方式的使用
是非法

.如下指令中的16位存储器寻址方式的使用是非法的


 
MOV
EAX, [SI+DI
]
MOV
DX, [AX
]
MOV
[CX
-
3],
AL
MOV EAX, [SI+DI]
MOV DX, [AX]
MOV [CX-3], AL
寻址方式非法!
寻址方式非法!
采用
32
位寻址方式应该如何表示?
采用32位寻址方式应该如何表示?
6.1.3 16位存储器寻址方式   
 

.演示16位存储器寻址方式的使用


.
演示
针对
16
位存储器寻址方式的取有效地址
指令
.演示针对16位存储器寻址方式的取有效地址指令


 
MOV
DI, 1234H ;DI=1234H
MOV
BX, 16H ;BX=0016H
LEA
SI, [DI+BX+5]
;SI=124FH
LEA
EAX, [BX+DI
-
2]
;EAX=00001248H
MOV DI, 1234H ;DI=1234H
MOV BX, 16H ;BX=0016H
LEA SI, [DI+BX+5] ;SI=124FH
LEA EAX, [BX+DI-2] ;EAX=00001248H
6.1.3 16位存储器寻址方式