二进制-汇编

机器语言

机器语言在状态上体现为0和1。

汇编语言其实就是助记符演化而来的。

汇编一般用于底层的编写,单片机。。

进制的本质就是查数:

在这里插入图片描述

数据宽度

计算机:内存是有限制的。需要给数据增加数据宽度。

C、C++和Java都需要定义数据的类型。计算机的底层需要给这些数据定义宽度。

  • 位(bit) 0 1
  • 字节(Byte) 0-0xFF
  • 字(Word) 0-0xFFFF
  • 双字(Dword) 0-0xFFFFFFFF
  • 在计算机中,每一个数据都需要给它定义类型,给它定义宽度(内存中的宽度)。

有符号数无符号数

无符号数规则

你这数字是什么,那就是什么

1 0 0 1 1 0 1 0  十六进制:0x9A   十进制:154

有符号数规则

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

原码反码补码

  • 有符号数的编码规则
原码:最高位符号位,对其它的位进行本身绝对值即可
反码:
 	正数:反码和原码相同
 	负数:符号位一定是1,其余位对原码取反
补码:
	正数:补码和原码相同		(正数:原、反、补相同)
	负数:符号位一定是1,反码+1

测试 测试都基于位是8位

如果是正数,原码反码补码都是一样的(1)
原码: 0000 0001
反码: 0000 0001
补码: 0000 0001

如果是负数(-1)
原码: 1000 0001
反码: 1111 1110
补码: 1111 1111 (负数则在反码的基础上+1)

看到一个数字,二进制的,需要了解它是有符号数还是无符号数。

负数在寄存器中以补码的方式存储。

位运算

与运算(and &)两个都为1,结果为1

或运算(or |)只要有一个1,结果就为1

非运算(单目运算符 not ~)0就是1,1就是0

异或运算 (xor ^)不一样就是1

在这里插入图片描述

位运算(移动位 左移*2 右移/2)
位运算在计算机中远比加法要快

左移(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(即8位就是0000 0000),没有进位。)
0000 0100
0000 0101
-----------
0000 0100

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

#第四步:异或!将进位后的结果与第一步异或出来的结果进行异或运算
0000 0001
0000 1000
-----------
0000 1001

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

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

4-5?

# 计算机是如何操作的?
4+(-5)

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

#第一步:异或:如果没有进位,异或就可以直接得出结果。
0000 0100
1111 1011	
----------
1111 1111 
#第二步:与运算(判断进位,如果与运算结果为0,没有进位。)
0000 0100
1111 1011	
----------
0000 0000
最终结果 1111 1111  16 ff  10 -1

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

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

计算机只会做加法。

汇编语言

涉及三个方面:寄存器、内存、汇编指令。

计算机是如何存储数据的? CPU、内存、硬盘

CPU分为:

  • 32位 8 16 32 (支持8,16,32的寄存器)
  • 64位 8 16 32 64(支持8,16,32,64的寄存器)多的是寻址能力。

通用寄存器(可以存储任意的东西)

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

在这里插入图片描述

存值的范围0~FFFFFFFF。

计算机如何向寄存器存值?(对于二进制来说,直接修改值)

mov指令

mov 存的地址,存的数	eg:mov ecx,1
mov 存的地址1,存的地址2		eg:mov edx,ecx

在这里插入图片描述

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

不同的寄存器

FFFFFFFF	FFFF	FF
32168(上四位代表低四位,下四位代表高四位)
EAX			AX		AL
ECX			CX		CL		
EDX			DX		DL
EBX			BX		BL
ESP			SP		AH
EBP			BP		BH
ESI			SI		CH
EDI			DI		DH

8位:L代表低4位,H代表高4位。

在这里插入图片描述

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

内存

1B=8bit
1KB=1024B
1MB=1024KB
1GB=1024MB

32位:寻址能力!4GB。

通过计算得:(FFFFFFFF+1)*8=800000000(位) 转化为十进制:800000000->34359738368/8/1024/1024/1024=4GB

FFFFFFFF是指内存地址的值。8是指每块内存空间存8位。

在这里插入图片描述

每个内存地址都有一个编号!可以通过编号像里面存值。

在这里插入图片描述

内存中如何存值?

不是任意的地址都可以写东西,需申请使用。只有程序申请过的内存地址才可使用。

# mov 数据宽度 内存地址,数据
mov byte ptr ds:[0x19FF70],1		#写数据宽度是方便知道存储数据占多少位,方便补0。
#传递的值的大小一定要和数据宽度相等。

在这里插入图片描述

内存地址的多种写法

偏移:ds:[0x19FF70+4] #就会自动添加到地址为:[0x19FF74]

放入寄存器:ds:[eax] #把寄存器中的值放在内存中

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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值