niucaidi 发表于 2021-7-7 23:21

五大内存寻址公式&&计算机如何实现2+3?

本帖最后由 niucaidi 于 2021-7-7 23:23 编辑

## 滴水海东第二集公开课
### 计算机如何实现2+3?
   - 1.首先计算机会把2和3转换称二进制,2对应0010,3对应0011。计算机在进行运算之前会将两个值存放到某个地址中去,此处假设`x = 0010`和`y = 0011`,
   - 2.计算机会将`x`和`y`进行抑或(xor)运算,即`0010`^`0011`,结果为`0001`.
   - 3.计算机会将计算机会将`x`和`y`进行与(and)运算,即`0010`&`0011`,结果为`0010`.
   - 4.计算机会将上述通过与运算得到的的结果向左移动一位,得到`0100`.接下来计算机会进行判断,当结果不是全部为0,即`0000`的时候,计算机会将第二步计算出的中间结果赋值给`x`,即`x = 0001`,将第三步得到的中间结果赋值给`y`,即`y = 0100`.
   - 5.此时继续对`x`和`y`进行抑或运算,即`0001`^`0100`,结果为`0101`,
   - 6,重复第三步,将此时的`x`和`y`继续进行与运算,即`0001`^`0100`,结果为`0000`,计算机此时会将`0000`向左移动一位,并对其进行判断,当发现其结果全部为`0`时,运算结束,计算机会认为`x+y`的最终结果为第五步的运算结果,即`0101`.
   - PS:只要当异或运算之后的与运算结果为`0`,加法计算便会结束,计算机会认为抑或的结果便是两个数字相加的结果。


   - 寄存器按顺序有`eax`、`ecx`、`edx`、`ebx`、`esp`、`ebp`、`esi`、`edi`.
   - 32位操作系统寻址能力最大为`FFFFFFFF+1`,也就是可以访问`2的32次方`个内存地址,这也是为何32位操作系统“一般情况下”只能识别4G内存的原因
   ### 内存的读写
   - 寻址公式1:[立即数]
      - 读取内存的值:
      - MOV EAX,DWORD PTR DS:
      - MOV EAX,DWORD PTR DS:
      - 向内存中写入数据
      - MOV DEORD PTR DS:,eax
      - MOV DEORD PTR DS:,ebx
      - 获取内存编号
      - LEA EAX,DWORD PTR DS:
      - LEA EAX,DWORD PTR DS:


   - 寻址公式2:_`注:reg代表寄存器,可以是8个通用寄存器的任意一个`
      - 读取内存的值:
      - MOV ECX,0X13FFC4
      - MOV EAX,DWORD PTR DS:
      - 向内存中写入数据
      - MOV EDX,0X13FFC4
      - MOV DEORD PTR DS:,0X87654321
      - 获取内存编号
      - LEA EAX,DWORD PTR DS:
      - MOV EAX,DWORD PTR DS:


   - 寻址公式3:
      - 读取内存的值:
      - MOV ECX,0X13FFC4
      - MOV EAX,DWORD PTR DS:
      - 向内存中写入数据
      - MOV EDX,0X13FFC4
      - MOV DEORD PTR DS:,0x87654321
      - 获取内存编号
      - LEA EAX,DWORD PTR DS:
      - LEA EAX,DWORD PTR DS:


- 寻址公式4:_`注:只能乘1,2,4,8的任意一个,该知识涉及到硬编码`
      - 读取内存的值:
      - MOV EAX,0X13FFC4
      - MOB ECX,2
      - MOV EDX,DWORD PTR DS:
      - 向内存中写入数据
      - MOV EAX,0X13FFC4
      - MOV ECX,2
      - MOV DEORD PTR DS:,87654321
      - 获取内存编号
      - LEA EAX,DWORD PTR DS:


- 寻址公式4:_`注:只能乘1,2,4,8的任意一个,该知识涉及到硬编码`
      - 读取内存的值:
      - MOV EAX,0X13FFC4
      - MOB ECX,2
      - MOV EDX,DWORD PTR DS:
      - 向内存中写入数据
      - MOV EAX,0X13FFC4
      - MOV ECX,2
      - MOV DEORD PTR DS:,87654321
      - 获取内存编号
      - LEA EAX,DWORD PTR DS:



   - 汇编如 `mov eax,dword ptr ds:` >> 其中当内存中是一个数字,用`ds`;如果内存中是`ESP`或者`EBP`,用`SS`;当内存中是`EDI`,就用`ES`。不同的符号标识着内存中内容的特征。

   - 堆栈只是一块普通的内存,`EBP`是栈底,`ESP`是栈顶。主要作用是记录函数的中间结果。

   - `Push`是压栈\入栈指令,该指令能将数据压入栈中,通常它会令栈顶`ESP`发生变化(地址变小)
   - `PoP`是出栈\弹栈指令,该指令可以从当前栈顶取出数据,通常它会令栈顶`ESP`发生变化(地址变大)
   - `stos`的作用是把`eax`的值赋给某个地址,如`stos dword ptr es:`的意思便是把当前`eax`的值赋给`edi`
   - `rep`指令的意义是`重复`,如`rep stos dword ptr es:`的意思便是把当前`eax`地址中的值赋给`edi`的操作重复一定次数,重复的次数由当前`ECX`的值决定,此时`ecx`寄存器承担计数器的作用
   - `rep`的重复操作并不是重复覆盖地址中的值,还是以如`rep stos dword ptr es:`为例,`edi`的地址会自动加四或减四,


   - 变形的艺术:
   - `push eax`代码相当于:
       - `lea esp,dowrd ptr ss:`
       - `mov dword ptr ss:,eax`
   - 或者:
       - `mov dword ptr ss:,eax`
       - `lea esp,dword ptr ss:`

   - `lea esp,dword ptr ss:` == `mov esp,esp-4` == `sub esp,4`


   - `PoP ecx`代码相当于:
       - `mov ecx,dword ptr ss:`
       - `lea esp,dword ptr ss:` == `mov esp,esp+4` == `add esp,4`
   - 或者:
       - `lea esp,dword ptr ss:`
       - `mov ecx,dword ptr ss:`

niucaidi 发表于 2021-7-7 23:23

自学笔记分享给各位,也是做一些记录

aishangni 发表于 2021-7-8 02:54

谢谢分享,虽然不懂,但是学习了慢慢就懂了

今晚明月 发表于 2021-7-8 06:59

很久很久之前学过的,都忘得差不多了。

bobo_008 发表于 2021-7-8 07:15

学习了!!!!

tlf 发表于 2021-7-8 07:34

龍謹 发表于 2021-7-8 07:55

谢谢大佬,这种纯干货,真的很重要。

fl025 发表于 2021-7-8 08:30

一起学习,一起进步

xzhtx 发表于 2021-7-8 08:31

学习了,虽然看不懂

cwfengs 发表于 2021-7-8 08:50

都忘光了,重温一下~
页: [1] 2 3
查看完整版本: 五大内存寻址公式&&计算机如何实现2+3?