五大内存寻址公式&&计算机如何实现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:` 自学笔记分享给各位,也是做一些记录 谢谢分享,虽然不懂,但是学习了慢慢就懂了 很久很久之前学过的,都忘得差不多了。 学习了!!!! 谢谢大佬,这种纯干货,真的很重要。 一起学习,一起进步 学习了,虽然看不懂 都忘光了,重温一下~