文章目录 第一章 8086的存储器组织 寻址方式 立即数寻址方式 寄存器寻址方式 存储器寻址方式 直接寻址方式 寄存器间接寻址 寄存器相对寻址方式 寄存器基址变址寻址 相对基址变址寻址 相对方式的补充 数据寻址方式的组合
第一章
8086的存储器组织
存储单元的地址 “段基地址:段内偏移地址” 其中段基地址和段内偏移地址都是16位的,通过将段基地址*4 + 段内偏移地址 ,就可以得到该单元的物理地址(绝对地址)
寻址方式
立即数寻址方式
立即数寻址方式
:指令中的操作数直接存放在机器代码中,紧跟在操作码之后
mov al,05h
mov ax,1234h
寄存器寻址方式
mov ax,1234h
mov bx,ax
存储器寻址方式
存储器寻址方式
:寄存器数目有限,不可能将数据都存储在寄存器中,大多数情况下,数据存储在主存中,那么如何寻址主存中存储的操作数?由于8086存储器是分段管理的,所以这里给出的地址都是偏移地址,即有效地址(EA),而段地址在默认的或用段超越前缀指定的段寄存器中
直接寻址方式
指令直接包含有效地址,默认情况下,有效地址要与数据段寄存器DS一起构成操作数所在的存储单元的物理地址
在汇编语言中,[ ]
表示存储单元的内容
mov ax,[2000h]
上面的指令是将 DS:[2000h] 单元的内容传送至AX 寄存器
数据不仅仅可以存放于数据段,也可以根据需要存放于附加段、代码段或堆栈段中,这时应该指出段超越前缀
mov ax,es:[2000h]
寄存器间接寻址
有效地址存放于寄存器
,8086中寄存器只能是基址寄存器BX或变址寄存器SI、DI
中。其默认 的段地址在 DS
段寄存器,但是可以使用段超越前缀
改变。
mov ax,[si]
寄存器相对寻址方式
有效地址是寄存器内容与有符号8位或16位位移量之和,寄存器可以说BX、BP或SI、DI
。操作数的EA = BX/BP/SI/DI + 8 /16位位移量
。其中BX/SI/DI 寄存器默认数据段DS
,BP 寄存器默认堆栈段SS
。当使用非默认段的时候,可以使用段超越。
mov ax,[di+06h] ;相当于ax<- DS:[di+06h]mov ax,[bp+06h] ; AX<-SS:[bp+06h]
指令代码中位移量采用补码表示,如果是8位,则被带符号拓展为16位。当得到的有效地址EA 超过FFFFH 的时候,则取 64K 的模
寄存器基址变址寻址
基址变址寻址方式:
将基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容构成有效地址EA。操作数的EA =BX/BP + SI/DI
基址寄存器为 BX 则默认为数据段DS, 否则 BP 默认为堆栈段SS
mov ax,[bx+si] ;ax<-DS:[bx+si]
mov ax,[bp+di] ;ax<-SS:[BP+DI]
mov ax,ds:[bp+di] ;ax<-ds:[bp+di]
相对基址变址寻址
使用基址寄存器(BX/BP) 、变址寄存器(SI/DI) 和 一个8位或16位的位移量
mov ax,[bx+si+06h]
同样的,指令中的位移量采用补码
表示,如果是8位,则被拓展为16位,如果得到的EA 超过FFFFH ,则取64k 的模
相对方式的补充
在寄存器相对寻址和相对基址变址寻址方式中,位移量可以用符号表示,如
mov ax,[si+count] ;count 是实现定义的变量或常量,此处是一个数值
mov ax,[bx+si+wnum] ;wnum 也是变量或者常量
mov ax,[bx][si] ;相当于 mov ax,[bx+si]
mov ax,count[si] ; 相当于 mov ax,[si+count]
mov ax,wnum[bx][si] ; 相当于 mov ax,[bx+si+wnum]
数据寻址方式的组合
立即数寻址方式只能用于原操作数,使用IMM 表示立即数 寄存器寻址主要是指通用寄存器寻址。使用REG 表示通用寄存器。有8个16位的通用寄存器(AX,BX,CX.DX,SI,DI,BP,SP) 和 8个8位通用寄存器(AH,AL,BH,BL,CH,CL,DH,DL) ,段寄存器(SEG) (CS,DS,SS,ES) 存储器寻址访问的数据在主存,利用逻辑地址指示。段基地址由默认或者指定的段寄存器指出,指令代码只能表达偏移地址、称为有效地址。用MEM 表示存储器操作数,可以是16位或8位,分别用M16 和 M8 表示。
指令操作数:左边的是DEST (目的操作数),右边 SRC (源操作数)
处理器指令助记符 reg,imm/reg/mem
处理器指令助记符 mem,imm/reg
源操作数可以是立即数、寄存器、存储器寻址,但是目的操作数只能是寄存器或存储器寻址,并且两个操作数不能同时为存储器寻址