汇编4:寻址方式

  • Post author:
  • Post category:其他




寻址方式



数据寻址


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



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]



版权声明:本文为generalfuck原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。