汇编基础(一)学习汇编需要了解掌握的知识点

引言

什么是汇编语言?
答:汇编语言是计算机语言,通俗来讲就是人类与计算机(CPU)交流的桥梁,计算机不认识人类的语言,想要让计算机去完成人们的工作,就需要俺们将这些工作翻译成计算机语言,属于低级计算机语言。
APP与汇编语言的关系
一个APP安装到操作系统上面的可执行的文件本质上来讲就是二进制文件,操作系统本质上执行的指令也是二进制,是由CPU执行的;

汇编语言的发展

机器语言(Machine language)

01组成的机器指令
如:

* 加:0100 0000
* 减:0100 1000
* 乘:1111 0111 1110 0000 
* 除:1111 0111 1111 0000 

汇编语言(assembly language)

使用助记符代替机器语言
如:

- 加:INC EAX     通过编译器 0100 0000
- 减:DEC EAX     通过编译器 0100 1000
- 乘:MUL EAX     通过编译器 1111 0111 1110 0000
- 除:DIV EAX     通过编译器 1111 0111 1111 0000

高级语言(High-level programming language)

注意:上述指令,CPU读的懂

C\C++\Java\OC\Swift,更加接近人类的自然语言
比如C语言:

- 加:A+B     通过编译器           0100 0000
- 减:A-B     通过编译器           0100 1000
- 乘:A*B     通过编译器           1111 0111 1110 0000
- 除:A/B     通过编译器           1111 0111 1111 0000

代码在设备上执行的过程是这样的:


代码执行过程.png
  • 汇编语言机器语言一一对应,每一条机器指令都有与之对应的汇编指令
  • 汇编语言可以通过编译得到机器语言机器语言可以通过返汇编得到汇编语言
  • 高级语言可以通过编译得到汇编语言\机器语言,但机器语言几乎不可能还原成高级语言

汇编语言的特点

  • 可以直接访问、控制各种硬件设备,比如存储器、CPU、内存等,能最大限度地发挥硬件的功能
  • 能够不受编译器的限制,对生成的二进制代码进行完全的控制
  • 目标代码简短,占用内存少,执行速度快
  • 汇编指令是机器指令的助记符,同机器指令--对应。每一种CPU都有自己的机器指令集\汇编指令集,所以汇编语言不具备可移植性
  • 知识点过多,开发者需要对CPU等硬件结构有所了解,不易于编写、调试、维护
  • 不区分大小写,比如汇编 mov和MOV是一样的

汇编的用途(俺写了这么多,看了这么多干哈阿?)

  • 编写驱动程序、操作系统(比如Linux内核的某些关键部分)
  • 对性能要求极高的程序或者代码片段,可与高级语言混合使用(内联汇编)
  • 软件安全
    • 病毒分析与防治
    • 逆向\加壳\脱壳\破解\外挂\免杀\加密解密\漏洞\黑客
  • 理解整个计算机系统的最佳起点和最佳有效用途
  • 为编写高效代码打下基础
  • 弄清楚代码的本质
    • 函数的本质究竟是什么?
    • ++a + ++a + ++a 底层如何执行的?
    • 编译器到底帮俺们干了什么?
    • DEBUG模式和RELEASE模式有什么关键的地方被俺们忽略
    • ......

怎么提升逼格
越底层的东西越纯粹!真正的程序猴子都需要了解一门语言,汇编,你值得拥有!

汇编语言的种类

  • 目前讨论比较多的汇编语言有

    • 8086汇编(8086处理器是16bit的CPU)
    • Win32汇编
    • Win64汇编
    • ARM汇编(嵌入式、Mac、iOS)
    • 。。。。
  • iPhone里面用到的是ARM汇编,但不同的设备也有差异,因为CPU的架构不同。

架构 设备
armv6 iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch
armv7 iPhone3GS, iPhone4, iPhone4S,iPad, iPad2, iPad3(The New iPad), iPad mini, iPod Touch 3G, iPod Touch4
armv7s iPhone5, iPhone5C, iPad4(iPad with Retina Display)
arm64 iPhone5S以后, iPhoneX , iPad Air, iPad mini2以后

必要的常识

  • 了解CPU等硬件结构
  • APP/程序的执行过程


    APP:程序的执行过程.png
  • 硬件相关的最重要的是CPU/内存
  • 汇编中,大部分指令都是和CPU与内存相关的

总线


  • 每一个CPU芯片都有许多管脚,这些管脚和总线相连,CPU通过总线跟外部器件进行交互
  • 导线的集合
  • 总线的分类
    • 地址总线
    • 数据总线
    • 控制总线

例如:

  • 地址总线
    • 它的宽度决定了CPU的寻址能力
    • 8086的地址总线宽度是20,所以寻址能力是1M
  • 数据总线
    • 它的宽度决定了CPU的单词数据传送量,也就是数据数据传递速度
    • 8086的数据总线宽度是16,所以单词最大传递2个字节的数据
  • 控制总线
    • 它的宽度决定了CPU对其他期间的控制能力、能有多少种控制(物联网有关)

内存



  • 内存地址空间的大小受CPU地址总线宽度的限制。8086的地址总线宽度为20,可以定位220个不同的内存单元(内存地址范围0x00000~0xFFFFF),所以8086的内存空间大小为1MB,1024b=1kb,1024kb=1mb,1024mb=1gb 2^10 = 1024b(1kb) 2^20 = 1024kb(1mb) 2^30 = 1024mb(1gb) 1024b = 1kb 1024^2b = 1mb 1024^3b = 1gb
  • 0x00000~0x9FFFF:主存储器。可读可写
  • 0xA0000~0xBFFFF:向显存中写入数据,这些数据会被显卡输出到显示器。可读可写
  • 0xC0000~0xFFFFF:存储各种硬件\系统信息。只读

进制

学习进制的障碍

* 很多人学不好进制,原因是总以十进制为依托去考虑其他进制,需要运算的时候也总是先转换成十进制,这种学习方法是错误的.
* 俺们为什么一定要转换十进制呢?仅仅是因为俺们对十进制最熟悉,所以才转换.
* 每一种进制都是完美的,想学好进制首先要忘掉十进制,也要忘掉进制间的转换!

进制的定义

  • 八进制由8个符号组成:0 1 2 3 4 5 6 7逢八进
  • 十进制由10个符号组成:0 1 2 3 4 5 6 7 8 9逢十进一
  • N进制就是由N个符号组成:逢N进一

进制的简写形式

二进制            1 0 1 1 1 0 1 1 1 1 0 0
三个二进制一组     101  110  111  100
八进制             5   6   7  4
四个二进制一组    1011  1011  1100
十六机制            b   b   c

二进制:从0 写到 1111
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
这种二进制使用起来太麻烦,改成更简单一点的符号:
0 1 2 3 4 5 6 7 8 9 A B C D E F 这就是十六进制了

数据的宽度

数学上的数字,是没有大小限制的,可以无限的大。但在计算机中,由于受硬件的制约,数据都是有长度限制的(我们称为数据宽度),超过最多宽度的数据会被丢弃,也就是说根本存不下去。

int test(){
    int cTemp = 0x1FFFFFFFF;
    return cTemp;
}

int main() {
    printf("%x\n",test());
}

打印的结果只有 0xffffffff。

计算机中常见的数据宽度

• 位(Bit): 1个位就是1个二进制位.0或者1
• 字节(Byte): 1个字节由8个Bit组成(8位).内存中的最小单元Byte.
• 字(Word): 1个字由2个字节组成(16位),这2个字节分别称为高字节和低字节.
• 双字(Doubleword): 1个双字由两个字组成(32位)

为什么计算机存储数据它会分为有符号数和无符号数

无符号数,直接换算!
有符号数:
正数:  0    1    2    3    4    5    6    7 
负数:  F    E    D    B    C    A    9    8
      -1   -2   -3   -4   -5   -6   -7   -8

反码、补码、原码自行度娘、谷爹

自定义进制符号

通过10进制运算可以转化10进制然后查表!但是如果是其他进制
例如:

现在有9进制数 9个符号分别是:2,9,1,7,6,5,4, 8,3 逢9进1  这是进制吗?
自定义进制,可以用来加密App,预防反编译

寄存器

内部部件之间由总线连接
寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址


• 对程序员来说,CPU中最主要部件是寄存器,可以通过改变寄存器的内容来实现对CPU的控制
• 不同的CPU,寄存器的个数、结构是不相同的

总结

学习汇编需要什么前提呐?

  • 进制
  • 内存、硬盘、CPU等硬件的结构需要一定的了解
  • 寄存器一定要搞清楚
  • 计算机程序运行的基本过程需要了解
  • 计算机的基本存储
  • 大部分的汇编都跟 CPU/内存有关

上述内容,需要多看,多查,上述内容有一定了解以后,那么就开始学习汇编吧,汇编怎么开始学习,肯定是先学习汇编指令喽!

  • 汇编怎么运行?
  • 都有哪些汇编指令?
  • 这些指令都怎么用?
  • 汇编的环境?
  • 能不能跟普通代码混编?
  • 运行起来应该是很高效的?
    以后在慢慢去学习,哥么还得任重道远、须知学海无涯!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容

  • 一.认识汇编语言 要认识汇编语言,还得从编程语言的发展说起,语言有以下几种分类,其发展都是为了让我们更容易去操纵计...
    WellsCai阅读 957评论 0 1
  • 汇编语言百度百科词条: 机器语言 由0和1组成的机器指令. 汇编语言(assembly language) 由于机...
    Superman168阅读 1,017评论 0 3
  • 编程语言的发展 机器语言由0和1组成 汇编语言(Assembly Language)用符号代替了0和1,比机器语言...
    阿凡提说AI阅读 3,925评论 0 15
  • 汇编语言的发展 机器语言 由0和1组成的机器指令. 加:0100 0000 减:0100 1000 乘:1111 ...
    CoderLWG阅读 1,650评论 2 0
  • 001--初识汇编 我们在学习逆向开发之前,我们要了解一个基本的逆向原理.首先我们是逆向iOS系统上面的APP.那...
    默默_David阅读 918评论 0 0