汇编语言学习笔记 下

news/2024/11/20 13:24:07/

本文承接汇编语言学习笔记 上

上篇文章记录了汇编语言寄存器,汇编语言基本组成部分,数据传送指令,寻址指令,加减法指令,堆栈,过程,条件处理,整数运算的内容

高级过程

大多数现代编程语言在调用子程序的时候会把参数压入对战

子程序也常常把局部变量压入堆栈

  • 子程序在C和C++中被称为函数
  • 在Java中被称为方法
  • 在宏汇编程序(MASM)中被称为过程

堆栈帧

堆栈参数

堆栈帧是一块堆栈保留区域

存放

  • 被传递的实际参数
  • 子程序的返回值
  • 局部变量
  • 被保存的寄存器

创建步骤

  1. 将被传递的实际参数压入堆栈
  2. 当子程序被调用时,该子程序的返回值压入堆栈
  3. 子程序开始执行的时候,EBP被压入堆栈
  4. 设置EBP等于ESP,EBP成为子程序所有参数的引用基址
  5. 如果有局部变量,修改ESP在堆栈中为其预留空间
  6. 需要保留的寄存器,将它们压入堆栈

Fastcall调用方式

顾名思义,是一种希望快速的调用方式

我们来分析一下这个调用方式: 

调用自过程的时候,需要首先将参数传入EAX,EBX,ECX,EDX,少数情况还会传入ESI,EDI

我们知道寄存器是CPU内部的原件,堆栈在内存上,寄存器调用明显更快

但是我们知道通用寄存器很少,很多都有特定的功能,乘法需要用到EAX,还有许多寄存器用来循环数值和参与计算的操作数

因此寄存器不可能一直存放传递给过程的参数

在过程调用之前, 存放参数的寄存器需要首先入栈,然后向其分配过程参数

但是这些额外的入栈操作会让代码变得混乱,还有可能消除性能优势

值传递

一个参数通过数值传递时,该值的副本会被压入堆栈

.data
val1 DWORD 3
val2 DWORD 6
.code
push val2
push val1
call AddTwo

引用传递

通过引用来传递的参数包含的是对象的地址

push OFFSET val2
push OFFSET val1

传递数组

将数组的地址压入堆栈 

不愿意采用将每个数组元素压入堆栈的原因是这样很慢而且浪费堆栈空间

访问堆栈的参数

1.将传递的参数压入堆栈,调用子过程

2.EBP寄存器存放的是原来栈帧的基址,我们需要现将EBP压入栈保存

3.然后将当前的ESP作为新的栈帧的基址

示例

int AddTwo(int x,int y)
{return x+y;
}

将EBP入栈,设置ebp位esp的值

AddTwo PROCpush ebpmov ebp,esp

ADD(5,6)

6

[EBP+12]
5[EBP+8]
返回地址[EBP+4]
EBPmov ebp,esp

这样通过当前EBP和偏移量就能访问传入的参数和原来的ebp(返回地址)


http://www.ppmy.cn/news/18767.html

相关文章

The Loss Surfaces of Multilayer Networks论文阅读

1. 摘要 本文研究全连接前馈神经网络的简单模型的高度非凸损失函数与球自旋玻璃模型的联系,基本假设是:i)变量独立;ii)网络参数冗余;iii)一致性。这些假设让我们可以利用随机矩阵理论的棱镜来解…

第七层:多态

文章目录前情回顾多态多态的基本概念动态多态的满足条件动态多态的使用虚函数多态的优点纯虚函数和抽象类抽象类特点虚析构和纯虚析构虚析构和纯虚析构的共性虚析构和纯虚析构的区别面向对象结束,接下来是什么?本章知识点(图片形式)&#x1…

51单片机数码管显示

文章目录前言一、数码管简介二、数码管原理图三、数码管显示原理四、静态数码管代表编写五、动态数码管总结前言 这篇文章将介绍数码管的显示其中包含了动态数码管和静态数码管两种。 一、数码管简介 数码管其实就是由多个发光二极管封装在一起组成“8”字型的器件当分别点亮…

SpringCloud+Ribbon 报错:java.net.unknownhostexception:XXX

SpringCloudRibbon 报错:java.net.unknownhostexception:XXX 问题分析: 网上很多的说法是依赖冲突导致,原因是什么呢:如果你的org.springframework.cloud:spring-cloud-starter-netflix-eureka-client 依赖中包含了ribbon依赖&…

学习记录667@项目管理之项目人力资源管理

什么是项目人力资源管理 项目人力资源管理包括编制人力资源管理计划、组建项目团队、建设项目团队与管理项目团队的各个过程,不但要求充分发挥参与项目的个人的作用,还包括充分发挥所有与项目有关的人员-----项目负责人、客户、为项目做出贡献的个人及其…

Linux下进程以及相关概念理解

目录 一、进程概念 二、描述进程PCB 三、查看进程 3.1 通过系统目录查看 3.2 通过ps命令查看 四、进程状态 运行状态R 睡眠状态S 磁盘休眠状态D 暂停状态T 僵尸状态Z 死亡状态X 五、僵尸进程与孤儿进程 5.1 僵尸进程 5.1.1 僵尸进程的概念 5.1.2 僵尸进程的危害…

PowerShell 执行策略

在使用 SAPIEN 的PowerShell Studio时出现如下错误:无法在当前系统上运行该脚本。有关运行脚本和设置执行策略的详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policies。 ERROR: 所在位置 行:1 字符: 2 ERROR: …

34.Isaac教程--操作示例应用程序

操作示例应用程序 ISAAC教程合集地址文章目录操作示例应用程序与 Jupyter Notebook 的简单联合控制Shuffle Box with Simulator与 Jupyter Notebook 的简单联合控制 此示例使用 Jupyter Notebook 提供交互式联合控制。 这是处理用于操作组件(包括 LQR 规划器&#…