0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

jf_78858299 来源:前端柒八九 作者:前端柒八九 2023-03-31 16:30 次阅读

对栈进行push 和 pop

❝程序运行时,会在内存上申请分配一个称为 「栈」 的数据空间。

在栈中,数据在存储时是从内存的下层(大的地址编号)逐渐往上层(小的地址编号)累积,读出时则是按照从上往下的顺序进行。

图片

栈是 「存储临时数据的区域」 ,它的特点是通过push指令和pop指令进行数据的存储和读出。push指令和pop指令中只有一个操作数。该操作数表示的是 「push的是什么及pop的是什么」 ,而不需要指定”对哪一个地址编号的内存进行pushpop“。

这是因为,对栈进行读写的内存地址是有esp寄存器(栈指针)进行管理的。push指令和pop指令运行后,esp寄存器的值会 「自动进行更新」push指令是-4,pop指令是+4),因而就没有必要指定内存地址了。


函数调用机制

假设存在如下的C语言代码片段。

// 返回两个参数值之和的函数
int  AddNum(int a,int b){
  return a + b;
}

// 调用AddNum函数的函数
void MyFunc(){
  int c;
  c = AddNum(123,456);
}

转换成对应的汇编语言的代码如下。

图片

这里我们先介绍(3)~(6)的部分,这对了解函数调用的机制很重要。

(3)(4)表示的是将传递给AddNum函数的参数通过push入栈。在C语言中,虽然记述为函数AddNum(123,456),但入栈的则会按照456123这样的顺序,也就是位于 「后面的数值先入栈」

(5)call指令,把程序流程跳转到了操作数中指定的AddNum函数所在的内存地址处。在汇编语言中, 「函数名表示的是函数所在的内存地址」AddNum函数处理完毕后,程序流程必须要返回到编号(6)这一行。call指令运行后,call指令的下一行((6)这一行)的内存地址会 「自动」 push入栈。该值会在AddNum函数处理的最后通过ret指令pop出栈,然后程序流程就会返回到(6)这一行。

(6)部分会把栈中存储的两个参数(456123)进行销毁处理,也就是 「栈清理处理」 。虽然通过使用两次pop指令也可以实现,不过 「采用esp寄存器加8的方式更有效率」 (处理一次)。对栈进行数值的输入输出时,数值的单位是4字节。因此,通过在栈地址管理的esp寄存器加上4的2倍8,就可以达到和运行两次pop命令同样的效果。

图片

AddNum函数调用前后栈的状态变化


函数内部的处理

继续分析执行AddNum函数的源代码部分。图片

ebp寄存器的值在(1)中入栈,在(5)中出栈。这主要是为了把函数中用到的ebp寄存器的内容,恢复到函数调用前的状态。CPU拥有的寄存器是有数量的限制的。在函数调用前,调用源有可能已经在使用ebp寄存器了。因而, 「在函数内部用的寄存器,要尽量返回到函数调用前的状态」

(2)中负责管理栈地址的esp寄存器的值赋值到了ebp寄存器中。这是因为,在mov指令中方括号内的参数,是不允许指定esp寄存器的。因此,这里就采用了不直接通过esp,而是用ebp寄存器来读写栈内容的方法。

(3)是用[ebp+8]指定栈中存储的第1个参数123,并将其读出到eax寄存器中。eax寄存器是负责运算的累加寄存器

通过(4)add指令,把当前eax寄存器的值同第2个参数相加后的结果存储在eax寄存器中。 「函数的参数是通过栈来传递,返回值是通过寄存器来返回的」

(6)ret指令运行后,函数返回目的地的内存地址会自动出栈。

图片

AddNum函数内部的栈状态变化


全局变量用的内存空间

在一些高级编程语言中,在函数外部定义的变量称为 「全局变量」 ,在函数内部定义的变量称为 「局部变量」 。全局变量可以在源代码的任意部分被引用,而局部变量只能在定义该变量的函数内进行引用。

高级程序语言被编译后,会被归类到名为 「段」 定义的组。

  • 初始化的全局变量被汇总到名为_DATA的段定义中
  • 没有初始化的全局变量被汇总到名为_BSS的段定义中
  • 指令被汇总到名为_TEXT的段定义中

局部变量的内存空间

「局部变量只能在定义该变量的函数内进行引用」 ,这是因为,局部变量是临时保存在寄存器和栈中的。

函数内部利用的栈,在函数处理完毕后会恢复到初始状态,因此局部变量的值也就会被销毁,而寄存器也可能被用于其他目的。因此,局部变量只是在函数处理运行期间临时存储在寄存器和栈上。

图片

用于局部变量的栈空间的申请分配和释放


循环处理的实现方法

假设我们存在如下的代码,将局部变量i作为循环计数器连续进行10次循环的C语言源代码。

// 定义MySub函数
void MySub(){
  // 省略部分处理
}
// 定义MyFunc函数
void MyFunc(){
  int i;
  for(i=0;i<10;i++){
    // 重复调用MySub函数10次
    MySub();
  }
}

将上述的代码转换成汇编语言如下(仅展示for片段)

图片

C语言for语句是通过在括号中指定 「循环计数器」 的初始值(i=0)、循环的继续条件(i<10)、循环计数器的更新(i++)这3种形式来进行循环处理。与此相对,

❝在汇编语言的源代码中,循环是通过 「比较指令」cmp)和 「跳转指令」jl)来实现。

具体流程我们就不在这里赘述。这里挑选比较重要的点来分析下。

cmp指令是用来对第一个操作数和第二个操作数的数值进行比较的指令。cmp ebx,10就相当于C语言i<10这一处理,意思是把ebx寄存器的数值同10进行比较。汇编语言中比较指令的结果,会存储在CPU「标志寄存器」 中。

最后一行的jljump on less than(小于的话就跳转)的意思。也就是说,jl short @4的意思就是,前面运行的比较指令的结果,若 「小」 的话就跳转到@4这个 标签


条件分支的实现方式

条件分支的实现方法同循环的实现方法类似,使用的也是cmp指令和跳转指令。

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

    关注

    68

    文章

    10824

    浏览量

    211086
  • 计算机
    +关注

    关注

    19

    文章

    7409

    浏览量

    87690
  • C语言
    +关注

    关注

    180

    文章

    7597

    浏览量

    136114
  • 编译器
    +关注

    关注

    1

    文章

    1618

    浏览量

    49043
收藏 人收藏

    评论

    相关推荐

    《微机原理与汇编语言》微机基础知识

    `《微机原理与汇编语言》微机基础知识[hide][/hide]`
    发表于 04-05 13:00

    汇编语言是什么?怎样去学习汇编语言

    汇编语言是什么?怎样去学习汇编语言呢?计算机怎么识别你写的代码呢?
    发表于 11-29 06:03

    计算机基础知识

    前言《MSP430单片机应用基础与实践》(华中科技大学出版社)------第0章------计算机基础知识(本文章作备忘录使用)1.进制转换2.数值数据的表示3.计算机的码制
    发表于 11-29 06:03

    什么是汇编语言

    文章目录前言一、 汇编语言简介1.1 什么是汇编语言1.2机器语言简介1.3 汇编语言的演变史1.4 汇编语言的广义组成二、硬件与软件2.1
    发表于 02-24 07:01

    计算机组成原理与汇编语言程序设计

    计算机组成原理与汇编语言程序设计是为中央电大计算机组成原理与汇编语言程序设计课程编写的教材。在开始学习本书之前,请大家务必先认真阅读这篇前言,它将告诉你本课
    发表于 10-21 17:56 0次下载
    <b class='flag-5'>计算机</b>组成原理与<b class='flag-5'>汇编语言</b>程序设计

    微机原理与汇编语言程序设计课件

    微机原理与汇编语言程序设计课件为PPT文件,内容有:第1章 基础知识 4第2章 微型计算机系统结构 6第3章 程序加载并执行 4第4章 微处理器一般指令&
    发表于 12-06 22:20 5次下载
    微机原理与<b class='flag-5'>汇编语言</b>程序设计课件

    计算机组成原理与汇编语言习题一

    计算机组成原理与汇编语言习题一   硬盘低格格式化是对硬盘最彻底的初始化方式,经过低格后的硬盘,原来保护的数据将全部丢失
    发表于 04-15 16:16 531次阅读

    计算机基础知识介绍

    计算机基础知识计算机基础知识计算机基础知识
    发表于 12-03 16:13 0次下载

    《微机原理与汇编语言》微机基础知识

    《微机原理与汇编语言》微机基础知识
    发表于 12-14 15:07 0次下载

    计算机学习教程之指令系统与汇编语言程序设计课件免费下载

    本文档的主要内容详细介绍的是计算机学习教程之指令系统与汇编语言程序设计课件免费下载包括了:1.汇编语言程序设计,2.程序设计举例,
    发表于 01-03 08:00 0次下载

    计算机的机器语言汇编语言与高级语言的详细资料介绍

    计算机语言通常是一个能完整、准确和规则地表达人们的意图,并用以指挥或控制计算机工作的“符号系统”。计算机语言通常分为三类:即机器语言汇编语言
    的头像 发表于 02-06 16:11 5731次阅读

    [从零学习汇编语言] - 计算机中的硬件与软件

    文章目录前言一、 汇编语言简介1.1 什么是汇编语言1.2 机器语言简介1.3 汇编语言的演变史1.4 汇编语言的广义组成二、硬件与软件2
    发表于 12-31 19:55 10次下载
    [从零学习<b class='flag-5'>汇编语言</b>] - <b class='flag-5'>计算机</b>中的硬件与软件

    构建 4 位计算机汇编语言汇编器(第 2 部分)

    一旦我们构建了一台计算机,下一步就是开发一种汇编语言,然后是一个可以汇编我们程序的汇编器。   在我 之前的专栏 中,我们介绍了在计算机内存
    发表于 08-01 17:52 842次阅读
    构建 4 位<b class='flag-5'>计算机</b>:<b class='flag-5'>汇编语言</b>和<b class='flag-5'>汇编</b>器(第 <b class='flag-5'>2</b> 部分)

    构建 4 位计算机汇编语言汇编器(第 1 部分)

    我们已经到了需要为 4 位 HRRG 计算机定义汇编语言的地步,但首先我们需要考虑某些概念。 如今,我们习惯于使用 C/C++、Java、Python 等高级语言对我们的计算机和微控制
    发表于 08-01 17:39 909次阅读
    构建 4 位<b class='flag-5'>计算机</b>:<b class='flag-5'>汇编语言</b>和<b class='flag-5'>汇编</b>器(第 1 部分)

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

    在前面的文章中我们多次提到,计算机CPU能直接解释运行的只有 「本地代码」 (机器语言)程序。用C语言等编写的源代码,需要通过各自的 「编译器」 编译后,转换成本地代码。
    的头像 发表于 03-31 16:29 1497次阅读
    <b class='flag-5'>计算机</b><b class='flag-5'>基础知识</b><b class='flag-5'>之</b><b class='flag-5'>汇编语言</b>1