计算机只容许使用bx、si、di、bp寄存器做间接和相对寻址

其中bx为基址存储器,si、di为变址存储器

内存寻址方式:确定访问内存存储单元偏移地址的方式称为寻址方式。

直接寻址:[偏移地址]

寄存器间接寻址:[基址寄存器/变址寄存器]

寄存器相对寻址:[基址寄存器/变址寄存器+偏移量值]

基址变址寻址:[基址寄存器+变址寄存器]

相对基址变址寻址:[基址寄存器+变址寄存器+偏移量值]

注意:

a 格式上的注意,正确区分寻址方式

b 五种寻址中,均可以使用段前缀     //ds:[0001H]

c masm编译器编译时,代码中的直接寻址必须采用段前缀的形式

指针寄存器包括堆栈寄存器SP(stack pointer)和基数指针寄存器BP(base pointer),变值寄存器包括源变址寄存器SI(source index)和目的变值寄存器DI(destination index)。这4个寄存器都是16位寄存器,这些寄存器在运算过程中也可以用来存放操作数(只能以字为单位),但经常的用途是在段内寻址时提供偏移地址,SP,BP一般与段寄存器SS联用,以确定堆栈寄存器中某一单元的地址,SP用以指示栈顶的偏移地址,而BP可作为堆栈区中的一个基地址,用以确定在堆栈中的操作数地址。SI,DI一般与段寄存器DS联用,以确定数据段中某一存储单元的地址,SI,DI具有自动增量和自动减量的功能,这一点使在串操作指令中用做变址非常方便,SI作为隐含的源变址DS联用,DI作为隐含的目的变址和ES连用,从而达到在数据段和附加段中寻址的目的。

BX+SI
BX+DI
BP+SI
BP+DI

1. 直接寻址

偏移地址值直接出现在执行代码中。

mov 寄存器,[偏移地址]
mov [偏移地址],寄存器

2. 寄存器间接寻址

偏移地址通过寄存器取得使用

mov 寄存器,[寄存器]
mov [寄存器],寄存器

实例:

assume cs:daima
daima segmentmov ax,2000Hmov ds,axmov ax,1122Hmov cx,3344Hmov bx,0000Hmov [bx],ax    ;将ax值放入ds 2000:0000mov bx,0002Hmov [bx],cx    ;将cx值放入ds 2000:0002mov ax,4c00Hint 21H
daima ends
end

3. 寄存器相对寻址

偏移地址值通过[寄存器+偏移量值]的形式运算后获得。

mov 寄存器,[寄存器+偏移量值]
mov 寄存器,ds:[寄存器+偏移量值]
mov [寄存器+偏移量值],寄存器
mov ds:[寄存器+偏移量值],寄存器

实例1:

assume cs:code,ds:data
data segmentdb 'abc'
data endscode segment
start:mov ax,datamov ds,axmov bx,0000Hmov ah,[bx+0000H]mov al,[bx+0001H]mov ax,4c00Hint 21H
code ends
end start

实例2:

;交换ds中偏移地址1和4,2和5,3和6的数据
assume cs:code,ds:data
data segmentdb 'abcdef'
data endscode segment
start:mov ax,datamov ds,axmov bx,0000Hmov cx,3A:mov ah,ds:[bx]mov al,ds:[bx+0003H]mov [bx+0003H],ahmov [bx],alinc bxloop Amov ax,4c00Hint 21H
code ends
end start

实例3:

assume cs:code,ds:data
data segmentdb 'abc'db 0H,0H,0H
data endscode segment
start:mov ax,datamov ds,axmov si,0000Hmov di,0003Hmov cx,3A:mov ah,[si]mov [di],ahinc siinc diloop Amov ax,4c00Hint 21H
code ends
end start

4. 基址变址寻址方式

偏移地址值通过[基址寄存器+变址存储器]的形式运算后获得。

格式:

mov 寄存器,[基址寄存器+变址寄存器]
mov [基址寄存器+变址寄存器],寄存器

例如:

mov ax,[bx+si]
mov ax.[bx+di]
;不可以这样
mov ax,[si+di]

实例:

;累计相加偏移地址0002H 3次。
assume cs:code,ds:data
data segmentdb 1H,1H,2H
data endscode segment
start:mov ax,datamov ds,axmov ah,00Hmov bx,0000Hmov si,0002Hmov cx.3A:mov al,[bx+si]add ah,alinc bxdec siloop Amov ax,4c00Hint 21H
code ends
end start

5. 相对基址变址寻址

偏移地址值通过[基址寄存器+变址寄存器+偏移量值]的形式运算后获得。

格式:

mov 寄存器,[基址寄存器+变址寄存器+偏移量值]
mov [基址寄存器+变址寄存器+偏移量值],寄存器

实例:

;取出1H、3H放入ah、al
assume cs:code,ds:data
data segmentdb 0H,0H,0H,1H,2H,3H
data endscode segment
start:mov ax,datamov ds,axmov bx,0000Hmov si,0001Hmov ah,[bx+si+0002H]mov di,0003Hmov al,[bx+di+0002H]mov ax,4c00Hint 21H
code ends
end start

十三、直接、寄存器间接寻址、寄存器相对寻址、基址变址寻址、相对基址变址寻址相关推荐

  1. 寻址方法有哪些-七种数据寻址-三种内存寻址

    七种数据寻址方式 1.立即寻址方式:操作数作为指令的一部分而直接写在指令中 2.直接寻址方式:指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址 3.寄存器寻址方式:指令所要的操作数已存 ...

  2. 计组高分笔记:【04】指令系统 「指令格式与分类 | CISC、RISC | 直接寻址 | 间接寻址 | 寄存器寻址 | 隐式寻址 | 立即寻址| 基址寻址 | 变址寻址 | 相对寻址 | 堆栈寻址」

    文章目录 1. 指令格式 1.1 指令的基本概念 1.2 指令的分类 1.2.1 按地址码(操作数)长度/数目分类 1.2.2 按指令的长度分类 1.2.3 按操作码长度分类 1.2.4 按操作类型分 ...

  3. 寄存器寻址和寄存器间接寻址的区别

    寄存器寻址(Register Direct Addressing)和寄存器间接寻址(Register Indirect Addressing)是计算机体系结构中两种不同的寻址模式.它们用于确定指令中操 ...

  4. 寄存器间接寻址缺点_详解西门子间接寻址之地址寄存器间接寻址

    关于间接寻址分为存储器间接寻址和地址寄存器间接寻址,本文主要针对地址寄存器间接寻址进行详细讲解,关于存储器间接寻址可参见前面文章,链接如下: #详解西门子间接寻址之存储器间接寻址 [地址寄存器间接寻址 ...

  5. 反汇编最基础知识(段寄存器和寄存器的说明)

    段寄存器 CS(Code Segment):代码段寄存器 DS(Data Segment):数据段寄存器 SS(Stack Segment):堆栈段寄存器 ES(Extra Segment):附加段寄 ...

  6. 【Android 逆向】代码调试器开发 ( ptrace 函数 | 读寄存器 | 写寄存器 )

    文章目录 一.读寄存器 二.写寄存器 一.读寄存器 调用 ptrace(PTRACE_GETREGS, m_nPid, NULL, regs) 读取进程运行时的寄存器 ; 读取寄存器时 , 进程必须处 ...

  7. 时序分析寄存器到寄存器

    对于FPGA的时序分析主要包括管脚和内部寄存器的时序分析,目前这边刚看了一点时序分析的资料,总结在这里,希望能够对大家也带来帮助. 时序分析目前主要针对同步时序逻辑的静态时序分析(STA),主要涉及的 ...

  8. 【嵌入式开发】ARM 关闭中断 ( CPRS 中断控制位 | 中断使能寄存器 | 中断屏蔽寄存器 | 关闭中断 | 汇编代码编写 )

    一. 中断控制 ( 基于 S3C6410 开发板 ) 1. 关闭中断的两个步骤 (1) 关闭中断步骤 2. CPRS 寄存器中的中断控制位 (1) CPRS 寄存器简介 (2) CPRS 寄存器 中断 ...

  9. 找不到具有绑定 MetadataExchangeHttpBinding 的终结点的与方案 http 匹配的基址。注册的基址方案是 [https]...

    在设置WCF使用https方案时,由于配置问题可能提示 找不到具有绑定 MetadataExchangeHttpBinding 的终结点的与方案 http 匹配的基址.注册的基址方案是 [https] ...

  10. 用CE来找出对对碰游戏 坐位号基址,棋盘数组基址 并把它读出来

    用CE来找出对对碰游戏 坐位号基址,棋盘数组基址 并把它读出来 1.预备知识    4种数据类型    字节 Byte=00-FF                           0-255   ...

最新文章

  1. linux go redis,使用go来操作redis的方法示例
  2. 且看微软的.Net和Sun公司的J2EE如何对垒
  3. 基于Windows环境下MyEclipse10快捷键总结
  4. poj 2349 求MST中第S大的权值
  5. 指针的引用做函数的参数
  6. 订餐系统之同步饿了么商家订单
  7. 无人值守的自动 dump(一)
  8. 电脑重新分区扩大c盘_两种方法,给电脑C盘增加10G的容量,电脑焕然一新
  9. mysql主要的收获_MySQL性能测试大总结
  10. Node 实现 AES 加密,结果输出为“byte”。
  11. Python3 解释器
  12. [转载] Python一行代码实现1到100之和
  13. INDEX建立方式对SQL的影响
  14. flume学习(一):log4jAppender直接输出日志到flume的avro-source
  15. 镇魂街武神躯怎么修改服务器,镇魂街武神躯怎么重置守护灵_守护灵重置方法_3DM手游...
  16. 去除两张img中间的间隙
  17. ISO18000-6B和ISO18000-6C(EPC C1G2)标准的区别
  18. Android 简历模板
  19. iSCSI部署网络存储
  20. 你还在用命令看日志?快用 Kibana 吧,一张图片胜过千万行日志!

热门文章

  1. 修改(移交)微信支付商户平台超级管理员账号流程
  2. latex表格排版指南
  3. 梦幻西游脚本开发教学
  4. Linux基础操作篇
  5. 阿辉DirectX 11学习笔记一
  6. 计算机网络原理 实验3《IP数据包捕获及数据分析》
  7. CAN网络总线_20220720
  8. 【美港探案】万物云港股IPO:背靠万科,物业也要搞云?
  9. 深层和浅层卷积_浅层vs深层javascript
  10. 非齐次线性方程组解的结构暂记