首页 > 编程语言 >速通汇编(七)BX、SI、DI寄存器,BP寄存器,直接寻址和间接寻址

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

时间:2024-09-22 15:54:39浏览次数:3  
标签:idata 速通 di si 地址 寻址 寄存器 bx

下文中出现的"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

标签:idata,速通,di,si,地址,寻址,寄存器,bx
From: https://blog.csdn.net/liKeQing1027520/article/details/142364795

相关文章

  • C++速通LeetCode中等第10题-轮转数组(四种方法)
    方法一:巧用deque双向队列容器classSolution{public:voidrotate(vector<int>&nums,intk){deque<int>q;inttmp;if(nums.size()>1){for(autonum:nums)q.push_back(num);......
  • 【C/C++】速通涉及string类的经典编程题
    【C/C++】速通涉及string类的经典编程题一.字符串最后一个单词的长度代码实现:(含注释)二.验证回文串解法一:代码实现:(含注释)解法二:(推荐)1.函数isalnum介绍:2.函数tolower介绍:3.代码实现:三.翻转字符串II:区间部分翻转代码实现:(含注释)四.翻转字符串III:翻转字符串中的单词代......
  • 制作角色AI必用?!速通有限状态机
    欢迎加入光光的奇妙冒险,我是你们的煎饼光子老师。这期我们来速通一套有限状态机框架我认为一个有限状态机必须要满足这三个条件如果结合代码说就是1.枚举表示的状态类型2.当前处于的状态3.通过Switch等逻辑去切换状态首先我们创建一个FSM,也就是我们的有限状态框架在......
  • 速通JAVA集合
     0.常见的时间复杂度以及性能从好到坏的排序:O(1),O(logn),O(n),O(nlogn),O(n^2) List相关问题1.为什么数组的索引是从0开始的,而不是从1开始的呢?首先数组是一个空间连续存储同种类型元素的有序集合。如果索引从0开始,那么寻址就是a[i]=baseAddress+i*dataTypeSize。如......
  • STM32寄存器,标准库和HAL库编程(浅谈)
    寄存器编程、标准库编程和HAL库编程在嵌入式系统开发中是三种常见的编程方式,它们主要区别在于抽象层次、灵活性和开发效率。以下是对这三种编程方式的详细比较:1.寄存器编程(Register-LevelProgramming)寄存器编程是指直接操作微控制器或处理器的硬件寄存器,以控制外设和执行......
  • 为什么寄存器需要建立时间和保持时间约束?——从门级角度理解
    目录1.建立时间与保持时间 2.从寄存器的内部结构理解建立时间与保持时间 2.1寄存器的结构 2.2主从锁存器构成的寄存器 2.3传输门构成的寄存器 3.查看寄存器的建立时间和保持时间  文章内容为博主学习记录,如有错误,欢迎在评论区指正。1.建立时间与保持......
  • stm32 Unix时间戳&BKP备份寄存器&RTC实时时钟(读写备份寄存器&实时时钟)
    理论1.Unix时间戳(1)Unix时间戳Unix时间戳(UnixTimestamp)定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数,不考虑闰秒时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间 (2)UTC/GMTGM......
  • 国际互联网寻址与分配机构及其全球参与者
    国际互联网号码分配机构(IANA):IANA是全球性的组织,负责协调整个互联网的IP地址和AS号码资源分配。它是IP地址分配的最高级别机构,掌握着INTERNET域名系统的设计、维护及地址资源分配等方面的绝对权力。IANA将地址资源分配到各个地区的网络信息中心,如APNIC、ARIN、RIPENCC、AfriNI......
  • java读取寄存器数据
    在Java中直接读取硬件寄存器(如CPU寄存器、I/O端口等)通常不是一个直接的任务,因为Java设计之初就是为了跨平台的安全性和易用性,它并不直接提供访问底层硬件的API。不过,在嵌入式系统、工业控制或需要直接与硬件交互的特定场景中,可能会使用JNI(JavaNativeInterface)或JNA(JavaNativeAc......
  • C++速通LeetCode简单第17题-爬楼梯
    思路要点:将问题转化为求斐波那契数列的第n项,然后迭代。思路分析:最后一次爬的阶数不是1就是2,假设爬n阶的方法数是f(n),假设最后一次爬1阶,那么爬前面的n-1阶的方法数是f(n-1);假设最后一次爬2阶,那么爬前面n-1阶的方法数是f(n-2)。所以可以得到:f(n)=f(n-1)+f(n-2),也就是斐波......