学习中会碰到二进制十进制和十六进制比较多一些。
因为16进制,它是能够拆成二进制的。60进制的话就是时钟嘛,对吧?就是我们平常最用的最多,你比如说,一个小时对吧?一个小时等于60分钟,然后一分钟的话等于60秒,就是60进制。
只要是在计算机里存数的数据都是用二进制来存储的。
二进制(Base-2)
二进制只有两个数字:0 和 1。当计数到达 1 后,再次加 1 时就会进位,例如:
-
- (相当于十进制的 2)
您提供的二进制数 可以转换为十进制:
- 在二进制中表示 。
八进制(Base-8)
八进制使用 0 至 7 共八个数字。当计数到达 7 后,再次加 1 时就会进位,例如:
- (相当于十进制的 8)
要将二进制 转换为八进制:
- 首先,将二进制数分组为三位一组(从右往左):
- 然后,将每组转换为对应的八进制数字:,
- 因此,二进制 转换为八进制为 。
十进制(Base-10)
十进制使用 0 至 9 共十个数字。当计数到达 9 后,再次加 1 时就会进位,例如:
-
二进制 转换为十进制:
- 在二进制中表示 (如前所述)。
十六进制(Base-16)
十六进制使用 0 至 9 和 A 至 F 共十六个数字。当计数到达 F 后,再次加 1 时就会进位,例如:
- (相当于十进制的 16)
要将二进制 转换为十六进制:
- 首先,将二进制数分组为四位一组(从右往左):(不足四位置前补零:)
- 然后,将每组转换为对应的十六进制数字:,
- 因此,二进制 转换为十六进制为 。
六十进制(Base-60)
六十进制使用 0 至 59 共六十个数字。当计数到达 59 后,再次加 1 时就会进位,例如:
- (相当于十进制的 60)
六十进制通常用于表示时间和角度。例如,时钟从 到 再到 。
总结
- 二进制 转换为十进制为 。
- 二进制 转换为八进制为 。
- 二进制 转换为十六进制为 。
细节讲述示例
比如说这个win hex就是一个二进制的编辑器,比如说我随便拖一个dell进来。
就是这个样子的,这里就是说到我们刚才提到过,就是二进制跟16进制是有非常紧密的联系的。为什么说它有非常紧密的?就是说16进制跟二进制之间是可以相互转换的。
你比如说这里的一个4d对吧?
4d的话,如果说它拆成二进制,那么就是说4d它转成二进制的话。那么这里4就是,0100,然后D的话就是1101对吧?16进制跟12进制之间是可以拆的。
因为这个程序或者收del这些文件,可以看一下就算用16进制表示都已经20多行了。实际上这个编译器为了方便和为了美观用16进制简写,但实际上都是用二进制来进行存储的。
这个1-9,A-F这些进制转换都是需要熟记的,因为后面的环境里16进制和2进制都是非常常见的,有时候需要转换一下。如果对这个不太敏感的话,需要通过工具去查就会比较浪费时间。
比如说5就是4+1 看二进制数所以是0101
需要把二进制和十六进制转换记一下
1.计算机中所有的信息都是以二进制形式存储的
2.cpu是只认识0和1的,即二进制
3.因为二进制复杂,所以很多软件改用十六进制来简写二进制
用od打开一个软件,就可以看到左上角框中的就是汇编代码,在底层就是存储的二进制数0和1,我们用vs写的C语言代码-》转成汇编语言-》硬编码-》CPU
在计算机科学和数字电子学中,数据宽度通常指的是数据存储或传输的基本单位。以下是对这些术语的解释:
- 位(Bit):
- 位是最小的数据单位,表示二进制数中的一个0或1。
- 一个位可以表示两种状态(0或1)。
- 字节(Byte):
- 字节是由8个位组成的数据单位。
- 1字节 = 8位。
- 字节是计算机系统中常用的基本存储单元,用于表示字符、整数等。
- 字(Word):
- 字的长度因系统而异,但通常是一个固定的位数。
- 在一些系统中,一个字可能是16位、32位或64位长。
- 字是处理器进行数据处理的基本单位,通常与处理器的架构有关。例如,在一个32位处理器上,一个字通常是32位长;在一个64位处理器上,一个字可能是64位长。
总结:
- 位(Bit):最小的数据单位,表示0或1。
- 字节(Byte):由8个位组成,是计算机系统中的基本存储单元。
- 字(Word):处理器进行数据处理的基本单位,长度因系统而异,可以是16位、32位或64位等。
32位下
32位下
EAX:(针对操作数和结果数据的)累加器 ,返回函数结果
ECX:(字符串和循环操作数)计数器
EDX:(I/O指针)数据寄存器
EBX:(DS段中的数据指针)基址寄存器
ESP:(SS段中栈指针)栈指针寄存器
EBP:(SS段中栈内数据指针)扩展基址指针寄存器
ESI:(字符串操作源指针)源变址寄存器
EDI:(字符串操作目标指针)目的变址寄存器
64位:RAX 16位:AX 8位:AL
寄存器现在不用去记,只要记一下顺序,eax被占用时会用ecx里面
不要打乱这里的顺序
寄存器是一个包含的关系
OD快捷键
F8 单步步过
F7 单步步入
f2 打断点,可以让流程快速的停到你想要的位置
空格 改汇编语句按一下空格就会出来了
把ah改成66,寄存器会自己给我加一个0x,但是不建议这么做。
比如我用al加0x99
最后显示出来都是0x
所以我们要养成良好的习惯,我们用十六进制的时候,一定要自己写0x
ax改了后四位
ah只改了后两位
al只更改了最后的两位
这个是一个包含的关系
前面是寄存机后面是立即数
常见的汇编指令
EIP是什么
程序加载进来就直接来到了004441EC
然后我打断点运行到这个地方来
这个时候就出现了EIP,这个EIP就是记录程序运行到什么地方的
有变化的寄存器会变红,如果说没有变的话就是灰色的
我们按F8就会发现ebx和eip变红了,其他的没有变化
也就是只有ebx通用寄存器和eip的值变了
两个寄存器之间也是可以传值的,上图就是把ebx的值赋值到eax
汇编语句都是把后面的语句赋值到前面
也好理解,二进制绝大多数都是从右往左,这个也是从右往左
在od里如果像写入寄存器必须是以上的格式才可以,否则的话是不行的。
r是通用寄存器,但是eip在广义上是不属于通用寄存器的。eip是不能随便修改的,后面会说到我们会说到eip会有一个其他的方式进行修改,但是用mov和add语句是不可以的。
其实也就是说如果你的命令一开始就是错的,od是不会让你过去的。
但是od有一个什么样的智能的地方呢,如果你超过通用寄存器的位数的话,是会给你自动截断的。
如果硬要将一块地址写道另一块地址的话就需要有一个中转,需要先把内存地址放到前面来然后我们需要将内存地址借用寄存器来写入内存地址。加减或者逻辑运算都是这样需要寄存器中转的
刚接触汇编的师傅可能会不太懂,只要记住两个内存之间是不以直接操作的。是需要用通用寄存器去中转的
add语句和mov语句没什么不同,add就是将eax和ecx的值取出来相加在放进eax里去。
现在这个eax的位置就变成了3
同样sub就是减,吧eax和ecx的值取出来相减在放回eax
and就是与,eax是5,ecx是8,那么结论就是0000,全1为1.也就是相比两位数必须都是一样的才会显示为1
or是或,或的话就是有1则为1
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/24245.html