好友
阅读权限25
听众
最后登录1970-1-1
|
本帖最后由 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:[0X13FFC4]
- MOV EAX,DWORD PTR DS:[0X13FFC8]
- 向内存中写入数据
- MOV DEORD PTR DS:[0X13FFC4],eax
- MOV DEORD PTR DS:[0X13FFC4],ebx
- 获取内存编号
- LEA EAX,DWORD PTR DS:[0X13FFC4]
- LEA EAX,DWORD PTR DS:[ESP+8]
-
寻址公式2:[reg]_注:reg代表寄存器,可以是8个通用寄存器的任意一个
- 读取内存的值:
- MOV ECX,0X13FFC4
- MOV EAX,DWORD PTR DS:[ECX]
- 向内存中写入数据
- MOV EDX,0X13FFC4
- MOV DEORD PTR DS:[EDX],0X87654321
- 获取内存编号
- LEA EAX,DWORD PTR DS:[EDX]
- MOV EAX,DWORD PTR DS:[EDX]
-
寻址公式3:[reg+立即数]
- 读取内存的值:
- MOV ECX,0X13FFC4
- MOV EAX,DWORD PTR DS:[ECX+4]
- 向内存中写入数据
- MOV EDX,0X13FFC4
- MOV DEORD PTR DS:[EDX+0xC],0x87654321
- 获取内存编号
- LEA EAX,DWORD PTR DS:[EDX+4]
- LEA EAX,DWORD PTR DS:[EDX+4]
-
寻址公式4:[reg+reg*(1,2,4,8)]_注:只能乘1,2,4,8的任意一个,该知识涉及到硬编码
- 读取内存的值:
- MOV EAX,0X13FFC4
- MOB ECX,2
- MOV EDX,DWORD PTR DS:[EAX+ECX*4]
- 向内存中写入数据
- MOV EAX,0X13FFC4
- MOV ECX,2
- MOV DEORD PTR DS:[EAX+ECX*4],87654321
- 获取内存编号
- LEA EAX,DWORD PTR DS:[EAX+ECX*4]
-
寻址公式4:[reg+reg*(1,2,4,8)+立即数]_注:只能乘1,2,4,8的任意一个,该知识涉及到硬编码
- 读取内存的值:
- MOV EAX,0X13FFC4
- MOB ECX,2
- MOV EDX,DWORD PTR DS:[EAX+ECX*4+4]
- 向内存中写入数据
- MOV EAX,0X13FFC4
- MOV ECX,2
- MOV DEORD PTR DS:[EAX+ECX*4+4],87654321
- 获取内存编号
- LEA EAX,DWORD PTR DS:[EAX+ECX*4+2]
-
汇编如 mov eax,dword ptr ds:[0x00981df2] >> 其中当内存中是一个数字,用ds ;如果内存中是ESP 或者EBP ,用SS ;当内存中是EDI ,就用ES 。不同的符号标识着内存中内容的特征。
-
堆栈只是一块普通的内存,EBP 是栈底,ESP 是栈顶。主要作用是记录函数的中间结果。
-
Push 是压栈\入栈指令,该指令能将数据压入栈中,通常它会令栈顶ESP 发生变化(地址变小)
-
PoP 是出栈\弹栈指令,该指令可以从当前栈顶取出数据,通常它会令栈顶ESP 发生变化(地址变大)
-
stos 的作用是把eax 的值赋给某个地址,如stos dword ptr es:[EDI] 的意思便是把当前eax 的值赋给edi
-
rep 指令的意义是重复 ,如rep stos dword ptr es:[EDI] 的意思便是把当前eax 地址中的值赋给edi 的操作重复一定次数,重复的次数由当前ECX 的值决定,此时ecx 寄存器承担计数器的作用
-
rep 的重复操作并不是重复覆盖地址中的值,还是以如rep stos dword ptr es:[EDI] 为例,edi 的地址会自动加四或减四,
-
变形的艺术:
|
免费评分
-
查看全部评分
|