汇编语言入门先导

x33g5p2x  于10个月前 转载在 其他  
字(2.0k)|赞(0)|评价(0)|浏览(59)

1、语言

人和人沟通?通过语言来交流的!
中国人 语言 外国人,学习外语!
人 语言 计算机,学习计算机语言!
什么是机器语言?

# 我们目前主流的电子计算机
# 状态0和1
# 最早的程序员:穿孔卡带!
加 0100 0000
减 0100 1000
乘 0100 1000 0100 1000
除 0100 1000 1100 1000

这些复杂的机器语言,能简化吗?助记符!汇编语言!人能够理解的语言转换成为机器能够理解的语言!

加 INC -编译器-> 0100 0000
减 						0100 1000
乘					    0100 1000 0100 1000
除 						0100 1000 1100 1000

离程序的本质:隔阂~一般用于底层的编写,单片机…
C语言

加 A+B -编译器-> 0100 0000
减 A-B			 0100 1000
乘 A*B			 0100 1000 0100 1000
除 A/B			 0100 1000 1100 1000

2、进制

二进制? 0 1
学习进制的障碍?
十进制!
人类天然的选择的就是十进制,十个指头,跳出固有思维的方法!“屈指可数”
思想:每一种进制都是完美的,都有自己的计算方式!

进制:
二进制:逢二进一,计算机
八进制:逢八进一,8个符号组成:0 1 2 3 4 5 6 7
十进制:逢十进一,10个符号组成:0 1 2 3 4 5 6 7 8 9
十六进制:逢十六进一,16个符号组成:0 1 2 3 4 5 6 7 8 9 A B C D E F

3、八进制运算表

为什么要学习理解二进制!
寄存器、内存、位!底层的每一位都是有含义的,汇编入门理解的基础!
汇编高级:了解程序的深度,操作系统的内核!

4、数据宽度

计算机底层需要给我们这些数据定义宽度。
位 0 1
字节 0~0xFF
字 0~0xFFFF
双字 0~0xFFFFFFFF
在计算机中,每一个数据都需要给它定义类型。并给它定义宽度,在内存中的宽度。

5、有符号数,无符号数

数据都是有宽度的,每个数据代表什么意思呢?
有符号数规则
最高位是符号位:1(负数) 0(正数)

6、原码反码补码

编码规则:
有符号数的编码规则:
原码:最高位符号位,对齐它的位进行本身绝对值即可
反码:

  • 正数:反码和原码相同
  • 负数:符号位一定是1,其余位对原码取反

补码:

  • 正数:补码和原码相同
  • 负数:符号位是1,反码+1

位运算

int a = 10;
printf("%d\n",a>>2);

7、汇编学习环境及必要说明

学习汇编之前,需要掌握环境配置(VC6,OD,抓包工具,加密解密工具)
《汇编语言》王爽 16位的汇编
现在的计算机32位/64位(本质架构区别不大,寻址能力增加)

8、寄存器

存储数据:CPU>内存>硬盘
32位CPU 8 16 32
64位CPU 8 16 32 64
通用寄存器,可以存储任意的东西

# 32位的通用寄存器只有8个

存值得范围0~FFFF FFFF
对于二进制来说,直接修改值
计算机如何往寄存器存值
mov指令

mov 存的地址,存的数

可以将数字写入到寄存器,可以将寄存器中的值写到寄存器。
不同的寄存器

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位

除了这些通用的寄存器外,那么其他的寄存器每一位都有自己特定的功能!

9、内存

寄存器很小,不够用,所以说,数据放到内存,也就是买的内存条!
每个应用程序进程都有4GB的内存空间,空头支票。

程序真正运行的时候,才会用到物理内存。
1B=8bit
1KB=1024B
1MB=1024KB
1GB=1024MB

4GB=4096MB=>最终计算为位,就是这个可以存储的最大容量的。
计算机中内存的地址很多,空间很大,每个空间分配一个地址,名字。

这些给内存起的编号,就是我们的内存地址。32位 8个16进制的值
32位:寻址能力!4GB
FFFFFFFF+1=100000000,最大的值。
位是怎么限制内存大小的
100000000内存地址/*8-位:800000000
转换为10进制;4,294,967,296字节
按照规则/1024,最终就是4GB!

所以每个内存都有一个编号!可以通过这些编号向里面存值!

内存如何存值?
数据宽度:byte word dword
地址的位置:0xFFFFFFFF
不是任意的地址都可以写东西的,申请使用的。只有程序申请过的地址

# 汇编如何向内存中写值。
mov 数据宽度 内存地址,1

mov byte/word/dword/qword ptr ds:[0x19FF70],1

传递值得大小一定要和数据数据宽度相等。

内存有多种写法

# 内存地址偏移
mov byte/word/dword/qword ptr ds:[0x19FF70+4],1

# 地址可以写寄存器的,向内存写寄存器中的值
mov byte/word/dword/qword ptr ds:[eax],1
# 寄存器偏移
mov byte/word/dword/qword ptr ds:[eax+4],1

# 数组[]
mov byte ptr ds:[reg+reg*{1,2,4,8}]

mov byte ptr ds:[reg+reg*{1,2,4,8}+4]

10、汇编指令

相关文章