####
为什么学习汇编语言?1,学习底层的编程思维,
汇编语言是除了机器语言之外,最底层的语言了,你写的好的话是非常高效的,所以很多的驱动,嵌入式,都是汇编写的,当然也有c写的,
汇编语言直接在硬件上工作的语言,首先要了解硬件系统,才能有效的应用汇编语言对其编程,必须要了解的就是cpu和内存,其他的先不用关注,
你知道了汇编语言,底层的cpu内存是如何运行的,cpu和内存是如何配合的,如何读取信息的,你再去学习高级语言,就会更加得心应手,提升你的编程思维,
学习汇编,可以让你学习编程思维,但是不是推荐你去用汇编去编程,
2,比汇编语言,更低级的就是机器语言,就是01,机器语言只有01,所以发明了汇编语言,c语言,是要翻译成汇编语言,再转成机器语言,才可以机器执行,
3,很多逆向,游戏破解,软件破解,都是要反编译成为汇编语言,你如果读不懂汇编语言,就破解不了,别人c语言编写的不会发布c的源码,会发布机器语言,但是机器语言和汇编语言是一一对应的,所以我们直接可以通过机器语言翻译成为汇编语言,
####
汇编语言的组成
1,汇编指令,直接能翻译成机器码的,汇编指令是汇编语言的核心,
汇编指令都有一一对应的机器码,可以让机器识别,
比如mov,add,int,等,都是汇编指令,
2,伪指令,由编译器执行,机器是不认识的,
常见的伪指令,
比如xxx segment,xxx end,这一对伪指令,是在定义一个段,是一个地址段,还是数据段,这个xxx就是段的名字,
比如End,这个单独的End,就是这个汇编程序的彻底结束,遇到这个,就不会对程序编译了,一个汇编程序,必须要有这个End,
assume,假设,就是在指定你这个段,是什么意思,是代码段,还是数据段,还是地址段,
3,其他符号,由编译器识别,比如加减乘除,
ax,这是cpu的寄存器
int,是结束的意思,不是整型,
注意编译只会编译汇编指令,而哪些伪指令,是为了让编译器知道,要如何处理这些汇编指令,
一个程序的运行过程,首先是编写汇编程序----然后编译成为可执行文件----然后使用command命令加载进入内存-----cpu开始执行,
debug的原理,是运行的时候不放弃对cpu的控制权,然后一行一行的执行,
####
###
cpu和存储器之间是如何读写的?存储器
cpu是计算机的核心组件,要cpu工具,必须要给cpu指令和数据才可以,
而这个指令和数据就是在存储器中,也就是我们说的内存,
内存的作用仅次于cpu,再好的cpu没有内存也不能工作,
内存的特点,断电里面的数据就消失了,不会存储起来,
硬盘不同于内存,硬盘中的数据如果不能读取到内存中,也无法被cpu使用,cpu不能直接调用硬盘中的数据,
所以我们学习汇编语言,通篇就是讲cpu如何调动内存,怎么和内存打交道,怎么处理这些数据,
###
指令和数据,
本质上这两个在内存和硬盘中存储都是没有区别的都是二进制的信息,
同样的二进制信息,我们告诉电脑这是指令就是指令,说是数据就是数据,
###
每一个存储器是由很多存储单元组成的,
比如一个内存有128个存储单元,他们的编号就是0-127,
比较大的存储器,还要用到计量单位,比如KB,MB,GB,TB,1024倍,硬盘和内存的计量单位是一样的,
1KB=1024B,1B=8b,1个字节是8位,
一个存储单元可以存储8个bit,就是8位二进制数,
###
cpu对存储器的读写,
cpu要读写必须要和存储器做3类信息的交互,
1,存储单元的地址,---地址信息,
2,器件的选择,读或者写,---控制信息,
3,读或写的数据,---数据信息,
###
cpu是通过什么来把这3类信息传递到存储器的呢?
是通过导线,是可以看到的,cpu和其他组件的导线,
逻辑上划分为,
地址总线
控制总线,
数据总线,
###
执行过程,
比如cpu发出了一个指令,在3号地址,读取,数据,------就是去找内存的3号地址,然后发送读的命令,把数据读出来,写是同样的,
####
那么我们如何对机器发出指令呢?
我们知道同样的二进制信息,可以是指令也可以是数据,计算机怎么判断呢?
我们上面知道,有3条总线,地址总线,控制总线,数据总线,所以我们的二进制信息,通过哪条总线传输,就是哪种命令,
###
loop指令,
mov cv 11,这是指的循环11次,
s是loop的标号,loop s就是循环这一句,
###
#####