标签:结束 掌握 none alt 开机 解密 程序 入门 定义数据
# 我们目前主流的电子计算机
# 状态:0 和 1
# 最早的程序员:穿孔卡带
比如:
加 0000
减 0001
乘 0010
除 0011
加 INC -编译器-> 0000
减 DEC -编译器-> 0001
乘 MUL -编译器-> 0010
除 DIV -编译器-> 0011
加 A+B -编译器-> 0000
减 A-B -编译器-> 0001
乘 A*B -编译器-> 0010
除 A/B -编译器-> 0011
思想:每一种进制都是完美的,都有自己的计算方式。
# 一进制
1
1 1
1 1 1
1 1 1 1
1 1 1 1 1
# 三进制
0 1 2
10 11 12
20 21 22
100 101 102
110 111 112
120 121 122
200 201 202
# 七进制
0 1 2 3 4 5 6
10 11 12 13 14 15 16
20 21 22 23 24 25 26
# 一组符号,逢几进几,符号可以随意定义
证明:1 + 1 = 3
创造自己的三进制:0 1 3
0 1 3 10 11 13 30 31 33 100 101 103
# 运算的本质就是查数
0是0位 1是1位 3是2位
1 + 1 = 3 1向后移动1位
3 + 3 = 11 3向后移动2位
创造自己的四进制:0 1 3 a
0 1 3 a 10 11 13 1a 30 31 33 3a
# 运算的本质就是查数
0是0位 1是1位 3是2位 a是3位
1 + 1 = 3 1向后移动1位
3 + 3 = 10 3向后移动2位
# 运算的本质就是查数
# 八进制
0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20 21 22 23 24 25 26 27 30 31 32 33
# 八进制计算下面的结果
2+3=5 2向后移动3位
2*3=6 2个3位
4+5=11 4向后移动5位
4*5=24 4个5位
# 277+333=632
277
333 +
------------
632
# 减法的本质是加法
# 237-54=163
237
54 -
-----------
163
276*54=20250
276
54 *
---------------
1370
1666 +
---------------
20250
# 除法的本质是乘法
234/4=
234
4 /
-------------
47
结论:无论是什么进制,本身都是有一套完美的运算体系的,我们都可以通过列表的方式将它计算出来。
# 十六进制,二进制的简写
# 十进制 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
# 二进制 0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111
# 十六进制 0 1 2 3 4 5 6 7 8 9 a b c d e f
位:0 1
字节:8位,0~0xff
字:16位,0~0xffff
双字:32位,0~0xffffffff
1 0 0 1 1 0 1 0 十六进制:0x9a 十进制:154
1 0 0 1 1 0 1 0 负数如何转换为十六进制和十进制?
# 都是8位下测试
# 如果是正数,都是一样的
1
#原码 0 0 0 0 0 0 0 1
#反码 0 0 0 0 0 0 0 1
#补码 0 0 0 0 0 0 0 1
# 如果是负数
-1
#原码 1 0 0 0 0 0 0 1
#反码 1 1 1 1 1 1 1 0
#补码 1 1 1 1 1 1 1 1
-7
#原码 1 0 0 0 0 1 1 1
#反码 1 1 1 1 1 0 0 0
#补码 1 1 1 1 1 0 0 1
如果看到一个二进制的数字,需要了解他是有符号数还是无符号数。
寄存器:mov 寄存器,值
计算机存1,存的是1的补码。1->0x00000001
计算机存-1,存的是-1的补码。-1->0xffffffff
1011 0001
1101 1000
-------------与运算:都是1,结果才是1
1001 0000
1011 0001
1101 1000
-------------或运算:有一个1,结果就是1
1111 1001
1011 0001
1101 1000
-------------异或运算:不相同,结果就是1
0110 1001
1011 0001
-------------非运算:取反
0100 1110
通过这些位运算可以完成加减乘除!
#正数的情况下,对于十进制来说,左移*2,右移/2
0000 0001 1
0000 0010 2
0000 0100 4
0000 1000 8
0000 0001
-----------左移:所有二进制位全部左移若干位,高位丢弃,低位补0
0000 0010
0000 0001
-----------右移:所有二进制位全部右移若干位,低位丢弃,高位由符号位决定(正数补0,负数补1)
0000 0000
# 计算机是怎么计算的?
# 4+5=?
0000 0100
0000 0101
------------加法:计算机是不会直接加的
0000 1001
# 计算机的实现原理
# 第一步,异或运算(相加):得到,异或运算结果A。
0000 0100
0000 0101
------------ ^
0000 0001 A
# 第二步,与运算(判断进位):得到与运算结果B,判断与运算结果B,如果与运算结果B为0,没有进位,
# 操作结束。最终结果就是异或运算结果A。
0000 0100
0000 0101
------------ &
0000 0100 B
# 第三步,左移(得到进位):与运算结果B不为0,左移一位,得到,进位结果C。
0000 0100 B
------------ <<1
0000 1000 C
# 第四步,异或运算(相加):异或运算结果A和进位结果C进行异或运算,得到,异或运算结果D。
0000 0001 A
0000 1000 C
------------ ^
0000 1001 D
# 第五步,与运算(判断进位):得到与运算结果E,判断与运算结果E,如果与运算结果E为0,没有进位,
# 操作结束。最终结果就是异或运算结果D。如果与运算结果E不为0,有进位,从第三步循环执行。
0000 0001 A
0000 1000 C
------------ &
0000 0000 E
# 所以,最终的结果就是与运算为0时,上一步异或运算的结果。
# 4-5=4+(-5)=?
0000 0101 5
1000 0101 -5 原码
1111 1010 -5 反码
1111 1011 -5 补码
0000 0100
1111 1011
-----------
1111 1111
# 计算机的实现原理
# 第一步,异或运算(相加):得到,异或运算结果A。
0000 0100
1111 1011
------------ ^
1111 1111 A
# 第二步,与运算(判断进位):得到与运算结果B,判断与运算结果B,如果与运算结果B为0,没有进位,
# 操作结束。最终结果就是异或运算结果A。
0000 0100
1111 1011
------------ &
0000 0000 B
# 将数字写入寄存器
mov 存的地址,存的值
# 将寄存器A中的值写到寄存器B
mov 存的地址B,存的地址A
FFFFFFFF FFFF FF
32位 16位 8位
EAX AX AL
ECX CX CL
EDX DX DL
EBX BX BL
ESP SP AH
EBP BP CH
ESI SI DH
EDI DI BH
8位寄存器:L低8位,H高8位
# 汇编如何向内存中写值
mov 数据宽度 内存地址,值
mov byte/word/dword/qword ptr ds:[0x0019FF70],1
mov byte ptr ds:[0x0019FF70],1
# 传递的值的大小一定要和数据宽度对应。
# 内存地址有多种写法
ds:[0x0019FF70+4] 内存地址偏移
ds:[eax] 寄存器
ds:[eax+4] 寄存器偏移
标签:结束 掌握 none alt 开机 解密 程序 入门 定义数据
原文地址:https://www.cnblogs.com/wl3pb/p/14200450.html