寻址方式

读者定位:(1)学习过计算机组成原理中的寻址方式  (2)了解8086基本的指令含义,如mov, lea等

内容概要:通过将计算机组成原理中的基本寻址方式与8086汇编中的寻址方式进行对比,加深学习印象,将理论与实践结合;

 

<1>立即寻址

立即寻址即在汇编语句中直接给出操作数,该操作数称为立即数:

mov cl, 0

在汇编语句 mov cl, 0中直接给出立即数0

 

<2>直接寻址

假设操作数在数据段中的偏移地址为idata,通过在汇编语句中直接给出操作数在数据段中的偏移地址来寻址操作数;

直接寻址方式的格式为[idata],如下:

mov cl, [0]

在汇编语句 mov cl, [0],0为操作数在数据段中的偏移地址,该汇编语句将数据段中偏移地址为0的操作数mov到寄存器cl中

 

<3>寄存器寻址

假如需要寻找存储在寄存器中的操作数,可以采用寄存器寻址方法;

寄存器寻址通过直接给出寄存器名即可:

mov ds, ax

该汇编语句采用寄存器寻址方法,将寄存器ax中的操作数mov到寄存器ds中。

 

<4>寄存器间接寻址

假如操作数的地址存储在寄存器中,可以采用寄存器间接寻址技术来寻址操作数;

寄存器间接寻址格式: [reg]

data segment
A db 1, 2, 3, 4, 5, 6, 7, 8
B db 8 dup(0)
data ends

code segment
    Assume cs: code, ds: data
start: 
       mov ax, data
       mov ds, ax
       
       mov si, offset A
       mov di, offset B
       mov cx, 8
   s:  mov ax, [si]
       mov [di], ax
       inc si
       inc di
       loop s
       
       mov ax, 4c00h
       int 21h
code ends
    end start

如上所示,该汇编程序将数组A中的元素拷贝到数组B中;

在汇编语句 mov ax, [si] 与 mov [di], ax 中通过寄存器间接寻址来拷贝数据;

PS: (1)汇编语句 mov, si, offset A 与 mov di, offset B中伪指令offset的作用为回送变量或者标号的偏移地址,在该语句中作用为回送数组A与B的首地址;

        (2) 在定义变量时,变量名与C语言中的含义相同,表示一个内存单元的内容,如 A 表示[ds:0] = 1,而不是数组A的地址

        (3) 在8086中,只能通过特定的寄存器来进行寄存器间接寻址,能进行寄存器间接寻址的寄存器为bx, bp,si,di,但是bx,si, di 的段寄存器为ds,

            而bp段寄存器为ss。

 

<5> 寄存器相对寻址

寄存器相对寻址格式:[reg + idata]或 idata[reg] 或[reg].idata (idata 为一个具体的数值)

作用:使用寄存器相对寻址功能常用来解决数组问题,以idata为某个数组的首地址,reg为偏移量;与寄存器间接寻址相同,寄存器相对寻址寻址方式

和其具有相同的对reg的限制要求

data segment
A db 1, 2, 3, 4, 5, 6, 7, 8
B db 8 dup(0)
data ends

code segment
    Assume cs: code, ds: data
start: 
       mov ax, data
       mov ds, ax
       
       mov si, 0
       mov di, 0
       mov cx, 8
   s:  mov al, 0[si]
       mov 8[di], al
       inc si
       inc di
       loop s
       
       mov ax, 4c00h
       int 21h
code ends
    end start

该汇编程序使用寄存器间接寻址实现数组拷贝功能

 

<6> 基址变址寻址

基址变址寻址寻址技术使用三个寄存器进行寻址,一个为段寄存器,一个称为变址寄存器,另外一个寄存器存储偏移值;

段寄存器不需要显式的给出,其通过隐含寻址方式给出,如bx变址寄存器对应于ds段寄存器,bp变址寄存器对应于ss段寄存器;

基址变址寻址格式: [bx / bp + si / di] = (ds / ss * 16 + ((bx) + (si / di)))

还可以使用[bx/ bp][si/ di];

data segment
D db 10h dup(0)
A db 1, 2, 3, 4, 5, 6, 7, 8
B db 8 dup(0)
data ends

code segment
    Assume cs: code, ds: data
start: 
       mov ax, data
       mov ds, ax
       
       mov bx, offset A
       mov si, 0
       mov di, 8
       mov cx, 8
   s:  mov ax, [bx + si]
       mov [bx + di], ax
       inc si
       inc di
       loop s
       
       mov ax, 4c00h
       int 21h
code ends
    end start

该汇编程序使用基址变址寻址技术实现拷贝数组A中的内容到数组B中的功能

 

<7>相对基址变址寻址

相对基址变址寻址寻址在基址变址寻址的基础上增加idata值,其格式为

[bx / bp + si / di + idata] = ( (ds / ss * 16) + bx / bp + si / di + idata);通常用做对二维数组或者结构体进行寻址;


参考书籍:

1)汇编语言(第三版)  王爽

2)计算机组成原理    蒋本珊

你可能感兴趣的:(寻址方式)