第三章 寄存器(内存访问)
3.1 内存中字的存储
在内存中要看清取出的是字节型还是字型数据,一个是8位另一个是16位,如果从0位置按字取就是从0向上取值取到1,即为4E20H。
问题
1)20H
2)4E20H
3)12H
4)0012H
5)124EH
3.2 DS和[address]
与之前CS代码段寄存器类似,DS是数据段寄存器。
DS存储要访问的数据段地址,[]中存储的是相对于DS的数据偏移地址空间
MOV al,[0]意味着将0作为偏移地址,将DS:0内存单元中的数据直接送入寄存器。
MOV有三种用法:
mov ax,bx是寄存器寻址
mov ax,1000H是立即寻址
mov ax,[0]是直接寻址
问题
不是已经有cs放段地址嘛?那DS是什么?
cs是代码段,放输入的代码。
ds段是数据段,放输入的数据的CS代码段寄存器类似,DS是数据段寄存器。
重要的话说两遍,一定要记住这两个点的区别。
CS:IP读取到的东西会被CPU认为是指令,而DS读取到的东西会直接被CPU认为是数据
重要的话说三遍!
在8086CPU中是不支持将数据直接保存到通用寄存器中的。
那我们应该如何把1000H放入DS?
要先使用通用寄存器保存1000H,再把通用寄存器中的数值传入段寄存器。
即mov ax,1000H mov ds,ax
3.3 字的传递
问题
请先思考后在看解答哦
解答:
我们通过在DOSBOX虚拟机中来debug实现一下。
通过e参数修改10000H-10003H四个连续地址的数值。
通过r参数查看下CS:IP的位置,再用a参数在CS:IP位置添加指令数据。
t参数执行,结果可以看出数值为:
Ax 1123H
Bx 6622H+2211H=8833H
Cx 2211H+6622H=8833H
3.4 MOV ADD SUB指令
问题
ADD和SUB能对段及促其直接进行操纵吗?
不可以。段寄存器进行操作只可以MOV。
3.5 数据段
与代码段相对的这里数据段展现了作用。
1B=1字节=1内存单元=0.5字
问题
练习
写完后再对答案哦。
AX=2662
BX=E626
AX=E626
AX=2662
BX=D6E6
AX=FD48
AX=12C14
AX=0
AL=00E6
BX=0
BX=0026
AX=000C
通过-r参数修改CS:IP的数值。
-a指令对相应位置写入执行的指令。
-e参数在相应位置修改数据。
-r看看下一条开始的指令是否在正确位置:CS:IP=2000:0000
-t执行命令循环图如下:
文章来源:https://www.toymoban.com/news/detail-419760.html
总结
在这里有一个很重要的概念,那就是分清楚CS和DS的区别,这两个都是段寄存器,那他们两个有什么不同呢?
是里面存放的内容不相同,CS中存放的是下一个要执行指令的段地址,而DS存放的是下一个要使用数据的段地址。也就是说CS是代码段寄存器,DS是数据段寄存器。
一旦分清这一点,再回头看上面练习题可以发现指令和要操纵的数据是紧紧联系的,指令既控制着要跳转位置也控制着增加减少的寄存器数值,随之指令的变换,操纵的数值也在变换,这就是最为重要的数据和指令的区别。文章来源地址https://www.toymoban.com/news/detail-419760.html
到了这里,关于【汇编】寄存器——内存访问内存中字的存储方式、DS和[address]、DS[]和CS:IP的区别、MOV,ADD,SUB、数据段与代码段的区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!