汇编语言3

来源:互联网 发布:数控铣床软件与编程 编辑:程序博客网 时间:2024/06/05 04:27
 

第6章 汇编语言
6.1 实方式执行环境

6.2 源程序和语句

6.3 操作数表示

6.4 伪指令语句和变量

6.5 段声明和段间转移

6.6 目标文件和段模式

6.7 宏

汇编语言!
汇编语言!   
 

6.5 段声明和段间转移
6.5.1 段声明语句
6.5.2 无条件段间转移指令
6.5.3 段间过程调用和返回指令
IA
-
32
处理器支持存储器分段管理。
通常
一个程序可以含有多个段,不仅代码和数
据可以各自独立,而且根据需要不同功能的代
码也可以占用不同的
段。
IA-32处理器支持存储器分段管理。
通常一个程序可以含有多个段,不仅代码和数
据可以各自独立,而且根据需要不同功能的代
码也可以占用不同的段。   
 

6.5.1 段声明语句
.段声明语句


.
格式
SECTION
段名
[
段属性
] [;
注释
]
.格式
SECTION 段名 [段属性] [;注释]


声明段的关键词
声明段的关键词
段的名称(标识符)
段的名称(标识符)
段的其他性质
段的其他性质
.
概念
段声明语句属于指示语句
。它
指示汇编器
,开始一个新的
段,或者从当前段切换到另一个段。
.概念
段声明语句属于指示语句。它指示汇编器,开始一个新的
段,或者从当前段切换到另一个段。


之后,
段名代表段值
之后,

段名代表段值

 
 

6.5.1 段声明语句
.段声明语句


.
格式
SECTION
段名
[
段属性
] [;
注释
]
.格式
SECTION 段名 [段属性] [;注释]


声明段的关键词
声明段的关键词
段的名称(标识符)
段的名称(标识符)
段的其他性质
段的其他性质
.
另一种格式
SEGMENT
段名
[
段属性
] [;
注释
]
.另一种格式
SEGMENT 段名 [段属性] [;注释]


 
 

6.5.1 段声明语句
.演示程序dp65.asm


演示段声明语句的使用
section
code
..
start
:
MOV
AX, data
MOV
DS, AX
MOV
DX, hello
CALL
Print_str
MOV
AH, 4CH
INT
21H
over
:
;
section
data
hello
db
"Hello world!", 0DH, 0AH,
24H
section code
..start:
MOV AX, data
MOV DS, AX
MOV DX, hello
CALL Print_str
MOV AH, 4CH
INT 21H
over:
;
section data
hello db "Hello world!", 0DH, 0AH, 24H
开始地址
开始地址
声明段
code
声明段code
声明段
data
声明段data
section
code
Print_str
:
MOV
AH, 9
INT
21H
RET
section code

Print_str:

 MOV AH, 9

 INT 21H

 RET

切换到段
code
切换到段code
经过汇编和连接后生成,
EXE
类型的可执行程序
经过汇编和连接后生成,
EXE类型的可执行程序   
 

.
生成
EXE
可执行程序

Windows
控制台窗口中,利用如下汇编和链接命令,可
以由源程序
dp65.asm
生成可执行程序
dp65.exe

NASM
dp65.asm
-
f
obj
-
o
dp65.obj
LINK
dp65 ;
.生成EXE可执行程序
在Windows控制台窗口中,利用如下汇编和链接命令,可
以由源程序dp65.asm生成可执行程序dp65.exe:
NASM dp65.asm -f obj -o dp65.obj
LINK dp65 ;


目标
文件
obj
格式
目标文件obj格式
6.5.1 段声明语句
.演示程序dp65.asm


可执行程序为
dp65.exe
可执行程序为dp65.exe

 
 

6.5.2 无条件段间转移指令
.回顾


直接
间接
.


.


.无条件转移指令可分为4种:
.段内直接转移
.段内间接转移
.段间直接转移
.段间间接转移




跨段(否
/
是)
目的地址(直接
/
间接)
跨段(否/是)
目的地址(直接/间接)   
 

6.5.2 无条件段间转移指令
.回顾


.
跨段:
无条件
段间转移
继续执
行的指令在另一个代码段中
.
实方式下的约束:
.跨段:无条件段间转移指令不仅设置IP,而且重新设
置代码段寄存器CS。由于重置CS,所以转移后继续执
行的指令在另一个代码段中。
.实方式下的约束:段内偏移只有16位,指令指针寄存
器EIP低16位的IP起作用。堆栈指针寄存器ESP低
16位的SP起作用。


这里只介绍
实方式下
的无条件段间转移
这里只介绍实方式下的无条件段间转移   
 

6.5.2 无条件段间转移指令
.演示程序dp66.asm


 
section
codeA
..
start
:
MOV
AX,
data
MOV
DS,
AX
MOV
DL, [
flagch
]
MOV
AH, 2
INT 21H
;
JMP codeB:step2
;
section codeA
..start:
MOV AX, data
MOV DS, AX
MOV DL, [flagch]
MOV AH, 2
INT 21H
;
JMP codeB:step2
;
演示无条件段间直接转移指令的使用,
3个代码段和1个数据段
step4
:
MOV
DL, [
flagch
]
MOV
AH, 2
INT 21H
;
MOV
AH, 4CH
INT 21H
step4:
MOV DL, [flagch]
MOV AH, 2
INT 21H
;
MOV AH, 4CH
INT 21H
声明段
code
声明段code
无条件段间直接转移指令
无条件段间直接转移指令
开始地址
开始地址

经过汇编和连接后生成,
EXE
类型的可执行程序
经过汇编和连接后生成,
EXE类型的可执行程序   
 

6.5.2 无条件段间转移指令
.演示程序dp66.asm


 
section
data
align=16
flagch
db
"ABC"
;
section data align=16
flagch db "ABC"
;
声明段
data
16
字节地址对齐
声明段data
16字节地址对齐
无条件段间直接转移指令
无条件段间直接转移指令
section
codeC
align=16
step3
:
MOV
DL, [
flagch
+2]
MOV
AH, 2
INT 21H
;
JMP
FAR
step4
section codeC align=16

step3:

 MOV DL, [flagch +2]

 MOV AH, 2

 INT 21H

 ;

 JMP FAR step4

声明段
codeC
16
字节地址对齐
声明段codeC
16字节地址对齐   
 

6.5.2 无条件段间转移指令
.演示程序dp66.asm


无条件段间直接转移指令
无条件段间直接转移指令
section
codeB
align=16
step2
:
MOV
DL, [
flagch
+1]
MOV
AH, 2
INT 21H
;
JMP
codeC:step3
section codeB align=16
step2:
MOV DL, [flagch +1]
MOV AH, 2
INT 21H
;
JMP codeC:step3
声明段
codeB
16
字节地址对齐
声明段codeB
16字节地址对齐
经过汇编和连接后生成,
EXE
类型的可执行程序
经过汇编和连接后生成,

EXE类型的可执行程序

 
 

6.5.2 无条件段间转移指令
.无条件段间转移指令


.
无条件段间
直接转移
指令的一般格式
.无条件段间直接转移指令的一般格式


SNAME
LABEL
JMP SNAME : LABEL



段名 标号
标号
FAR
LABEL
JMP FAR LABEL

标号
标号

类型说明符
类型说明符   
 

6.5.2 无条件段间转移指令
.无条件段间转移指令


SNAME
LABEL
JMP SNAME : LABEL



段名 标号
标号

操作码OP偏移段值
实方式下
无条件段间转移的
机器码格式:
16
位偏移
: 16
位段值
实方式下无条件段间转移的机器码格式:

16位偏移 : 16位段值

.
无条件段间
直接转移
指令的一般格式
.无条件段间直接转移指令的一般格式


 
 

6.5.2 无条件段间转移指令
.无条件段间转移指令


SNAME
LABEL
JMP SNAME : LABEL



段名 标号
标号

.
无条件段间
直接转移
指令的一般格式
.无条件段间直接转移指令的一般格式


.
在实方式
下,指令把所
带的段值送到代码段寄存器
CS

同时把偏移送到指令指针寄存器
IP
,从而实现段间转移。
.在实方式下,指令把所带的段值送到代码段寄存器CS,
同时把偏移送到指令指针寄存器IP,从而实现段间转移。


 
 

6.5.2 无条件段间转移指令
.无条件段间转移指令


.
无条件段间
间接
转移
指令的一般格式
.无条件段间间接转移指令的一般格式


FAR
OPRD
JMP FAR OPRD


字存储单元
双字存储单元

类型说明符
类型说明符
.
在实方式


操作数
OPRD
应该是一个双字存储单元

FAR
是类型符,明确表示段间转移(远转移)

.
指令
把双字存储单元
OPRD
中的一个字(高地址的字)
作为
16
位的段值送到代码段寄存器
CS
,把双字中的另一
个字(低地址的字)作为
16
位的偏移送到指令指针寄存

IP
,从而实现转移。
.在实方式下,操作数OPRD应该是一个双字存储单元。
FAR是类型符,明确表示段间转移(远转移)。
.指令把双字存储单元OPRD中的一个字(高地址的字)
作为16位的段值送到代码段寄存器CS,把双字中的另一
个字(低地址的字)作为16位的偏移送到指令指针寄存
器IP,从而实现转移。


 
 

6.5.3 段间过程调用和返回指令
.回顾


.


.


.过程调用指令可分为4种:
.段内直接调用
.段内间接调用
.段间直接调用
.段间间接调用




跨段(否
/
是)
目的地址(直接
/
间接)
跨段(否/是)

目的地址(直接/间接)

在实方式下
,子程序的
入口地址的段内偏移只有
16
位,
当然返回地址的段内偏移也只有
16
位。
在实方式下,子程序的入口地址的段内偏移只有16位,
当然返回地址的段内偏移也只有16位。

 
 

6.5.3 段间过程调用和返回指令
.段间过程调用指令


.


直接
调用

令的一般格式
.段间直接调用指令的一般格式


SNAME
LABEL
CALL SNAME : LABEL



段名 标号
标号

FAR
LABEL
CALL FAR LABEL

标号
标号

类型说明符
类型说明符
.
首先
把返回地址的段值和偏移压入
堆栈;
.
然后
把指令中所带的段值送到
CS
,同时把偏移送到
IP

从而转移到
子程序。
.首先把返回地址的段值和偏移压入堆栈;
.然后把指令中所带的段值送到CS,同时把偏移送到IP,
从而转移到子程序。


 
 

6.5.3 段间过程调用和返回指令

.段间过程调用指令


.


间接
调用

令的一般格式
.段间间接调用指令的一般格式


FAR
OPRD
CALL FAR OPRD


字存储单元
双字存储单元

类型说明符
类型说明符
.
首先
把返回地址的段值和偏移压入
堆栈;
.
然后
把双字存储单元
OPRD
中的一个字(高地址的字)
作为
16
位的段值送到
CS
,把双字中的另一个字(低地址
的字)作为
16
位的偏移送到
IP
,从而转移到
子程序。
.首先把返回地址的段值和偏移压入堆栈;
.然后把双字存储单元OPRD中的一个字(高地址的字)
作为16位的段值送到CS,把双字中的另一个字(低地址
的字)作为16位的偏移送到IP,从而转移到子程序。


 
 

6.5.3 段间过程调用和返回指令
.段间过程调用指令


.
段间
调用
指令执行的堆栈示意
.段间调用指令执行的堆栈示意


SP. . . . . .
SP. . . . . .
返回地址段值
(a)调用前的堆栈(b)调用后的堆栈
堆栈底部堆栈底部
SP. . . . . .
(c)返回后的堆栈
堆栈底部
返回地址偏移
在实方式下
,子程序的
入口
地址和返回地址的
段内偏移只有
16
位。
段间
调用
,返回地址由
段值

偏移
两部分构成。
在实方式下,子程序的入口地址和返回地址的段内偏移只有16位。

段间调用,返回地址由段值和偏移两部分构成。

实方式下,只有
16

实方式下,只有16位   
 

6.5.3 段间过程调用和返回指令
.段间过程调用指令


.


过程返回
指令的一般格式
.段间过程返回指令的一般格式


RETF

.
在实方式
下,指令从
堆栈先后弹出返回地址的偏移和段
值,分别送到
IP

CS
,从而
实现子程序的
段间
返回。
.在实方式下,指令从堆栈先后弹出返回地址的偏移和段
值,分别送到IP和CS,从而实现子程序的段间返回。


 
 

6.5.3 段间过程调用和返回指令

.段间过程调用指令


.

间带立即数
过程返回
指令的一般格式
.段间带立即数过程返回指令的一般格式


RETF count

.
指令

实现段间返回的同时,再额外根据
count
值调整堆
栈指针

.

实方式下具体操作是,先从堆栈弹出返回地址的偏移
和段值(当然,会调整堆栈指针
SP
),再把
count
加到
SP
上。
.指令在实现段间返回的同时,再额外根据count值调整堆
栈指针。
.在实方式下具体操作是,先从堆栈弹出返回地址的偏移
和段值(当然,会调整堆栈指针SP),再把count加到
SP上。


 
 

6.5.3 段间过程调用和返回指令

.演示程序dp68.asm


 
section
codeA
align=16
..
start
:
MOV
AX, CS
MOV
DS,
AX
;
MOV
AX,
codeC
CALL
FAR [
ptsubr
]
;
MOV
DL,
0DH
CALL
codeC:PutChar
MOV
DL, 0AH
CALL
codeC:PutChar
section codeA align=16

..start:

 MOV AX, CS

 MOV DS, AX

 ;

 MOV AX, codeC

 CALL FAR [ptsubr]

 ;

 MOV DL, 0DH

 CALL codeC:PutChar

 MOV DL, 0AH

 CALL codeC:PutChar

演示段间过程调用和返回指令的使用
声明段
codeA
声明段codeA
段间间接调用
段间间接调用

开始地址
开始地址
经过汇编和连接后生成,
EXE
类型的可执行程序
经过汇编和连接后生成,

EXE类型的可执行程序

段间直接调用
段间直接调用

显示运行时的段codeC   
 

6.5.3 段间过程调用和返回指令
.演示程序dp68.asm


 
MOV
SI,
ptsubr
MOV
AX,
codeB
CALL
FAR [SI
]
;
MOV
AH, 4CH
INT 21H
;
ptsubr
dw
echo4
dw
codeB
MOV SI, ptsubr

 MOV AX, codeB

 CALL FAR [SI]

 ;

 MOV AH, 4CH

 INT 21H

 ;

ptsubr dw echo4

 dw codeB

段间间接调用
段间间接调用
存储单元含有子程序入口地址
存储单元含有子程序入口地址

演示段间过程调用和返回指令的使用

显示运行时的段codeB   
 

6.5.3 段间过程调用和返回指令
.演示程序dp68.asm


 
section
codeB
align=16
ToASCII
:
AND
DL,
0FH
ADD
DL, '0'
CMP
DL, '9'
JBE
lab1
ADD
DL, 7
lab1
:
RET
section codeB align=16

ToASCII:

 AND DL, 0FH

 ADD DL, '0'

 CMP DL, '9'

 JBE lab1

 ADD DL, 7

lab1:

 RET

显示
4
位十六进制数
显示4位十六进制数
echo4
:
MOV
CX,
4
MOV
BX, AX
next
:
ROL
BX, 4
MOV
DL, BL
CALL
ToASCII
CALL
codeC:PutChar
LOOP
next
MOV
DL, 'H'
CALL
codeC:PutChar
RETF
echo4:

 MOV CX, 4

 MOV BX, AX

next:

 ROL BX, 4

 MOV DL, BL

 CALL ToASCII

 CALL codeC:PutChar

 LOOP next

 MOV DL, 'H'

 CALL codeC:PutChar

 RETF

声明段
codeB
声明段codeB

1位十六进制数转换成
ASCII码
段间直接调用
段间直接调用

段间返回
段间返回   
 

6.5.3 段间过程调用和返回指令

.演示程序dp68.asm


 
section
codeC
align=16
PutChar
:
MOV
AH, 2
INT
21H
RETF
section codeC align=16

PutChar:

 MOV AH, 2

 INT 21H

 RETF

显示一个字符

声明段
codeC
声明段codeC
段间返回
段间返回

经过汇编和连接后生成,
EXE
类型的可执行程序
经过汇编和连接后生成,
EXE类型的可执行程序   
 

6.6 目标文件和段模式

6.6.1 目标文件

6.6.2 段模式声明语句

 
 

6.6.1 目标文件
汇编
汇编语言

源程序

目标程序

汇编器

NASM

.回顾


目标文件
目标文件

不同的操作系统,对
可执行文件
的格式有不同要求

为了
满足不同要求,有
多种不同格式

目标文件

这些
不仅与操作系统有关,也与
汇编器

连接器
有关。
不同的操作系统,对可执行文件的格式有不同要求。
为了满足不同要求,有多种不同格式的目标文件。
这些不仅与操作系统有关,也与汇编器和连接器有关。   
 

6.6.1 目标文件
.纯二进制目标文件


.
纯二进制目标
文件
,只
含有对应源程序的二进制代码,
也即二进制形式的机器指令和数据,并不含有其他信息

.

二进制目标文件有时很有用,尤其在没有操作系统的
场合。
.纯二进制目标文件,只含有对应源程序的二进制代码,
也即二进制形式的机器指令和数据,并不含有其他信息。
.纯二进制目标文件有时很有用,尤其在没有操作系统的
场合。


 
 

6.6.1 目标文件
.纯二进制目标文件


.
使用汇编器
NASM
利用汇编器
NASM
,生成纯二进制代码文件的方法:
nasm
xxx.asm
-
f
bin
-
o
xxx.com
nasm
xxx.asm
-
o
xxx.com
nasm
xxx.asm
-
o
yyy
.使用汇编器NASM
利用汇编器NASM,生成纯二进制代码文件的方法:
nasm xxx.asm -f bin -o xxx.com
nasm xxx.asm -o xxx.com
nasm xxx.asm -o yyy


缺省为
bin
(纯二进制)格式
缺省为bin(纯二进制)格式
目标文件名可以没有后缀
目标文件名可以没有后缀

 
 

6.6.1 目标文件
.演示程序dp69.asm


观察纯二进制目标文件
section
code
begin
:
MOV
AX,
begin
;
把标号
begin
代表的偏移送到
AX

AX=0000H
MOV
AX,
$
;
把当前偏移送到
AX

AX=0003H
lab1
:
MOV
AX,1234H
;

1234H
送到
AX

AX=1234H
lab2
:
J
MP
short
lab2
;
跳转到自己(构成无限循环)
;
wvar1
dw
lab1
,
lab2
;
定义
2
个字变量,初值是
lab1

lab2
代表偏移
wvar2
dw
wvar1
;
定义
1
个字变量,初值是
wvar1
代表的偏移
section code
begin:
MOV AX, begin ;把标号begin代表的偏移送到AX,AX=0000H
MOV AX, $ ;把当前偏移送到AX,AX=0003H
lab1:
MOV AX,1234H ;把1234H送到AX,AX=1234H
lab2:
JMP short lab2 ;跳转到自己(构成无限循环)
;
wvar1 dw lab1, lab2 ;定义2个字变量,初值是lab1和lab2代表偏移
wvar2 dw wvar1 ;定义1个字变量,初值是wvar1代表的偏移
1
个段
code
1个段code   
 

6.6.1 目标文件
.演示程序dp69.asm


观察纯二进制目标文件
观察纯二进制目标文件
B8
00 00
; MOV AX,
begin
;
0000
B8
03 00
; MOV AX,
$
;
0003
B8
34 12
; MOV AX,
1234H
;
0006
E9
FE ; JMP short lab2 ;
0009
06 00
09 00
;
dw
lab1, lab2 ;
000B
0B 00
;
dw
wvar1 ; 000F
B8 00 00 ; MOV AX, begin ; 0000
B8 03 00 ; MOV AX, $ ; 0003
B8 34 12 ; MOV AX, 1234H ; 0006
E9 FE ; JMP short lab2 ; 0009
06 00 09 00 ; dw lab1, lab2 ; 000B
0B 00 ; dw wvar1 ; 000F
机器码或数据字节值
机器码或数据字节值 对应源代码
对应源代码 行代码开始偏移
行代码开始偏移   
 

6.6.1 目标文件
.纯二进制目标文件


.
Windows

32
位版本)仍然
支持以纯二进制目标文件形式
存在的可执行程序,只要其
扩展名是
.com

.
为了
运行这样的可执行程序,操作系统(
Windows
中的
DOS
)总是把纯二进制文件加载到内存代码段的偏移
100H
开始处,
执行起始点偏移也是
100H

.Windows(32位版本)仍然支持以纯二进制目标文件形式
存在的可执行程序,只要其扩展名是.com。
.为了运行这样的可执行程序,操作系统(Windows中的
DOS)总是把纯二进制文件加载到内存代码段的偏移100H
开始处,执行起始点偏移也是100H。


 
 

6.6.1 目标文件
.回顾演示程序dp61.asm


显示输出“Hello world!”
segment
text
org 100H
;
MOV
AX, CS
MOV
DS,
AX
;
MOV
DX,
hello
MOV
AH, 9
INT
21H
;
MOV
AH, 4CH
INT
21H
;
hello
db
"Hello world!",0DH,0AH
,'$'
segment text
org 100H
;
MOV AX, CS
MOV DS, AX
;
MOV DX, hello
MOV AH, 9
INT 21H
;
MOV AH, 4CH
INT 21H
;
hello db "Hello world!",0DH,0AH,'$'
指示段的起始偏移
指示段的起始偏移
1
个段
code
1个段code   
 

6.6.1 目标文件
.演示程序dp610.asm


观察
含有指示语句
org
的源程序对应的纯二进制目标文件
观察含有指示语句org的源程序对应的纯二进制目标文件
section
code
org
100H
begin
:
MOV
AX, begin
;
把标号
begin
代表的偏移送到
AX

AX=
0100
H
MOV
AX, $
;
把当前偏移送到
AX

AX=
0103
H
lab1
:
MOV
AX,1234H
;

1234H
送到
AX

AX=1234H
lab2:
JMP short lab2 ;
跳转到自己(构成无限循环)
;
wvar1
dw
lab1
, lab2 ;
定义
2
个字变量,初值是
lab1

lab2
代表偏移
wvar2
dw
wvar1
;
定义
1
个字变量,初值是
wvar1
代表的偏移
section code
org 100H
begin:
MOV AX, begin ;把标号begin代表的偏移送到AX,AX=0100H
MOV AX, $ ;把当前偏移送到AX,AX=0103H
lab1:
MOV AX,1234H ;把1234H送到AX,AX=1234H
lab2:
JMP short lab2 ;跳转到自己(构成无限循环)
;
wvar1 dw lab1, lab2 ;定义2个字变量,初值是lab1和lab2代表偏移
wvar2 dw wvar1 ;定义1个字变量,初值是wvar1代表的偏移
指示段的起始偏移
指示段的起始偏移 其他部分与
dp69.asm
相同
其他部分与dp69.asm相同   
 

6.6.1 目标文件
.演示程序dp610.asm


观察纯二进制目标文件
B8
00 01
; MOV AX, begin ; 0000
B8
03 01
; MOV AX, $ ; 0003
B8
34 12 ; MOV AX, 1234H ; 0006
E9
FE ; JMP short lab2 ; 0009
06 01 09 01
;
dw
lab1, lab2 ; 000B
0B 01
;
dw
wvar1 ; 000F
B8 00 01 ; MOV AX, begin ; 0000
B8 03 01 ; MOV AX, $ ; 0003
B8 34 12 ; MOV AX, 1234H ; 0006
E9 FE ; JMP short lab2 ; 0009
06 01 09 01 ; dw lab1, lab2 ; 000B
0B 01 ; dw wvar1 ; 000F
机器码或数据字节值
机器码或数据字节值 对应源代码
对应源代码 代码行开始偏移
代码行开始偏移   
 

6.6.1 目标文件
.OBJ目标文件


.
obj
格式目标文件适用于生成
EXE
类型的可执行程序
。早


DOS
操作系统下,可执行程序主要是
EXE
类型。
.

汇编器对源程序
汇编生成
obj
格式目标
文件,由
链接


obj
格式目标文件连接后
,生成
EXE
类型的可执行程序。
.
obj
格式目标文件不仅含有对应源程序的机器指令和数据,
而且还含有其他重要信息
。例如,支持引用段值的信息。
又如,程序开始执行位置的信息。所以,
obj
格式目标文
件要比纯二进制目标文件来得长

.obj格式目标文件适用于生成EXE类型的可执行程序。早
先的DOS操作系统下,可执行程序主要是EXE类型。
.由汇编器对源程序汇编生成obj格式目标文件,由链接器
对obj格式目标文件连接后,生成EXE类型的可执行程序。
.obj格式目标文件不仅含有对应源程序的机器指令和数据,
而且还含有其他重要信息。例如,支持引用段值的信息。
又如,程序开始执行位置的信息。所以,obj格式目标文
件要比纯二进制目标文件来得长。


 
 

6.6.1 目标文件
.OBJ目标文件


.

用于生成
obj
格式目标文件的源程序中,
段名代表段值

所以可以通过段名来引用段值。还可以利用运算符
seg

获取标号所在段的段值。但是,在这样的源程序中,

能安排起始偏移设定语句
org

.

多个
由链接器
链接

一起的目标文件中,有且只能有
1
个目标文件含有开始执行的位置

.
就汇编器
NASM
而言,程序
开始执行的位置,在源程序中
由特定的标号
..start
给出

.在用于生成obj格式目标文件的源程序中,段名代表段值,
所以可以通过段名来引用段值。还可以利用运算符seg,
获取标号所在段的段值。但是,在这样的源程序中,不
能安排起始偏移设定语句org。
.在多个由链接器链接到一起的目标文件中,有且只能有1
个目标文件含有开始执行的位置。
.就汇编器NASM而言,程序开始执行的位置,在源程序中
由特定的标号..start给出。


 
 

6.6.2 段模式声明语句
.关于段模式


.
无论
是保护方式还是实方式,
IA
-
32
系列处理器都支持
8
位、
16
位和
32
位的操作数,都支持
16
位和
32
位的存储器
寻址方式

.
为了
保持兼容,同时保证效率,
IA
-
32
系列处理器支持两
种段模式,也即
32
位段模式和
16
位段模式

.

保护方式下,一般采用
32
位段;
在实方式下,只能使

16
位段

.无论是保护方式还是实方式,IA-32系列处理器都支持8
位、16位和32位的操作数,都支持16位和32位的存储器
寻址方式。
.为了保持兼容,同时保证效率,IA-32系列处理器支持两
种段模式,也即32位段模式和16位段模式。
.在保护方式下,一般采用32位段;在实方式下,只能使
用16位段。


 
 

6.6.2 段模式声明语句
.关于段模式


.
对于
32
位段,缺省的操作数尺寸是
8
位和
32
位,缺省的存
储器寻址方式是
32


.
对于
16
位段,缺省的操作数尺寸是
8
位和
16
位,缺省的存
储器寻址方式是
16
位。
.对于32位段,缺省的操作数尺寸是8位和32位,缺省的存
储器寻址方式是32位。
.对于16位段,缺省的操作数尺寸是8位和16位,缺省的存
储器寻址方式是16位。


 
 

6.6.2 段模式声明语句
.段模式声明语句


.
段模式声明语句的格式
BITS
32
BITS 16
第一
条指示
汇编器
NASM

32
位段模式来翻译随后的代码

第二条指示

16
位段模式来翻译随后的
代码。
.段模式声明语句的格式
BITS 32
BITS 16
第一条指示汇编器NASM按32位段模式来翻译随后的代码;
第二条指示按16位段模式来翻译随后的代码。


 
 

6.6.2 段模式声明语句
.演示程序dp611.asm


 
segment
text
org
100H
;
设起始偏移
100H
MOV
AX, CS
MOV
DS, AX
bits
16
;
声明
16
位段模式
MOV
AL, 1 ;B0 01
MOV
AX, 1 ;B8 01 00
MOV
EAX, 1 ;
66
B8 01 00 00 00
MOV
SI,
wvar
;BE 51 01
MOV
EBX,
wvar
;
66
BB 51 01 00 00
MOV
AL, [SI] ;8A 04
MOV
AX, [SI] ;8B 04
MOV
EAX, [SI] ;
66
8B 04
MOV
AL, [EBX] ;
67
8A 03
MOV
AX, [EBX] ;
67
8B 03
MOV
EAX, [EBX] ;
67 66
8B
03
segment text
org 100H ;设起始偏移100H
MOV AX, CS
MOV DS, AX
bits 16 ;声明16位段模式
MOV AL, 1 ;B0 01
MOV AX, 1 ;B8 01 00
MOV EAX, 1 ;66 B8 01 00 00 00
MOV SI, wvar ;BE 51 01
MOV EBX, wvar ;66 BB 51 01 00 00
MOV AL, [SI] ;8A 04
MOV AX, [SI] ;8B 04
MOV EAX, [SI] ;66 8B 04
MOV AL, [EBX] ;67 8A 03
MOV AX, [EBX] ;67 8B 03
MOV EAX, [EBX] ;67 66 8B 03
操作数尺寸前缀
66H
存储器地址尺寸前缀
67H
操作数尺寸前缀66H
存储器地址尺寸前缀67H   
 

6.6.2 段模式声明语句
.演示程序dp611.asm


 
bits
32
;
声明
32
位段模式
MOV
AL, 1 ;B0 01
MOV
AX, 1 ;
66
B8 01
00
MOV
EAX, 1 ;B8 01 00 00 00
MOV
SI,
wvar
;
66
BE 51 01
MOV
EBX,
wvar
;BB 51 01 00 00
MOV
AL, [SI] ;
67
8A 04
MOV
AX, [SI] ;
67
66 8B 04
MOV
EAX, [SI] ;
67
8B 04
MOV
AL, [EBX] ;8A 03
MOV
AX, [EBX] ;
66
8B 03
MOV
EAX, [EBX] ;8B 03
bits
16
;
声明
16
位段模式
JMP
$ ;E9 FD FF
wvar
dw
1234H
;34 12
dw
5678H
;78 56
bits 32 ;声明32位段模式
MOV AL, 1 ;B0 01
MOV AX, 1 ;66 B8 01 00
MOV EAX, 1 ;B8 01 00 00 00
MOV SI, wvar ;66 BE 51 01
MOV EBX, wvar ;BB 51 01 00 00
MOV AL, [SI] ;67 8A 04
MOV AX, [SI] ;67 66 8B 04
MOV EAX, [SI] ;67 8B 04
MOV AL, [EBX] ;8A 03
MOV AX, [EBX] ;66 8B 03
MOV EAX, [EBX] ;8B 03
bits 16 ;声明16位段模式
JMP $ ;E9 FD FF
wvar dw 1234H ;34 12
dw 5678H ;78 56
操作数尺寸前缀
66H
存储器地址尺寸前缀
67H
操作数尺寸前缀66H
存储器地址尺寸前缀67H   

原创粉丝点击