详解通用寄存器-内存读写

在看这篇文章之前,可以先看一下这一篇
数据宽度
便于理解后续的内容

  • 在数据宽度那里已经说了计算机中有很多的容器
  • 有的容器是cpu里面提供的,有的容器是内存提供的。
  • 本质其实没有什么区别,都是拿来存储数据的
  • 那为什么要在cpu中放一些容器,在内存中放一些容器
  • 把数据放在cpu里面计算非常快,但是cpu非常昂贵
  • 放在内存中会相对慢一点,但是内存要相对便宜一点
  • 所以两者兼用会比较好。

cpu中提供的常用的32位容器

我们称为32位通用寄存器

  • 32位通用寄存器的指定用途如下
    在这里插入图片描述
    这张图片里面的东西一定要记住,最好能把编号跟寄存器对映背下来,后面对硬编码的一些相关理解有用*

  • 图上面画红色圈这个部分,你可以不用记,最好把他用途忘记,这是cpu建议你怎么使用容器,其实只要他是容器,我们知道怎么使用它就可以了,所以你可以不用记它
    eg:我们可以这样来理解它,假如你去买一个杯子(容器),难道这个杯子你就只用来装水了吗
    你还可以用来装酒,装其他的东西

  • 所以我们可以不用记cpu建议你怎样使用这个容器,这样的话就显得太死板。

  • 32位通用寄存器,既然是32位那么它就能存储32个二进制数,

  • 所以你就能算出它的存储范围 0~FFFFFFFF

  • cpu中提供的常用寄存器还有16 位寄存器,8位寄存器

在这里插入图片描述
那么这些寄存器之间有什么关系呢?
我们先来看下图
在这里插入图片描述
再看下面之前我们可以先看一下这篇文章
常见汇编指令及DTDebug

  • 如果还是没有看懂没关系

  • 我们用如下代码来演示一下,你会发现其中之奥妙。
    -`在这里插入代码
    MOV EAX,0xAAAAAAAA
    MOV AX,0xBBBB
    MOV AH,0XCC
    MOV AL,0XDD

  • 我们用DTDebug演示一下
    在这里插入图片描述

现在程序执行到MOV EAX,0XAAAAAAAA这条语句,但是还没有执行,每次执行一次我们注意黑圈里面EAX的变化
执行第一条后的结果
在这里插入图片描述

然后执行第二条
在这里插入图片描述
然后执行第三条
在这里插入图片描述
然后执行第四条
在这里插入图片描述
看到这里我相信大家已经明白了
一个32位的通用寄存器它不仅包括16位寄存器还包括8位寄存器
为了让大家明白我这里用32位通用寄存器EAX举例说明
我们从上面代码展示的效果可以发现EAX的低位0~15是AX
AX的高位8~15为AH
AX的低位0~7低位是AL

内存

既然有了寄存器为什么还要引入内存????
虽然它们本质没有什么区别,但是寄存器在cpu的内部,而且cpu提供的寄存器比较有限,而且非常昂贵。
内存的价格比较便宜,所以可以做的很大

内存的数量特别庞大,无法为每个内存单元都起一个名字,所以用编号来代替,我们称计算机cpu是32位或者64位,主要指的是内存编号宽度,而不是寄存器的宽度。有很多书上面说之所以叫32位计算机是因为寄存器的宽度是32位,是不准确的,因为还有很多寄存器是大于32位的
如果你的计算机的cpu是32位,那么你的内存编号为(为了方便,我这里用16进制来写)
0x00000000
0x00000001
0x00000002
0x00000003 每一个编号对应的内存为一个字节



0xFFFFFFF

  • 为什么人们经常说32位的计算机最多能识别的内存是4G
  • 因为32位计算机它的编号可以有2^32次方个,也就是说可以寻址到2的32次方个内存快,一个内存快为一个字节,所以最多可以识别4G的内容
  • 我们最后把编号称为内存的地址

从指定的内存写入/读取数据

mov dword ptr ds:[0x0012FF34],0x12345678 //把立即数0x12345678写入内存地址编号为0x0012FF34的内存中。
mov eax,dword ptr ds:[0x0012FF34] //读取内存编号为0x0012FF34里面的值到寄存器eax中。
dword:表示要读/写多少 ,上面两行指令写的是4字节,读的也是4字节,byte是一个字节, word表示两个字节。
ptr:point 代表后面是一个指针(指针的意思就是里面存的不是普通的值,而是一个地址,也就是说是内存编号
ds:段寄存器,这里先不说,把它先记住是段寄存器就行。
0x0012FF34:内存编号。
注意:地址编号不要随便写,因为内存是有保护的,并不是所有的内存都可以直接读写(需要特别处理)

寻址公式

寻址公式一:【立即数】
读取内存的值:
MOV EAX,DWORD PTR DS:[0x13FFC4]
MOV EAX,DWORD PTR DS:[0X13FFC8]
向内存中写入数据:
MOV DWORD PTR DS:[0x13FFC4],EAX
MOV DWORD PTR DS:[0x13FFC8],EBX
获取内存编号:
LEA EAX,DWORD PTR DS:[0x13FFC4]
LEA EAX, DWORD PTR DS:[ESP+8]
寻址公式二:[reg] reg代表寄存器 可以是8个通用寄存器中的任意一个
读取内存的值:
MOV ECX,0x13FFD0
MOV EAX, DWORD PTR DS:[ECX]
向内存中写入数据:
MOV EDX,0x13FFD8
MOV DWORD PTR DS:[EDX],0x87654321
获取内存编号:
LEA EAX,DWORD PTR DS:[EDX]
MOV EAX,DWORD PTR DS:[EDX]
寻址公式三:【reg+立即数】
读取内存的值:
MOV ECX,0x13FFD0
MOV EAX, DWORD PTR DS:[ECX+4]
向内存中写入数据:
MOV EDX,0x13FFD8
MOV DWORD PTR DS:[EDX+0xC],0x87654321
获取内存编号:
LEA EAX,DWORD PTR DS:[EDX+4]
MOV EAX,DWORD PTR DS:[EDX+4]
寻址公式四:【reg+reg{1,2,4,8}】*
读取内存的值:
MOV EAX,13FFC4
MOV ECX,2
MOV EDX,DWORD PTR DS:[EAX+ECX4]
向内存中写入数据:
MOV EAX,13FFC4
MOV ECX,2
MOV DWORD PTR DS:[EAX+ECX
4],87654321
获取内存编号:
LEA EAX,DWORD PTR DS:[EAX+ECX4]
寻址公式五:【reg+reg{1,2,4,8}+立即数】

读取内存的值:
MOV EAX,13FFC4
MOV ECX,2
MOV EDX,DWORD PTR DS:[EAX+ECX4+4]
向内存中写入数据:
MOV EAX,13FFC4
MOV ECX,2
MOV DWORD PTR DS:[EAX+ECX
4+4],87654321
获取内存编号:
LEA EAX,DWORD PTR DS:[EAX+ECX*4+2]
你们可以用DTDebug这个软件去演示一下上面5个公式加深一下理解

猜你喜欢

转载自blog.csdn.net/qq_51196205/article/details/109312193