(一)汇编语言入门

数据宽度

计算机底层需要我们给这些数据定义宽度。

位 0 1

字节 0~0xFF

字 0~0xFFFF

双字 0~0xFFFFFFFF

在计算机中,每一个数据都需要给它定义类型。给它定义宽度,在内存中的宽度。

有符号数无符号数

无符号规则

这个数字是什么,就是什么

有符号数规则

最高位是符号位:1(负数) 0(正数)

原码反码补码

有符号数的编码规则

原码:最高位符号,对其他的位进行本身的绝对值即可。

反码

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

补码:

  • 正数:补码和原码相同
  • 负数:符号位一定是1,反码 + 1
# 现在我们说的这些是 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

位运算

计算机现在可以存储所有的数字(整数,浮点数,字符)的运算。

0 1

此篇笔记是观看B站上狂神老师的免费课总结的,感谢狂神老师!

与运算(and &)

1001 0001
1101 1000
-------------
1001 0000

或运算(or |)

1011 0001
1101 1000
-------------
1111 1001

异或运算(xor ^)

不一样就是1。

1011 0001
1101 1000
-------------
0110 1001

非运算 (单目运算符 not ~ )

0就是1,1就是0,取反

1101 1000
------------
0010 0111

通过这些可以完成加减乘除……

位运算(移动位)

左移:( shl <<)

0000 0001   @ 所有二进制全部左移若干位,高位就丢弃了,低位补0
0000 0010 

右移:(shr >>)

0000 0001   @ 所有二进制全部右移若干位,低丢弃了,高位就需要补0,1(符号位决定)
0000 0000   

位运算的加减乘除

4+5?

# 计算机是怎么操作的
0000 0100
0000 0101
-----------(加法:计算机是不会直接加的)
0000 1001

#计算机的实现原理

# 第一步:异或 (如果不考虑进位,异或可以直接出结果。)
0000 0100
0000 0101
-----------
0000 0001

# 第二步:与运算(判断进位,如果与运算结果为0,没有进位。)
0000 0100
0000 0101
-----------
0000 0100

# 第三步:将与运算的结果,左移一位。 0000 1000 # 进位的结果

# 第四步:异或
0000 0001
0000 1000
------------
0000 1001

# 第五步:与运算(判断进位,如果与运算结果为0,没有进位。)
0000 0001
0000 1000
-----------
0000 0000

# 所以最终结果就是与运算为0的结果的上一个异或运算。

4-5?

# 计算机是怎么操作的!
4+(-5)

0000 0100
1111 1011
-----------  (减法:计算机是不会直接减的)
1111 1111     ff -1

0000 0100
1111 1011
----------- 异或(如果不考虑进位,异或就可以直接出结果。)
1111 1111

0000 0100
1111 1011
----------- 与运算(判断进位,如果与运算结果为0,没有进位。)
0000 0000

最终结果 1111 1111  16 ff   10 -1

#

乘法:x*y, 就是 y 个 x 相加

除法:x/y, 本质就是减法,就是x能减去多少个Y

机器语言就是位运算。都是电路来实现的。就是计算机的最底层本质。

汇编语言

通过汇编指令可以给计算机发一些操作,然后让计算机执行。编译器的发展,底层的大佬,几乎都是最原始的IDE。

在学习汇编之前,大家需要先掌握环境的配置(1、Vc6 (程序到汇编的理解)2、OD! 3、抓包工具 4、加密解密工具)

学汇编是为了理解汇编的本质。

《汇编语言》 16位的汇编 32位 64位 (本质架构区别不大)

通用寄存器

寄存器:

存储数据:CPU > 内存 > 硬盘

32位 CPU 8 16 32

64位 CPU 8 16 32 64

通用寄存器

32位通用寄存器只有8个

EAX ECX EDX EBX

ESP EBP ESI EDI

存储的范围 0~FFFFFFFF

对于二进制来说,直接修改值

计算机向寄存器存值

mov 存的地址,存的数
mov 存的地址1,存的地址2

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

不同的寄存器

FFFFFFFF FFFF    FF
32168位
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位

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

内存

寄存器很小,不够用。所以说,数据放到内存。

内存如何存值?

数据宽度:byte word Dword

地址的位置:0xFFFFFFFF

汇编如何向内存中写值
mov  数据宽度  内存地址,1
 
mov  byte ptr ds:[0x19ff70],1

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

内存地址有多种写法

ds:[0x19FF70] 内存地址偏移

ds:[eax] 寄存器

ds:[eax+4] 寄存器偏移

数组 []

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

ds: [reg+reg*{1,2,4,8}+4] 偏移

狂神说Java

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小豪GO!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值