汇编—内存寻址方式

[bx + idata]方式寻址

  • 类似于数组
  • 同时将第一个字符串转化为大写,第二个字符串转化为小写
    assume cs:codesg,ds:datasg
    datasg segment
    	db 'BaSiC'
    	db 'MinIX'
    datasg ends
    
    codesg segment
    start: mov ax,datasg
    	   mov ds,ax          ;设置数据段寄存器
    	   
    	   mov bx,0			  ;设置基准寄存器  
    	   mov cx,5           ;设置计数寄存器
    	s: mov al, [bx]
    	   and al, 11011111b
    	   mov [bx],al
    	
    	   mov al, [5 + bx]
    	   or al, 00100000b
    	   mov [5 + bx],al
    	   inc bx
    	   loop s
    
    	   mov ax, 4c00h
    	   int 21h
    codesg ends
    end start
    

[bx + si]和[bx + di]

  • bx 基址寄存器
  • si 源变址寄存器
  • di 目的变址寄存器
  • mov ax,[bx+si]的含义
    将一个内存单元的内容送入ax
    这个内存单元的长度为2字节,存放一个字
    偏移地址[bx + si]
    段地址在ds中
  • mov ax,[bx+si]可以写成mov ax,[bx][si]
    mov ax,2000H
    mov ds,ax
    
    mov bx,1000H
    mov si,0
    mov ax,[bx+si]
    
    inc si
    mov cx,[bx+si]
    
    inc si
    mov di,si
    mov ax,[bx+di]
    

[bx+si+idata]和[bx+di+idata]

  • mov ax,[bx+si+idata]
    将一个内存单元的内容送入ax
    这个内存单元的长度为2字节(字单元),存放一个字
    偏移地址为[bx+si+idata]
    段地址在ds中
  • mov ax,[bx+si+idata]的其他写法
    mov ax,[bx+200+si]
    mov ax,[200+bx+si]
    mov ax,200[bx][si]
    mov ax,[bx].200[si]
    mov ax,[bx][si].200
    mov ax,[bx][si]

不同寻址方式的灵活应用

在这里插入图片描述
在这里插入图片描述

  • [idata] 适用于直接确定内存中某个位置的数据
  • [bx] 适用于 一维数组的循环操作 / 二维数组确定每一行的开头
  • [bx+idata]适用于 确定二维数组每一行中某个位置的数据
    在这里插入图片描述
  • [bx + si] / [bx + di]适用于二维数组从前往后的循环操作
  • [bx + si + idata] / [bx + di + idata]适用于二维数组从某一位置开始的循环操作

二重循环的处理方法

将datasg段中每个单词改为大写字母

  • 方法1:用dx保存数据
    assume cs:codesg,ds:datasg
    datasg segment
    	db 'ibm      '
    	db 'dec      '
    	db 'dos      '
    	db 'vax      '
    datasg ends
    
    codesg segment
    start: mov ax,datasg
    	   mov ds,ax
    	   mov bx,0
    	   mov cx,4
       s0: mov dx,cx          ;将外层循环的cx值保存在dx中
       	   mov si,0           ;内层循环从0开始
       	   mov cx,3           ;cx设置为内层循环的次数
       	   
        s: mov al,[bx+si]
           and al,11011111b
           mov [bx+si],al
           inc si
           loop s
           
           add bx,16		   ;设置外层循环开始的位置
           mov cx,dx		   ;将dx中保存的外层循环的值放回cx中
           loop s0
           
           mov ax, 4c00h
    	   int 21h
    codesg ends
    end start
    
  • 用固定的内存空间保存数据
       mov ax,datasg
       mov ds,ax
       mov bx,0
       mov cx,4
    s0:mov ds:[40H],cx    ;将外层循环的cx值保存在datasg:40H单元中
       
       mov si,0	
       mov cx,3			  ;设置内层循环的次数为3
    s:mov al,[bx+si]      
      and al,11011111b
      mov [bx+si],al
      inc si
      loop s
      
      add bx,16
      mov cx,ds:[40H]     ;将datasg:40H中保存的数据放回到cx中
      loop s0
    
  • 使用栈来保存数据
    ;定义栈段
    stacksg segment
    	dw 0,0,0,0,0,0,0,0
    stacksg ends
    
       mov ax,stacksg     ;初始化栈段寄存器
       mov ss,ax
       mov sp,16		  ;堆栈指针寄存器
       mov ax,datasg      ;初始化数据段寄存器
       mov ds,ax
       
       mov bx,0			  
       mov cx,4
    s0:push cx            ;将cx压栈
       mov si,0
       mov cx,3
       
    s: mov al,[bx+si]
       and al,11011111b
       mov [bx+si],al
       inc si
       loop s
       
       add bx,16
       pop cx
       loop s0
    

图示不同寻址过程

  • 直接寻址过程:
    首先根据cs:ip的值通过地址加法器合成物理地址到内存中读取到相应的指令,之后通过数据总线传送到指令缓冲寄存器,对指令进行解析,发现其中需要用到ds:[000E]的数据,是个字,所以通过地址加法器从内存中取出0EA1,通过数据总线放到ax当中
    在这里插入图片描述
  • 其它同理

用于内存寻址的寄存器用法

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值