汇编语言IT技术

汇编笔记一 : 初始汇编

2018-06-12  本文已影响5人  Superman168

汇编语言百度百科词条:

image.png

机器语言

由0和1组成的机器指令.

汇编语言(assembly language)

由于机器语言指令都是由01组成,难以编写,记忆和维护程序.所以汇编语言为了解决这一问题产生。
汇编语言的主体是汇编指令,汇编指令是机器指令的助记符。
使用助记符代替机器语言

高级语言(High-level programming language)

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

大家都知道我们的代码在终端设备上执行的过程,如下:

15193669666308.jpg

汇编语言的组成

汇编语言的特点

汇编的用途

汇编语言的种类

架构 设备
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以后

几个必要的常识

15193672391363.jpg

总线

CPU 背面的管脚.jpg image

小结

1、汇编指令是机器指令的助记符,与机器指令一一对应。
2、每一种CPU都有自己的汇编指令集,因为CPU 的架构不同。
3、CPU可以直接使用的信息在寄存器中存放。
4、在存储器中指令和数据都是二进制信息。
5、存储单元从0开始顺序编号。
6、一个存储单元可以存储8个bit,即 1B。
7、bit 、B、KB、MB、GB等单位之间的转换。

1 GB == 1024 MB
1 MB == 1024 KB
1 KB = 1024 B(Byte 字节)
1 B(Byte) = 8bit(二进制位)

8、CPU管脚和总线相连。总线的宽度表示CPU不同方面的性能:

小练习

答案

练习答案

阐释:

1 GB == 1024 MB
1 MB == 1024 KB
1 KB = 1024 B(Byte 字节)
1 B(Byte) = 8bit(二进制位)

(1)地址总线的宽度决定了CPU的寻址能力
如:
8086的地址总线宽度是20,所以寻址能力是1M( 2^20 )
2 跟总线的话,能表达最大地址就是二进制 11 ,也就是四个字节Byte ==4 个内存单元 == 4B(0-3) == 2^2.

>再例如:8 根地址总线,2^8 == 256,能表示的数字就是 0—255.
256个字节。

8 KB == 8*1024 字节(Byte) == 8192 == 2^13.

(5)直接算:2^16 = 64 *1024 B = 64 KB
2^20 == 1 MB
2^24 = 16 MB
2^32 = 4096 MB = 4G

(6) 8 根就是 8 bit (二进制位)== 1 个内存单元 == 1 B
(7) 8086 数据总线是 16 根,一次最多读取 2 B,那么
1024 字节/Byte  就需要 1024/2 = 512 次。
80386 是 32 根,数据总线刚好比 8086 多了一倍,就需要512/2 = 256 次。 
image

内存

主板结构 内存划分 内存区域划分
(从上至下,低地址—>高地址:FFFFF == 16^5 == 245==1 MB,低地址给主存储器使用,高地址供系统使用)

进制

学习进制的障碍

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

二、八、十六进制都是完美的进制,相互之间可以转换。

进制的定义

进制的运算

做个练习
八进制加法表
 0  1  2  3  4  5  6  7 
10 11 12 13 14 15 16 17
20 21 22 23 24 25 26 27
...

1+1 = 2                     
1+2 = 3   2+2 = 4               
1+3 = 4   2+3 = 5   3+3 = 6
1+4 = 5   2+4 = 6   3+4 = 7   4+4 = 10  
1+5 = 6   2+5 = 7   3+5 = 10  4+5 = 11  5+5 = 12
1+6 = 7   2+6 = 10  3+6 = 11  4+6 = 12  5+6 = 13  6+6 = 14
1+7 = 10  2+7 = 11  3+7 = 12  4+7 = 13  5+7 = 14  6+7 = 15  7+7 = 16
八进制乘法表
0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20 21 22 23 24 25 26 27...
1*1 = 1                     
1*2 = 2   2*2 = 4               
1*3 = 3   2*3 = 6   3*3 = 11    
1*4 = 4   2*4 = 10  3*4 = 14  4*4 = 20
1*5 = 5   2*5 = 12  3*5 = 17  4*5 = 24  5*5 = 31
1*6 = 6   2*6 = 14  3*6 = 22  4*6 = 30  5*6 = 36  6*6 = 44
1*7 = 7   2*7 = 16  3*7 = 25  4*7 = 34  5*7 = 43  6*7 = 52  7*7 = 61

百度文库各进制乘法表
https://wenku.baidu.com/view/ee774a731ed9ad51f01df252.html

实战四则运算

(查表,跟小学学的加减乘除背的九九乘法表一个道理)

   277         236         276         234
+  333       -  54       *  54       /   4
--------    --------    --------    --------    

答案:(自己算的,如果要专业的背下来最好,可能一时有点转不过来)

632、162、20250、47

二进制的简写形式

二进制、八进制、十六进制之间的转换。

       二进制: 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 这就是十六进制了

(古称:半斤八两)

数据的宽度

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

#import <UIKit/UIKit.h>
#import "AppDelegate.h"

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

int main(int argc, char * argv[]) {
    printf("%x\n",test());
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

计算机中常见的数据宽度

那么计算机存储数据它会分为有符号数和无符号数.那么关于这个看图就理解了!

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

寄存器 (register)

内部部件之间由总线连接

15193738988252.jpg

通用寄存器

通用寄存器
*   CPU首先会将红色内存空间的值放到X0寄存器中:mov X0,红色内存空间
*   然后让X0寄存器与1相加:add X0,1
*   最后将值赋值给内存空间:mov 蓝色内存空间,X0

pc寄存器(program counter)

pc寄存器

注:汇编没有开辟、销毁空间一说,它是直接操控 CPU 和内存。
如果调试过程中要查看某个内存地址的值,可以在Debug->Debug workflow->ViewMemory 中查看,快捷键 Command + shift + M

bl指令

bl指令 -- 练习

现在有两段代码!假设程序先执行A,请写出指令执行顺序.最终寄存器x0的值是多少?

_A:
    mov x0,#0xa0
    mov x1,#0x00
    add x1, x0, #0x14
    mov x0,x1
    bl _B
    mov x0,#0x0
    ret

_B:
    add x0, x0, #0x10
    ret

C4

关于CPU的补充

寄存器

CPU除了有控制器、运算器还有寄存器。其中寄存器的作用就是进行数据的临时存储。

CPU的运算速度是非常快的,为了性能CPU在内部开辟一小块临时存储区域,并在进行运算时先将数据从内存复制到这一小块临时存储区域中,运算时就在这一小快临时存储区域内进行。我们称这一小块临时存储区域为寄存器。

对于arm64系的CPU来说, 如果寄存器以x开头则表明的是一个64位的寄存器,如果以w开头则表明是一个32位的寄存器,在系统中没有提供16位和8位的寄存器供访问和使用。其中32位的寄存器是64位寄存器的低32位部分并不是独立存在的。

高速缓存

iPhoneX上搭载的ARM处理器A11它的1级缓存的容量是64KB,2级缓存的容量8M.

CPU每执行一条指令前都需要从内存中将指令读取到CPU内并执行。而寄存器的运行速度相比内存读写要快很多,为了性能,CPU还集成了一个高速缓存存储区域.当程序在运行时,先将要执行的指令代码以及数据复制到高速缓存中去(由操作系统完成).CPU直接从高速缓存依次读取指令来执行.

弥补寄存器的运行速度和内存读写速度之间的差距,提高速度,性能。

寄存器 --> L1 高速缓存 --> L2 高速缓存 --> L3 高速缓存 --> 内存 --> 磁盘

寄存器的补充

寄存器划分

数据地址寄存器

数据地址寄存器通常用来做数据计算的临时存储、做累加、计数、地址保存等功能。定义这些寄存器的作用主要是用于在CPU指令中保存操作数,在CPU中当做一些常规变量来使用。
ARM64中

注意:
之前讲解8086汇编中有一种特殊的寄存器段寄存器:CS,DS,SS,ES四个寄存器来保存这些段的基地址,这个属于Intel架构CPU中.在ARM中并没有,现在Intel架构CPU中也没有段寄存器了,只是文件中分段。

浮点和向量寄存器

因为浮点数的存储以及其运算的特殊性,CPU中专门提供浮点数寄存器来处理浮点数

image.png

现在的CPU支持向量运算.(向量运算在图形处理相关的领域用得非常的多)为了支持向量计算系统了也提供了众多的向量寄存器.

image.png
上一篇下一篇

猜你喜欢

热点阅读