当前位置: 首页 > news >正文

速通汇编(七)BX、SI、DI寄存器,BP寄存器,直接寻址和间接寻址

下文中出现的"idata",指的都是任意常量

一,基于BX、SI、DI等寄存器的寻址形式

在第五篇中曾介绍过DS寄存器的作用,简要复习一下->速通汇编(五)认识段地址与偏移地址,CS、IP寄存器和jmp指令,DS寄存器_arm汇编 前两个地址是什么-CSDN博客

可以如此说:汇编中出现的形如[偏移地址]形式的地址,指的都是[DS:偏移地址],即DS*16+偏移地址处的内存

为了更灵活的使用这个语法,CPU提供了BX、SI、DI等寄存器来方便我们表达[偏移地址]

(一)[bx+idata]

BX原名是“基址寄存器”,当需要使用[偏移地址]这个语法时,可以将BX中的数据作为这里的偏移地址,写作[bx+idata]AX、CX、DX等寄存器是不能这样写的!),它代表的意思很清晰:指的就是DS*16+BX+idata处的内存

 

下图演示idata==0

下图演示idata==2

(二)[si/di+idata]

si和di各自都可以单独使用成[偏移地址]这个语法,即[si+idata][di+idata]

其效果与[bx+idata]是一模一样的

这里简略带过,读者自行验证

(三)[bx+si/di+idata]

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

这个语法让[偏移地址]这个语法的表达更加灵活,但本质都是一样的

无非是各种寄存器和一个常数加起来组成一个偏移地址罢了,下面简单做个实验验证语法

修改DS==2000,BX==1000,SI==0003,DI==0006

写入汇编【mov ax,[bx+si]】【mov cx,[bx+di]】【mov dx,[bx+si+3]

先预测结果:ds==2000,bx+si==1000+0003==1003,因此ax的值应该取地址[2000:1003]处的数据,其余两条汇编同理

故ax==5566,cx==2233,dx==2233

执行完后,结果符合预期

注意,以下表示[偏移地址]的语法是错误的

[bx+si+di+idata]        ×si和di各自都能和bx组合,但不可以同时出现

[bx+ax/cx/dx]            ×虽然bx和ax/cx/dx都是常用寄存器,但只有bx可以出现在[偏移地址]这个语法中

(四)总结

(1)[idata]用一个常量来表示地址,可用于直接定位一个内存单元

(2)[bx]用一个变量来表示内存地址,可用于间接定位一个内存单元

(3)[bx+idata]用一个变量和常量表示地址,可在一个起始地址的基础上用变量间接定位一个内存单元
(4)[bx+si/di]用两个变量表示地址
(5)[bx+si/di+idata]用两个变量和一个常量表示地址


二,BP寄存器

说明完BX、SI、DI的各种组合寻址之后,BP寄存器就非常容易解释了

在寻址功能这块,你可以把BP和BX看成亲戚

[bp+idata]≈[bx+idata]

[bp+si/di+idata]≈[bx+si/di+idata]

说是“亲戚”的原因,在于它们寻址的差别在段地址上

BX寄存器基于这种寻址方式时,默认的段地址取的是DS寄存器中的数据,这一点在上面已经验证过

BP寄存器基于这种寻址方式时,默认的段地址取的是SS寄存器中的数据

SS寄存器在上一篇介绍栈时已经阐明,它配合SP寄存器指向的其实是一段被视作“栈”的内存空间,下面进行简单实验验证

①写入并执行以下汇编指令,并查看栈中数据

执行前

执行后,ax,bx,cx的值被压入栈中,按照从高地址(栈底)向低地址(栈顶),这里解释算复习上篇的内容了

 

②现在先思考一下,如果想要用形如[bp+si/di+idata]的语法取到栈中的数据放入AX中,例如[073F:00F9]处的内容,该如何编写汇编?

答案很多,因为这个表达式很灵活,总之凑出中括号[]中的内容等于[00F9]即可,CPU会将其用作偏移地址,将此时SS(而不是DS)的073F用作段地址

例如bp和di的组合

bp+di+3==00F0+0006+3==00F9


三,寻址方式总结

(注:本图取自《王爽汇编》P165处表8.2,不商用,仅供学习参考。)

下图表格中第4列【常用格式举例】中出现的一些特殊表示形式

如[bx].idata,[bx][idata],[bx].idata[si],都是[偏移地址]的特殊形式,其本质都是相加

如[bx].idata==[bx+idata],[bx][idata]==bx+idata,[bx].idata[si]==bx+idata+si

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Highcharts甘特图基本用法(highcharts-gantt.js)
  • AI大模型之旅-langchain结合glm4,faiss构建本地知识库
  • Ansible——Playbook基本功能
  • 前端面试题(一)
  • 设计模式 享元模式(Flyweight Pattern)
  • 线程对象的生命周期、线程等待和分离
  • 计算机毕业设计 基于SpringBoot框架的网上蛋糕销售系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • 【小米手机无法连接电脑】一般问题和驱动MTP问题的结局ue
  • 【深度学习发展史】张量与神经网络|生成模型|序列学习模型|深度强化学习是如何一步步发展的?
  • 如何只用 CSS 制作网格?
  • Docker 里面按照ifconfig
  • 封装Progress 组件
  • 排序算法的分析和应用
  • Redis作为单线程模型,为什么效率高、速度快呢?
  • 虚幻引擎解决构建问题
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • Git学习与使用心得(1)—— 初始化
  • Java比较器对数组,集合排序
  • maya建模与骨骼动画快速实现人工鱼
  • MySQL几个简单SQL的优化
  • Node项目之评分系统(二)- 数据库设计
  • webgl (原生)基础入门指南【一】
  • windows-nginx-https-本地配置
  • Xmanager 远程桌面 CentOS 7
  • 如何选择开源的机器学习框架?
  • 手写一个CommonJS打包工具(一)
  • 问题之ssh中Host key verification failed的解决
  • 赢得Docker挑战最佳实践
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • gunicorn工作原理
  • #etcd#安装时出错
  • #git 撤消对文件的更改
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • $(function(){})与(function($){....})(jQuery)的区别
  • $(selector).each()和$.each()的区别
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • ( 10 )MySQL中的外键
  • (06)Hive——正则表达式
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (windows2012共享文件夹和防火墙设置
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (四)汇编语言——简单程序
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转)为C# Windows服务添加安装程序
  • 、写入Shellcode到注册表上线
  • .JPG图片,各种压缩率下的文件尺寸
  • .Net Remoting(分离服务程序实现) - Part.3
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .net的socket示例
  • .NET建议使用的大小写命名原则
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递