计算机基础知识之汇编语言1

电子说

1.3w人已加入

描述

汇编语言和本地代码是一一对应的

在前面的文章中我们多次提到,计算机CPU能直接解释运行的只有 「本地代码」 (机器语言)程序。用C语言等编写的源代码,需要通过各自的 「编译器」 编译后,转换成本地代码。

通过调用本地代码的内容,可以了解程序最终是以何种形式来运行的。但是,直接打开本地代码来看,只能看到数值的罗列。

我们可以采用另外一种方式,在各本地代码中,附带上表示其功能的英语单词缩写。例如,在加法运算的本地代码中加上add、在比较运算的本地代码中加上cmp等。这些缩写被称为 「助记符」 ,使用助记符的编程语言称为**「汇编语言」**

不过, 「即使是用汇编语言编写的源代码,最终也必须要转换成本地代码才能运行」 。负责准换工作的程序称为 「汇编器」 ,转换这个一处理本身称为 「汇编」

❝用汇编语言编写的源代码,和本地代码是一一对应的

本地代码也可以反过来转换成汇编语言的源代码。持有该功能的 「逆变换」 程序称为 「反汇编程序」 ,逆变换这一处理本身称为 「反汇编」

C语言


不会转换成本地代码的伪指令

汇编语言的源代码,是由转换本地代码的指令和针对汇编器的 「伪指令」 构成的。 「伪指令负责把程序的构造及汇编的方法指示给汇编器(转换程序)」 。不过,伪指令是无法汇编转换成本地代码。

C语言

如上是一个汇编代码片段。其中 「彩色」 部分是伪指令。

由伪指令segmentends围起来的部分,是给构成程序的命令和数据的集合体加上一个名字而得到的,称为 「段定义」 。段定义的英文表达segment具有区域的意思。在程序中, 「段定义指的是命令和数据等程序的集合体的意思」

❝一个程序由多个段定义构成

如上图所示。源代码的开始位置,定义了3个名称分别为_TEXT_DATA_BSS的段定义。

  • _TEXT是指令的段定义
  • _DATA是被初始化(有初始值)的数据的段定义
  • _BSS是尚未初始化的数据的段定义

而这些段定义的名称及划分方法,不同的编译器都有自己的一套规则。

伪指令procendp围起来的部分,表示的是过程Proceduce的范围。在汇编语言中,这种相当于C语言的函数的形式称为过程。


汇编语言的语法是**「操作码 + 操作数」**

「在汇编语言中,1行表示对CPU的一个指令」 。汇编语言指令的语法结构是 「操作码」 + 「操作数」

  • 「操作码」 表示的是指令动作
  • 「操作数」 表示的是指令对象

操作码和操作数罗列在一起的语法,就是一个英文的指令文本。操作码是动词,操作数相当于宾语。

能够使用何种形式的操作码,是由CPU的种类决定的。

C语言

常用操作码的功能

本地代码加载到内存后才能运行。内存中存储着构成本地代码的指令和数据。程序运行时,CPU会从内存中把指令和数据读出,然后再将存储在CPU内部的寄存器中进行处理。

C语言「寄存器是CPU中的存储区域」 。不过,寄存器并不仅仅具有存储指令和数据的功能,也有运算功能。寄存器的名称会通过汇编语言的源代码指定给操作数。内存中的存储区域是用 「地址编号」 来区分的。CPU内的寄存器是用eaxebx这些名称开区分的。

下图是CPU的寄存器的主要种类和角色C语言


mov指令

mov指令的两个操作数,分别是用来指定数据的 「存储地」「读出源」

操作数可以指定寄存器、常数、标签(附近在地址前)以及用方括号([])围起来的这些内容。

  • 如果指定了 「没有用方括号围起来」 的内容,就表示对该值进行处理
  • 如果指定了 「用方括号围起来」 的内容,方括号中的值则会被解释为 「内存地址」 ,然后就会对该内存地址对应的值进行读写操作
mov ebp,esp;
mov eax,dword ptr [ebp+8];

mov ebp,esp中,esp寄存器中的值被直接存储在ebp寄存器中。esp寄存器的值是100ebp寄存器的值也是100

mov eax,dword ptr [ebp+8];中,ebp寄存器的值加8后得到的值会被解释为内存地址。如果ebp寄存器的值是100的话,那么eax寄存器中存储的就是100 + 8 = 108地址的数据。


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分