1+1=3?
进制可以自己定义符号来表示,所以可以自己定义一个十进制:0 1 3 9 6 8 7 4 5 2
在这样的定义下,1+1=3也是正确的。(从本质来理解进制)
进制运算
运算 534+266=? 371*146=?
与十进制运算一样,通过查表来运算。
534+266 先查表找4+6=12 所以最后一位就是2 往前进1
然后找3+6 =11 ,所以第二位是2 往前进1
最后找5+2=7 ,所以是0 往前进1.
最后结果为1022
乘法也是一样通过查表来获得结果。
数据宽度
BIT 位 计算机中的最小存储单位
Byte 字节 1字节=8位
Word 字 1字=16位
Doubleword 双字 1双字=32位
有符号数和无符号数
正数的原码反码补码都一样。
负数的原码:符号位为1.其余为数值本身的绝对值。
负数的反码:符号位为1.其余位对原码取反。
负数的补码:符号位为1,其余位对原码取反+1
-7
原码为:1000 0111
反码为: 1111 1000
补码为:1111 1001
负数在内存中以补码的形式存储
计算机不会做加法
移位操作
shr 右移 最高位补0
sar 右移 最高位补符号位
4+5的运算过程
在没有进位的情况下,两个数异或的结果和相加的结果是一样的。
1)异或
0000 0100
0000 0101
异或-----------------
0000 0001
两个数在相同位位1时,才会有进位,所以使用与来判断有没有进位。
2)判断是否有进位
0000 0100
0000 0101
与-----------------
0000 0100 结果不为0,说明有进位,继续运算。
3)继续异或
0000 0001
0000 1000 把第一次异或的结果和第二次**与**的结果左移移位继续异或操作
异或-----------------
0000 1001
4)判断是否有进位
0000 0001
0000 1000
与------------------
0000 0000 结果为0,表示没有进位。
这就是一次完整加法的底层过程。
寄存器
CPU一共有8个通用寄存器
MOV 指令
<1>立即数到寄存器
mov eax,3
<2>寄存器到寄存器
mov eax,ebx
<3>内存到寄存器
mov eax,[0x12ff7c]
<4>寄存器到内存
mov [0x12ff7c],eax
内存
内存地址的5种形式
1、[立即数]
读取内存的值:
mov eax,dword ptr ds:[0x12ff70]
向内存中写入数据:
mov dword ptr ds:[0x12ff70],eax
2、[reg] reg代表8个通用寄存器的任意一个
mov dword ptr ds:[eax],0x12345678 eax=0x12ff70
3、[reg+立即数]
mov eax,dword ptr ds:[ecx+4] ecx=0x12ff70
4、[reg+reg*{1,2,8}]
数组的寻址方式
mov eax,0x12ff70
mov ecx,2
mov edx,dword ptr ds:[eax+ecx*4]
5、[reg+reg*{1,2,8}+立即数]
mov eax,0x12ff70
mov ecx,2
mov edx,dword ptr ds:[eax+ecx*4+4]
常用指令
过调试器F8
调试器F8步过call的原理是把 call的下一条指令修改成CC ,在call的函数里面retn跳转到别的地址,调试器就无法断下来。
call 010073D1
010073D1 mov dword ptr ss:[esp],0x10073FA //这是call的函数内部,再次直接跳转到别的地方,不返回到010073d1的下一条指令
retn
ESP寻址
堆栈结构
EAX
ESI
EDI
ESP
栈空间
EBP
RETN值
参数1
参数2
EBP寻址
JCC
来源:CSDN
作者:qq_857305819
链接:https://blog.csdn.net/qq_41490873/article/details/104385125