汇编4:寻址方式

寻址方式

数据寻址

数据寻址:通过地址查找数据(操作数)

1. 立即数寻址

  • 数据在指令代码中,用常量表达

2. 寄存器寻址

  • 数据在寄存器中,用寄存器名表示

3. 存储器寻址

  • 数据在主存中,用存储器地址代表

4. I/O寻址

  • 数据在外设(I/O设备)中,用I/O地址代表

立即数寻址

汇编命令:操作码 操作数(目的作数,源操作数)

mov al,ah(mov为操作码;al,ah为操作数(al为目的作数,ah为源操作数))

  1. mov ax,12h ; 12h为立即数寻址

  2. mov cx,const ; const为符号常量(数据段:),const也是立即数寻址

    在这里插入图片描述

  3. mov si,offset bvar ; 直接将bvar偏移地址赋给寄存器,offset bvar也是立即数寻址

    在这里插入图片描述

  4. mov di,labl ; 将代码段使用的标号名(代表其偏移地址),labl也是立即数寻址

    在这里插入图片描述

  5. 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

存储器寻址

  1. 32位有效地址组成:基址寄存器(任一8个32位置通用寄存器) + 变址寄存器 (初esp外的任一32位通用寄存器)x 比例(1,2,4或8) + 位移量(8或32位有符号值)

  2. 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]
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值