汇编指令与C语言对比

2019-12-09  本文已影响0人  快给我饭吃

这两天在巩固基础,重拾汇编语言,对于汇编语言的思考,记录在此,仅仅是自己的思考笔记,可能有错误的地方,欢迎提意见。

计算机两个最主要的组成部分,就是CPU和内存了。我们编写的程序要运行,是需要先加载到内存中,然后由CPU控制执行的。

简而言之,我们写的程序,其实就是使用CPU对内存进行操作,即CPU和内存的交互,CPU是通过内部的寄存器和内存交互的,所以程序就是寄存器和内存的交互。

重要的事情说三次,寄存器和内存的交互,寄存器和内存的交互,寄存器和内存的交互。 请牢记这句话,我们通篇文章都会贯穿这种思想。

一般c语言的教程,都包含这几个部分:

我们就来看看,以上这些知识,是怎么跟汇编语言联系起来的(这里讲的是8086汇编)。

寻址

8086 CPU是16位处理器,即其内部的寄存器是16位的,但是呢8086的地址总线却是20位的。那这么说,寄存器是否只能访问到2的16次方个内存地址,其他的内存无法访问了吗?

为了解决这个问题,聪明的硬件设计师们将寄存器分为两类,段寄存器和通用寄存器。寻址时,通过段寄存器左移4位+通用寄存器来确定一个内存地址,这样就能访问到所有的内存单元了。

8086 CPU中的寄存器个数很少,每个都有名字(代号)。8086 CPU总共有14个寄存器。

这里需要注意的是,所有的内存包括显存和ROM是统一编址的。

指令和数据的区分

计算机的世界里只有0101,那么CPU是怎么区分这个0101代表的是指令还是数据呢?通过寄存器,如上。
CS左移4位+IP寄存器所得的地址,其指向的地址存储的0101,就是下一条即将指向的指令。
DS就是代表的数据,SS代表栈。

寄存器的常用组合

寄存器一般的搭配为:

内存

在C语言中,我们不需要直接指定内存的地址来获取数据,但在汇编中,是需要我们指定地址的。每一个内存单元代表一个字节(8位),所以一个寄存器为16位则需要两个字节存放。高地址存放在高位,低地址存放低位。如下图,

20191208215732.png

汇编指令和C语言对比

变量和数组(内存)

控制(if, for)

函数(栈)

中断

中段可以认为就是不断检测系统发生的事件,然后系统先停下手头的工作响应中断,根据中断类型找到中断程序的入口,执行该中断处理程序,完成后返回。

上一篇下一篇

猜你喜欢

热点阅读