美文网首页
汇编指令与C语言对比

汇编指令与C语言对比

作者: 快给我饭吃 | 来源:发表于2019-12-09 00:27 被阅读0次

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

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

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

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

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

  • 变量和数组(内存)
  • 控制(if, for)
  • 函数(栈)

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

寻址

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

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

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

  • 段寄存器:CS(Code Segment),DS(Data Segment),SS(Stack Segment),ES(Extend Segment)
  • 通用寄存器:AX,BX(Base),CX(Count),DX

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

指令和数据的区分

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

寄存器的常用组合

寄存器一般的搭配为:

  • CS+IP:指定指令地址
  • DS+([0], [BX], [BX+0], [SI], [DI]) :指定数据地址,BX寄存器存放偏移地址,SI和DI可以用于复制
  • SS+SP:指定栈内存
  • loop+CX:CX寄存器放置循环次数
  • DS+[BX+SI+0]:可以用于数组,该命令格式也可以写为,200[SI]或[BX][SI]或[BX][SI]这种更像数组的写法

内存

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

20191208215732.png

汇编指令和C语言对比

变量和数组(内存)

  • 变量和数组:变量和数组的分配都是在内存中。如int i = 0;或者int[] array = {1, 2},在汇编中则是mov [0], 0或者mov [BX],1; add BX,2; mov[BX],2;

控制(if, for)

  • go跳转语句:在汇编中则是jmp short, jmp far ptr,该命令操作了CS和IP寄存器。jmp far ptr段间跳转,不止修改了IP的值还修改了CS的值,而jmp short只修改IP的值
  • if判断:在汇编中是JE指令,相等则跳转。
  • for, while循环:for在汇编中是loop+CX,其中CX设置循环次数,while则可以使用JE跳转

函数(栈)

  • 函数的调用和返回指令:call, call far ptr, ret, retf,该指令会把IP或CS和IP入栈,

中断

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

相关文章

  • 8086汇编基础学习课件

    一、汇编与高级语言对比 1 区别 汇编语言与机器语言一一对应,每一条机器指令都有与之对应的汇编指令 汇编语言可以通...

  • 汇编指令与C语言对比

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

  • 编程语言发展

    机器指令:【可以直接操作电脑】 汇编:汇编指令 高级程序语言:c、C++、Java、OC等 2、高级语言通过编译器...

  • 汇编语言学习笔记(一)简介

    一、汇编语言的发展 汇编语言与机器语言 一一对应 ,每一条机器指令都有与之对应的汇编指令. 汇编语言可以通过编译得...

  • 初识汇编(一)

    汇编语言与机器语言一一对应,每一条机器指令都有与之对应的汇编指令 汇编语言可以通过编译得到机器语言,机器语言可以通...

  • OC的本质

    1 objective-c ->c\c++->汇编语言(不同的平台指令不同,显示的代码不同)->机器语言。 2 ....

  • 1、汇编初探

    我们的代码在终端设备上是这样的过程: 汇编语言与机器语言一一对应,每一条机器指令都有与之对应的汇编指令 汇编语言可...

  • 编译优化o2

    C语言没有汇编快,因为C语言要由编译器翻译为汇编,编译器毕竟是人造的,翻译出来的汇编源代码总有那么N条指令在更智能...

  • 2. 指令集对CPU的意义

    汇编语言与c语言等高级语言的差异 汇编难写,c好写 汇编无可移植性,c语言有一定的可移植性,Java等高级语言移植...

  • 1、语言与机器

    计算机的本质: 语言与机器 1、汇编语言与机器语言一一对应,每一条机器指令都有与之对应的汇编语言.2、汇编语言可以...

网友评论

      本文标题:汇编指令与C语言对比

      本文链接:https://www.haomeiwen.com/subject/qvivgctx.html