【汇编与接口】第三章汇编语言
汇编语句的类型
在8086宏汇编MASM使用的语句可以分成3种类型:
- 指令语句:这类指令能够产生目标代码,是CPU可以执行完成特定功能的语句。在汇编时一条指令语句被翻译成对应的机器码,实现特定的操作。
- 伪指令语句:伪指令语句时为汇编程序和连接程序提供一些必要控制的管理性语句,它不产生目标代码,仅仅在汇编过程中告诉汇编程序应如何编译,并完成相应的伪操作。
- 宏语句:宏指令语句是由编程者按照一定的规则来定义的一种较“宏大”的指令,可包括多条指令或伪指令。
汇编语言语句的格式
格式:[标识符] 操作项 操作数 [; 注释]
- 标识符:表示本条语句的符号地址(偏移地址),可缺省。指令语句使用的是标号,标号后面必须紧跟冒号“:”。伪指令语句使用的是名字,可以是变量名、过程名、和段名等,名字后面跟空格。
- 操作项:为指令助记符或伪指令符,表示了该语句的操作类型或指定汇编程序要完成的具体操作。
- 操作数:操作项的操作对象。指令语句中可以是立即数、寄存器、存储单元;伪指令语句中可以是常数、字符串、变量、表达式等,个数可多个。各个操作数之间必须以“逗号”分隔。
- 注释:注释均以分号开始,它可占一行或多行,一般放在一条语句的后面,注释字段是语句的非执行部分,可缺省。
与数据有关寻址方式
立即寻址方式
操作数通过指令直接给出,操作数和操作码一起存入代码段中。立即数有8位和16位。
例如:MOV AL, 5; (AL)<-5
PS:目的操作数无法采用立即数寻址方式,类比不能5=a。
立即寻址方式无需取数操作,但是立即数表示的范围有限,有时也不利于编程。
寄存器寻址方式
操作数是寄存器的值,指令中直接使用寄存器8位或16位通用寄存器和段寄存器。可使用的16位AX、BX、CX、DX、SI、DI、SP、BP;其中AX、BX、CX、DX可分成两个8位寄存器使用。
例如:MOV AX, BX;(AX)<-(BX)
存储器寻址方式
有效地址的组成
有效地址可由下面四部分组成
(1)位移量:是存放在指令中的一个8位、16位或者32位的数,它不是立即数,是一个地址。
(2)基址:是存放在基址寄存器中的内容。它是有效地址中的基址部分,通常用来指向数据段中数组或字符串的首地址。
(3)变址:是存放在变址寄存器中的内容。它通常用来访问数组中的某个元素或字符串中的某个字符。
各种访存类型下所对应的段的默认选择
访存类型 | 所用段及段寄存器 | 缺省选择规则 |
---|---|---|
指令 | 代码段CS | 用于取指 |
堆栈 | 堆栈段SS | 所有的堆栈的进栈和出栈、任何以BP作为机制寄存器的访存 |
局部数据 | 数据段DS | 除相对于堆栈以及串处理指令的目的串以外的所有数据访问 |
目的串 | 附加数据段ES | 串处理指令的目的串 |
段前缀使用规则
某些情况下,8086允许程序员用段跨越前缀来改变系统所指定的默认段,以下三种情况不允许使用段跨越前缀。
(1)串处理指令的目的串必须用ES段
(2)PUSH指令的目的和POP的源不许用SS段
(3)指令必须存放在CS段中
寻址方式
直接寻址方式
立即数的值即操作数的有效地址,存放在代码段中指令的操作码之后。操作数的偏移地址(有效地址EA)直接由指令给出(直接地址值和符号地址两种形式),直接地址值用中括号[]括起来,与立即数寻址相区别;符号地址可不使用[]。
操作数地址为:DS:偏移地址 或 ES:偏移地址。DS为隐含指定。
例如:MOV AX,[2000H]; 如(DS) = 3000H 即为基地址。
由于AX为16位寄存器,所以,取出一个字,最终(AX)=3050H
PS:可以用符号地址代替数值地址(有点疑问?什么叫符号地址来着?)
MOV AX,VALUE 或 MOV AX,[VALUE]
寄存器间接寻址方式
操作数形式为:[寄存器]
操作数的有效地址包含在基址寄存器BX,基址指针BP或一个变址寄存器(SI或DI)中。寄存器间接寻址要用[]括起来。
例如:MOV AX,[BX];将BX对应的存储单元的内容送到AX中。
最终(AX)=2A1BH
指令中寄存器内容作为操作数所在内存单元的有效地址。
有
效
地
址
=
{
(
B
X
)
段
寄
存
器
:
D
S
(
S
I
)
段
寄
存
器
:
D
S
(
D
I
)
段
寄
存
器
:
D
S
(
B
P
)
段
寄
存
器
:
S
S
有效地址=\left\{ \begin{array}{lr} (BX)&段寄存器:DS \\ (SI) &段寄存器:DS\\ (DI) &段寄存器:DS\\ (BP)&段寄存器:SS\\ \end{array} \right.
有效地址=⎩⎪⎪⎨⎪⎪⎧(BX)(SI)(DI)(BP)段寄存器:DS段寄存器:DS段寄存器:DS段寄存器:SS
由上式可得:
物理地址 = (DS) * 16 + (BX) 或 (SI) 或 (DI)
物理地址 = (SS) * 16 + (BP)
例如:(DS) = 2000H,(BX) = 1000H;执行指令 MOV AX,[BX];(AX)<-((BX))
物理地址 = 20000H + 1000H = 21000H
最终将21000H单元中的内容送到AL中,将21001单元中的内容送到AH中。
寄存器相对寻址方式
寄存器内容与位移量(DISP,8位或16位)之和作为操作数所在单元的有效地址。
有
效
地
址
=
{
(
B
X
)
+
D
I
S
P
8
/
D
I
S
P
16
段
寄
存
器
:
D
S
(
S
I
)
+
D
I
S
P
8
/
D
I
S
P
16
段
寄
存
器
:
D
S
(
D
I
)
+
D
I
S
P
8
/
D
I
S
P
16
段
寄
存
器
:
D
S
(
B
P
)
+
D
I
S
P
8
/
D
I
S
P
16
段
寄
存
器
:
S
S
有效地址=\left\{ \begin{array}{lr} (BX)+DISP8/DISP16 &段寄存器:DS \\ (SI)+DISP8/DISP16 &段寄存器:DS\\ (DI)+DISP8/DISP16 &段寄存器:DS\\ (BP)+DISP8/DISP16&段寄存器:SS\\ \end{array} \right.
有效地址=⎩⎪⎪⎨⎪⎪⎧(BX)+DISP8/DISP16(SI)+DISP8/DISP16(DI)+DISP8/DISP16(BP)+DISP8/DISP16段寄存器:DS段寄存器:DS段寄存器:DS段寄存器:SS
例如:MOV AX,COUNT[SI] (或者MOV AX,[COUNT+SI])
如果(DS) = 3000H,(SI)=2000H,COUNT=3000H
则(AX)=1234H
基址变址寻址方式
将基址寄存器(BX或BP)与变址寄存器(SI或DI)内容之和作为操作数所在存储单元的有效地址。
有
效
地
址
=
{
(
B
X
)
(
B
P
)
}
+
{
(
S
I
)
(
D
I
)
}
有效地址=\left\{ \begin{array}{lr} (BX)\\ (BP)\\ \end{array} \right\}+\left\{ \begin{array}{lr} (SI) \\ (DI) \\ \end{array} \right\}
有效地址={(BX)(BP)}+{(SI)(DI)}
例如:MOV AX,[BX][DI](或MOV AX,[BX+DI])
如果(DS)=2100H,(BX)=0158H,(DI)=10A5H
则(AX) = 1234H
相对基址寻址方式
将基址寄存器(BX或BP)与变址寄存器(SI或DI)的内容再加上位移量(8位或16位)之和,得到操作数所在单元的有效地址。
有
效
地
址
=
{
(
B
X
)
(
B
P
)
}
+
{
(
S
I
)
(
D
I
)
}
+
{
D
I
S
P
8
D
I
S
P
16
}
有效地址=\left\{ \begin{array}{lr} (BX)\\ (BP)\\ \end{array} \right\}+\left\{ \begin{array}{lr} (SI) \\ (DI) \\ \end{array} \right\} +\left\{ \begin{array}{lr} DISP8\\ DISP16 \\ \end{array} \right\}
有效地址={(BX)(BP)}+{(SI)(DI)}+{DISP8DISP16}
指令格式例如:MOV AX,MK[BX][SI]或者MOV AX,MK[BX+SI]或者MOV AX,[MK+BX+SI]
与转移地址有关的寻址方式
段内直接转移
格式:JMP SHORT OPR
执行操作:(IP)<-(IP)+8位位移量
格式:JMP NEAR PTR OPR
执行操作:(IP)<-(IP)+16位位移量
8位和16位位移量有目标地址OPR决定,可使用符号地址。
段内间接转移
段内间接转移
段间间接转移
总结
未完待续~~~