好友
阅读权限20
听众
最后登录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的地址会自动加四或减四,
-
变形的艺术:
|
免费评分
-
查看全部评分
|