汇编学习教程:写在之前

汇编语言

众所周知。汇编语言是一个面向机器的低级语言,比汇编更加低级的那就是0和1的机器码了,所以汇编也是第二代计算机语言。早期计算机刚被发明出来的时候,人们使用打孔机即0和1来编程,但阅读起来是非常的困难,毕竟对与我们的大脑而言,相比0和1数字,固定的格式和特殊标号更加感兴趣也更加牢记。为了减轻大脑的痛苦,所以由此汇编语言便诞生了,用一些容易理解和记忆的字母,单词来代替一个特定的指令,这样人们更加的容易阅和理解读程序,而不用费劲的钻研01。

学习汇编的理由

前面说了这么多你可能想问,目前已经有了这么多的高级语言,c,c++,Java等等,那么还有必要学习汇编这种古董么?对于一个从事开发的人员来说,学习汇编确实没有太多必要,但是从博主的角度,对于一个从事逆向的人员来说,汇编是一个必须要掌握的技能。在Java层逆向,会有很好的工具直接把程序包反编译出Java代码,比如jadx。但是在c层逆向,而你将会的得到的是一份汇编代码。如果你不熟悉汇编,甚至不知道汇编,那么你在逆向起来是困难重重。你可能会说,IDA提供的有F5转c代码功能,可以不用直接阅读汇编呀!你若这样想那便是大错特错了,F5转的是伪c,你可以参考基本流程是没问题的,但是代码逻辑确实一团糟,还很可能是错误的,如果你非信以为真,那么很可能会被带偏。

所以掌握汇编是我们深入底层逆向所必备的技能。学习汇编并不是说真的让你使用汇编进行开发,而是去学习底层知识,了解底层运行原理,这样有助于我们底层逆向工作的顺利开展。对于开发人员来说,学习逆向则能更好地发散思维,更加理解机器思想,有助于写出更高效的逻辑代码!

提要

本系列的汇编教程将以x86汇编为基础讲解,对应的CPU则是经典的8086CPU,课本则以王爽老师的《汇编语言 第四版》为主。本系列教程围绕《汇编语言》,将带领小伙伴汇编入门学习,针对课本中的知识点和例题进行细致剖析,穿插博主自己的学习心得和理解。希望能和小伙伴们一起学习进步,一起加油!

一些很基础的知识

这里主要介绍一下相关的基础知识,由于本教程是纯小白零入门,所以会说到一些非常基础的东西,讲解也会非常的详细。

进制

我们都知道有二进制,八进制,十进制,十六进制,等等好多,这里主要说二进制,和十六进制。我们最熟悉并日常使用,看得懂的是十进制,在小学的加减乘除中我们都学过,计算逢十进一,进一,就是该位的前一位加1。那好,回到二进制,熟悉了十进制的进位规则,我们就会知道所谓二进制,就是逢二进一,以此类推,十六进制就是逢十六进一。

二进制中:1的表示还为1,如果加上1,1+1=2,那么就需要往前进一位,则变成:10,即数字2用二进制表示为10。如果再加上1,0+1=1,小于2,则不要进位,变为:11,即数字3用二进制表示为11。现在我们再加上1,(计算顺序从右向左),1+1=2,则进位,起始位变成0,第2位原本是1,此时又有个进位1,则1+1=2,再次发生进位,第二位也变成0,第三位则成为了1,最终表示:100,即数字4用二进制表示为100。

十六进制中进位的规则完全相同,唯一区别就是多出了六个字母,即:A,B,C,D,E,F。那么这六个字母代表什么,为什么会出现字母呢?

数字0~9,都是单位的,但是从数字10开始,就变成了两位。对于十六进制来说,只有遇到16的时候才会向前进一位,即按照规则,十六进制的表示的数字,只有数字大于16,才能是一个两位的数。而10显然比16小,所以没法进位,必然要表示为一个单位数。所以规定来了,对于十六进制来说,使用字母A表示数字10,字母B表示数字11,字母C表示数字12,字母D表示数字13,字母E表示数字14,字母F表示数字15。你要是问为什么只到15?那肯定的,因为16就往前进一位了,哪来的16~

为什么会有这么多的进制

这里,你可能会有一个疑问,为什么会有这么多的进制呢?我们人类只使用一种进制,就十进制它难道不香么?为什么要搞出来二进制和十六进制呢?

首先回答,十进制对于我们人类它确实很香,是我们最熟悉且能看的懂的数字语言,但是对于机器来说,不好意思,它看不懂也无法理解十进制,它只认得二进制,即0和1。这是和物理特性相关的,学过数字电路就会明白,在电路中,只有两种情况,要么是通路,要么是断路,通路即是1,短路即是0。以计算机为例,某一时刻,它内部的电路状态永远只有上述两种情况,所以我们的计算机只能处理二进制数据,即0和1。

ok明白了二进制存在的意义,那么十六进制存在的意义是什么呢?十六进制的出现是为了更好的表达数字,只需要几个字符就可以表达一大长串的数字。什么意思呢?二进制只使用0和1表达数字,如果这个数字比较大,比如10000,二进制表示为:10011100010000,共14位,看着很长了,如果使用十六进制表示,则为:2710,才4位,相比之下如果让你去阅读,一个14位的数字简单方便阅读还是一个4位的数据简单方便阅读呢?高下立现。

字节和字

首先什么是字节?

字节,即Byte,是由八个位组成的一个单元,也就是8个bit组成1个Byte。这里的8个位是使用二进制来表示的。即:1表示为 0000 0001。

字,即Word,代表计算机处理指令或数据的二进制数位数,是计算机进行数据存储和数据处理的运算的单位。对于不同位的CPU来说,字也是不相同的。比如我们这个系列教程中的8086CPU,它是16位的,那么对于8086CPU来说,它一次能处理的数据最大就是16位,所以8086CPU中一个字就是16位,也就是两个字节(一个字节是8位)。即:1表示为:0000 0000 0000 0001。

目前而言,16位CPU基本上属于已经淘汰的,也就在一些开发板上可能还是16位的CPU。现在市面上我们大家都在使用的基本上都是32位,64位的CPU,甚至还有128位的。

那么,对于32位的CPU而言,它的一个字就是32位,也就是4个字节;对于64位的CPU而言,它的一个字则是64位,8个字节。所以,如果你的CPU位数越高,那么单位时间内能处理的数据也就越多越大,运行的效率和速度也就越高,CPU的性能越好。

一些耳熟能详的数字

在日常的工作中,你肯定听到过以下几个数字:255,127,65535,32767,等等。这些数字是什么意思?猛地看上去不明白,直接懵逼。首先你要先明白,计算机中一个字节是8位,使用十六进制表示则为两位。255,十六进制即为:ff,二进制即为:1111 1111,表示为一个字节所能表达最大的数字。

那什么是127呢?这里就需要涉及到有符号数和无符号数,展开了说还会涉及到原码、反码和补码。这里先不谈那么多,先说有符号数和无符号数。先弄清楚符号是什么,符号就是指正负符号,即+,-。我们自然数字语言中,数字是存在正负之分的,然而机器却不会明白一个数字的正负,也无法区分正负。但是机器在处理数据的时候,肯定是要按照且符合我们人类自然数字中的运算逻辑,有正也要有负。为了让机器的运算能够兼容正负数字处理,所以人们便规定了字节的第七位为符号位,0表示正,1表示负。

所以对于有符号数来说,其第七位为符号位,不算入数值表示,实际用来表达数值的只有剩余的7位。如果七位全为1,即:0111 1111,数值为+127,所以127表示为一个字节有符号数能表达最大的数字。

下面说 65535,二进制就是:1111 1111 1111 1111 ,使用十六进制就是FFFF,也就是说,这是16位CPU中一个字所能表达最大的数字。

32767也是按照有符号数规则,即第15位为符号位,剩余的15位用来表达数值,如果十五位全为1,即:0111 1111 1111 1111,数值为32767,所以32767表示为一个字有符号数所能表达最大的数字(16位CPU)。

本篇结束语

本篇博文主要探讨了学习汇编的意义以及为什么要学习汇编,此外讲解一些有关进制、字节等基础知识,下篇博文将带领大家深入CPU,讲解CPU相关的知识和运行机制。

另建议大家在网上下载《汇编语言 第四版》pdf书籍,这真的是一本很好的汇编入门学习教材,本系列教程也会围绕此书籍进行讲解。

感谢围观,转发分享请标明出处,谢谢!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值