设计汇编程序的方法
设计汇编程序的方法
第1章 操作数的寻址方式
1.1 立即数寻址方式
即常量赋值。通常用于对通用寄存器或内存单元赋初值。
mov AH,80H(将80H赋值给AH寄存器)
1.2 寄存器寻址方式
寄存器赋值到内存:ADD VARD EAX,
内存赋值到寄存器:ADD EAX VARD,
寄存器赋值到寄存器:ADD EAX,EBX
注意:没有内存赋值到内存!
提倡在编写汇编语言程序时应尽可能地使用寄存器寻址方式,但也不要把它绝对化
1.3 直接寻址方式
MOV BX,[1234H](1234H是指针,DS的偏移量,所以实际物理地址是DS的值×10H+1234H)
由于数据段的段寄存器默认为DS,如果要指定访问其他段内的数据,可在指令中用段前缀的方式显式书写出来。
MOV ES:[1000H] AX(这里是将AX的值赋到物理地址为ES的值×10H+1000H处的内存中)
MOV AX,1234H MOV AX[1234H] ;前者是立即数寻址,后者是直接寻址
MOV AX,VARW MOV AX,[VARW] ;两者是等效的,均为直接寻址(?不明白)
1.4 寄存器间接寻址方式
在不使用段超越前缀的情况下,有下列规定:
l 若有效地址用SI DI和BX等之一来指定,则其缺省的段寄存器为DS
l 若有效地址用BP来指定,则其缺省的段寄存器为SS
MOV BX,[DI](即将内存实际物理地址DS的值×10H+DI中的内容赋值给寄存器BX)
1.5 寄存器相对寻址方式
在不使用段超越前缀的情况下,有下列规定:
l 若有效地址用SI DI和BX等之一来指定,则其缺省的段寄存器为DS
l 若有效地址用BP来指定,则其缺省的段寄存器为SS
与寄存器间接寻址方式相似,仅是BX DI SI BP还需要多加一个8位或16位的偏移量
MOV BX,[SI+100H](即将实际物理地址为DI×10H+SI+100H的内容赋值给BX)
1.6 基址加变址寻址方式
在不使用段超越前缀的情况下,有下列规定:
如果有效地址中含有BP,则其缺省的段寄存器为SS;否则缺省的段寄存器为DS。
与寄存器间接寻址方式相似,仅只是偏移量为任一基址寄存器(BP或BX)与任一变址寄存器(SI或DI)之和。
MOV BX,[BX+SI](即将实际物理地址为DS×10H+BX+SI的内容赋值给BX)
1.7 相对基址加变址寻址方式
在不使用段超越前缀的情况下,有下列规定:
如果有效地址中含有BP,则其缺省的段寄存器为SS;否则缺省的段寄存器为DS。
与基址加变址寻方式相似,仅只是偏移量除了基址+变址外,还需要加一个8位或16位的偏移值。
MOV AX,[BX+SI+100H](即将实际物理地址为DS*10H+BX+SI+100H的内容赋值给AX)
相对基址加变址寻址方式有多种等价的书写方式,下面几种书写模式都是一致的:
MOV AX,[BX+SI+1000H] MOV AX,1000H[BX+SI]
MOV AX,1000H[BX][SI] MOV AX,1000H[SI][BX]
1.8 32位地址的寻址方式
在32位微机系统中,除了支持前面的7种寻址方式外,又提供了一种更灵活、方便,但也更复杂的内存寻址方式,从而使内存的寻址范围得到了进一步扩大。
当用32位地址偏移量进行寻址时,内存地址的偏移量可分为3部分:一个32位基地址寄存器,一个可乘1、2、4、8的32位变址寄存器,一个8位或32位偏移常量,并且这三个部分还可进行任意组合,省去其中之一或之二。
32位基址寄存器:EAX EBX ECX EDX ESI EDI EBP ESP
32位变址寄存器:EAX EBX ECX EDX ESI EDI EBP(除ESP之外)
由于32位寻址方式可以使用所有的通用寄存器,所以,和该有效地址相组合的段寄存器也就有新的规定。
l 地址中寄存器的书写顺序决定该寄存器是基址寄存器,还是变址寄存器。如[EBX+EBP]中的EBX是地址寄存器,EBP是变址寄存器,而[EBP+EBX]中的EBP是基址寄存器,EBX是变址寄存器。
l 默认段寄存器的选用取决于基址寄存器。
l 基址寄存器是EBP或ESP时默认段寄存器是SS,否则默认段寄存器是DS
l 在指令中,如果使用段超越前缀的方式,那么显式段寄存器优先
习题
1. 访问内存单元的寻址方式有几种?它们具体是哪些?
一共有8种,分别是立即数寻址,寄存器寻址,直接寻址,寄存器间接寻址,寄存器相对寻址,基址加变址寻址,相对基址加变址寻址,32位地址的寻址
2. 指出下列各种操作数的寻址方式
a) [BX]:寄存器间接寻址
b) SI:寄存器寻址
c) 435H:立即数寻址
d) [BP+DI+123]相对基址加变址
e) [23]:直接寻址
f) data:直接寻址
g) [DI+32]:寄存器相对寻址
h) [BX+SI]:基址加变址寻址
i) [EAX+90]32位地址寻址
j) [BP+4]相对寄存器寻址
3. 哪些寄存器的值可用于表示内存单元的偏移量?
BX SI DI BP SP EAX EBX ECX EDX ESI EDI EBP ESP
4. 判断下列操作数的寻址方式的正确性,正确的指出其寻址方式,错误的说明其错误原因
a) [AX]:16位寄存器AX不能用于偏移
b) [EAX]:寄存器间接寻址
c) BP:寄存器寻址
d) [SI+DI]:两个都属于变址寄存器,不能这样使用。
e) DS:DS为段寄存器,不能这样使用
f) BH:寄存器寻址
g) [BX+BP+32]:两个寄存器都是基址寄存器,不能这样使用
h) [BL+44]:BL不是基址寄存器也不是变址寄存器,不能这样使用
i) [CX+90]:CX不能用于相对寄存器寻址,不能这样使用
j) EDX:寄存器寻址
k) BX+90H:不知道
l) [DX]:不能这样使用
m) SI[100H]:不知道
n) [BX*4]:不能这样使用
o) [EAX+EBX*6]:不能这样使用,乘数应该为1、2、4、8中的一个。
p) [DX+90H]:不能这样使用。
5. 已知寄存器EBX、DI和BP的值分别是12345H、0FFF0H和42H,试分别计算下列各操作数的有效地址:
a) [BX]:2345H
b) [DI+123H]:10113H
c) [BP+DI]:10032H
d) [BX+DI+200H]:12535H
e) [1234H]:1234H
f) [EBX*2+345H]:249CFH
6. 指出下列各寻址方式所使用的段寄存器。
a) [SI+34H]:DS
b) [456H]:DS
c) ES:[BP+DI]:ES
d) [BX+DI+200H]:DS
e) [BP+1234H]:SS
f) FS:[EBX*2+345H]:FS