寻址方式
数据寻址
数据寻址:通过地址查找数据(操作数)
1. 立即数寻址
- 数据在指令代码中,用常量表达
2. 寄存器寻址
- 数据在寄存器中,用寄存器名表示
3. 存储器寻址
- 数据在主存中,用存储器地址代表
4. I/O寻址
- 数据在外设(I/O设备)中,用I/O地址代表
立即数寻址
汇编命令:操作码 操作数(目的作数,源操作数)
mov al,ah(mov为操作码;al,ah为操作数(al为目的作数,ah为源操作数))
-
mov ax,12h ; 12h为立即数寻址
-
mov cx,const ; const为符号常量(数据段:),const也是立即数寻址
-
mov si,offset bvar ; 直接将bvar偏移地址赋给寄存器,offset bvar也是立即数寻址
-
mov di,labl ; 将代码段使用的标号名(代表其偏移地址),labl也是立即数寻址
-
DATAS SEGMENT bvar db 87h,49h wvar dw 1234h,5678h ;此处输入数据段代码 DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX mov bvar,01001100b ; 将bvar变量第一个数更换为01001100b,属于立即数寻址 mov wvar+4,12h ; 将wvar变量起始地址顺延4个字节的内存,存入12h,属于立即数寻址 ;此处输入代码段代码 MOV AH,4CH INT 21H CODES ENDS END START
寄存器寻址
DATAS SEGMENT
bvar db 87h,49h
;此处输入数据段代码
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
mov ah,1
mov al,ah
mov cl,2
mov bvar,cl ; 将bvar变量的第一个值更换为cl寄存器中的值2
;此处输入代码段代码
MOV AH,4CH
INT 21H
CODES ENDS
END START
存储器寻址
-
32位有效地址组成:基址寄存器(任一8个32位置通用寄存器) + 变址寄存器 (初esp外的任一32位通用寄存器)x 比例(1,2,4或8) + 位移量(8或32位有符号值)
-
16位有效地址组成:基址寄存器(bx或bp) + 变址寄存器 (si或di)+ 位移量(8或16位有符号值)
1. 存储器直接寻址
3种直接寻址方式:
DATAS SEGMENT
org 10h
count dw 78h
;此处输入数据段代码
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
mov cx,count
mov cx,[count]
mov cx,ds:[10h]
;此处输入代码段代码
MOV AH,4CH
INT 21H
CODES ENDS
END START
mov dh,12
mov count+1,dh
注意:
mov dvar+4,dvar
看似逻辑没问题,实际上在汇编属于语法错误,汇编不允许两个操作数都是内存单元
可以将数据赋给通用寄存器,再进行写入
2. 存储器的寄存器间接寻址
寄存器间接寻址的数据,由另一个操作数的寄存器或变量类型决定(al则取一个字节,ah则取两个字节…)
mov edx,[ebx] ; 双子量传送
mov cx,[esi] ; 字量传送
mov [edi],al ; 字节量传送
立即数需要对数据类型进行转换
注意:
mov [bx],100
看似没有问题,实际是错误语句,没有指定100的数据类型
DATAS SEGMENT
org 10h
count db 78h
;此处输入数据段代码
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
mov byte ptr [bx],100 ; 将源操作数 或 目的操作数 其中一个进行强制类型转换,指明数据类型
;此处输入代码段代码
MOV AH,4CH
INT 21H
CODES ENDS
END START
3. 存储器的寄存器相对寻址(变址寻址)
-
有效地址是寄存器内容与位移量之和
- 寄存器要用中括号括起来
- 主存储器采用字节编码:地址的加减是以主内存字节单元为单位
mov si,[bx+4] ;位移量:4,无类型
mov di,[bp-08h] ;位移量:-08h,无类型
mov ax,[si+count] ;位移量:count,count定义的类型
- 另一种语法
mov si,4[bx] ; mov si,[4][bx]
mov di,[-08h][bp]
mov ax,count[si] ; mov ax,[count][si]