为什么我有 PUSH ecx?

2024-03-28

有人可以告诉我这两个的目的是什么吗push ecx下面的说明?我不明白他们到底要做什么?

我意识到push epb正在保存堆栈基指针,然后mov epb, esp正在将堆栈指针分配给前一个堆栈基指针。

int main(){
01301190  push        ebp  
01301191  mov         ebp,esp  
01301193  push        ecx                              ;here?? 
01301194  mov         dword ptr [h],0CCCCCCCCh  
    int h = my_func(1,3);



int my_func(int a, int b){
01301160  push        ebp  
01301161  mov         ebp,esp  
01301163  push        ecx                              ;here??
01301164  mov         dword ptr [m],0CCCCCCCCh  
    int m = 0;
0130116B  mov         dword ptr [m],0  
    m = a*b;
01301172  mov         eax,dword ptr [a]  
01301175  imul        eax,dword ptr [b]  
01301179  mov         dword ptr [m],eax  
    return m;
0130117C  mov         eax,dword ptr [m]  
}
0130117F  mov         esp,ebp  
}
01301181  pop         ebp  
01301182  ret  

The push ecx在堆栈上为局部变量分配 4 个字节(m and h)。实际内容为ecx没关系 - 分配的槽会立即被覆盖0CCCCCCCCh(Visual C++ 在调试版本中使用此神奇值来标记未初始化的变量)。

Visual C++经常使用push ecx and pop ecx作为替代品sub esp, 4 and add esp, 4。为什么?有以下几个原因:

push ecx and pop ecx是单字节指令,而add and sub每个都是三个字节。差异可能不是很大,但所有函数中保存的所有字节加起来可能会很重要。

ecx被认为被函数调用破坏了,所以可以安全地用pop ecx函数调用后。所以你经常会看到这样的代码:

  push arg1    ; push an argument
  call __func1 ; call the function
  pop ecx      ; restore the stack

For push,没有真正的理由使用ecx具体来说 - 任何基本寄存器都可以。我想它只是为了对称而选择的,或者不要与非易失性寄存器的实际保存相混淆,例如esi or edi.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我有 PUSH ecx? 的相关文章

  • SSE加载和添加

    假设我有两个由两个类型数组表示的向量double 每个尺寸为2 我想添加相应的位置 所以假设向量i0 and i1 我想补充一下i0 0 i1 0 and i0 1 i1 1 一起 由于类型是double 我需要两个寄存器 诀窍是把i0 0
  • 如何将三地址代码转换为MIPS汇编语言?

    我正在做一个项目 其中我必须创建一个翻译器来为 C 代码生成 MIPS 汇编代码 正在使用的编程语言是 C 我已经完成了三个地址代码的生成 但我对如何进一步进行感到非常困惑 如前所述 这是直接翻译 确实没有什么需要澄清的 以下面的三地址代码
  • 源操作数和目标操作数是否需要相同大小?

    我刚刚尝试了这个问题 要求你解释一下代码行有什么问题 movl eax rdx 解决方案表明目标操作数的大小错误 仅当从较大尺寸变为较小尺寸时才 非法 还是源操作数和目标操作数对于所有指令 或至少 mov 类类型 必须具有相同的尺寸 是的
  • 如何可移植地乘以 64 位操作数并获得 128 位结果?

    对于 x64 我可以使用这个 uint64 t hi lo hi lo 64bit x 64bit multiply of c 0 and b 0 asm mulq 3 n t d hi a lo a c 0 rm b 0 cc a 0 h
  • 切换 C++ 函数的调用堆栈

    这是我的上一个问题 https stackoverflow com questions 1371547 explanation of asm code关于切换 C 调用堆栈 但是 C 使用不同的调用约定 thiscall 并且可能需要一些不
  • 在什么类型的情况下汇编速度不够快,因此您需要直接的硬件/布尔逻辑解决方案?

    我已经开始通读装配艺术 https nostarch com assembly2 htm 其中有一个关于布尔逻辑的部分 其中指出 当然 使用 Pascal C 甚至汇编语言等语言指定编程问题的解决方案比使用布尔方程指定解决方案要容易得多 因
  • 读取和打印手臂组件中的字符串

    我正在使用 ARMSim 刚刚开始学习汇编 所以如果我看起来一无所知 请原谅我 但我正在尝试从输入文件中读取字符串 然后将其打印到输出屏幕 到目前为止我有 equ SWI Open 0x66 open a file equ SWI Clos
  • 我如何使其解密而不是加密?

    想知道如何从加密代码中获取此代码并使用相同的代码来创建解密 我知道这意味着我必须反转一些指令并重新排序 但我无法弄清楚哪些指令需要重新排序 哪些不需要 编辑 这是完整的函数 可以让事情变得更清晰一些 对堆栈溢出非常陌生 因此对于任何混淆表示
  • MASM32 中令人困惑的括号

    我正在尝试掌握 MASM32 但对以下内容感到困惑 我认为括号用于间接 所以如果我有预定义的变量 data item dd 42 then mov ebx item 会将 item 的内容 即数字 42 放入 ebx 中并 mov ebx
  • 如何关闭MIPS-GCC自动指令重排序?

    继这个问题之后 使用跳转 和链接 指令的奇怪 MIPS 汇编器行为 https stackoverflow com questions 3807480 weird mips assembler behavior with jump and
  • 大端和小端表示

    如果我写以下内容 section data align 4 X db 1 Y dw 5 Z db 0x11 section text add dword X 0xAA000101 我试图理解大端和小端表示之间的差异 但我不明白每个表示的每个
  • 什么是微编码指令?

    我看过很多参考微编码指令的文献 这些是什么以及为什么使用它们 CPU 读取机器代码并将其解码为内部控制信号 将正确的数据发送到正确的执行单元 大多数指令映射到一个内部操作 并且可以直接解码 例如 在 x86 上 add eax edx只是将
  • 在 NASM 中使用 istruc 时:“警告:尝试初始化 BSS 部分‘.bss’中的内存:忽略 [-w+other]”

    在搜索这个错误时我发现this https stackoverflow com questions 65731514 nasm attempt to initialize memory in bss section 77001709问题 但
  • x86 实模式下的段大小

    我对实模式下段的大小有一个疑问 因为它们不能超过 64K 但可以小于那个 http support microsoft com kb 120069 我的问题是这些段大小和基地址是如何初始化的 就像保护模式下有 GDT 和 LDT 一样 实模
  • 如何查看JVM中JIT编译的代码?

    有什么方法可以查看 JVM 中 JIT 生成的本机代码吗 一般用法 正如其他答案所解释的 您可以使用以下 JVM 选项运行 XX UnlockDiagnosticVMOptions XX PrintAssembly 根据特定方法进行过滤 您
  • 现代 x86 硬件不能将单个字节存储到内存中吗?

    说到 C 的并发内存模型 Stroustrup 的C 编程语言 第 4 版 第 1 节 41 2 1 说 就像大多数现代硬件一样 机器无法加载或存储小于单词的任何内容 然而 我的 x86 处理器已经有几年的历史了 它可以并且确实存储小于单词
  • g++ 内联汇编括号中不匹配

    g 向我抱怨以下代码中缺少括号 1 2 3 v v v asm volatile inb 1 0 a result Nd portnumber 1 2 3 正如您所看到的 括号是匹配
  • 我试图在 AAM 指令之后使用 AX 中存储的值将其除以 2,为什么它不适用于 2 位数字输出?

    英语不是我的母语 请原谅输入错误 我将在此处显示的代码是一项作业 我真的需要了解发生了什么事 我在 DosBox 0 74 和 TASM 汇编器中使用 Intel 8086 语法 当我必须除以 2 时 代码的问题在于三角形的面积 注意 程序
  • 跨 AVX 通道的最佳方式是什么?

    有些问题具有类似的标题 但我的问题涉及其他地方未涵盖的一个非常具体的用例 我有 4 个 128d 寄存器 x0 x1 x2 x3 我想将它们的内容重新组合在 5 个 256d 寄存器 y0 y1 y2 y3 y4 中 以准备其他计算 on
  • arm-thumb指令集的blx指令如何支持4MB范围

    读自https www keil com support man docs armasm armasm dom1361289866046 htm https www keil com support man docs armasm arma

随机推荐

  • Qt 错误:无法打开输出文件调试

    今天我在调试你的程序时 突然因为停电 我的电脑异常关机 现在 当我编译该程序时 它给了我两个错误 1 error cannot open output file debug Myprogram exe Invalid argument 1
  • 艰难地学习 Python:练习 46

    我在设置项目框架时遇到问题 因为现在指南要求我仅使用 Linux 命令 而我使用的是 Windows 整个指南直到该项目与 Windows 没有兼容性问题 直到练习 46 中的一行代码为止 我能够做到这一点 mkdir p projects
  • 如何在Play Framework中手动抛出错误页面?

    如何手动抛出404 or 500Play 框架 1 2 x 中出现错误 我目前正在渲染404 html and 500 html模板使用renderTemplate 方法 但我该如何以正确的方式做到这一点呢 Play Controller
  • Eclipse CDT 索引器是否仅限于源和标头的常见文件类型?

    我正在开发一个涉及 TOM 文件 t 扩展名 的项目 这些文件被编译成 c 文件 现在 我已经告诉我的 Eclipse 将它们视为 C 源文件 但 CDT 索引器似乎不想触及它们 是否可以告诉它考虑其他文件类型 注意 TOM 文件看起来就像
  • 绘制两个不同长度的列表

    我有两个价格不同的清单 第一个列表是 2008 2018 年 第二个列表是 2010 2018 年 如果 X 轴为 2008 年至 2018 年 第二个列表从 2010 年开始 我如何绘制它们 我有以下作为简短代码的示例 from matp
  • 如何在 Spring MVC (JPA) 中将实体对象列表转换为页面对象?

    我有一个List的实体 我如何将其转换为Page使用 Spring MVC 4 和 Spring Data JPA 的对象 有一个Page执行 http docs spring io spring data commons docs cur
  • 导航控制器后退按钮可转到上一屏幕之前的屏幕

    我想知道是否可以使用导航控制器按钮返回到上一页 现在 我已经使用此代码定制了按钮 self navigationItem leftBarButtonItem UIBarButtonItem alloc initWithTitle mainL
  • 如何在 R 中将度分秒转换为十进制?

    我有这个数据框 Lat Long 59 44 50 151 45 11 59 49 28 154 52 56 59 46 42 150 45 15 如何将其转换为十进制列 纬度的单位为 dd mm ss 长的单位为 ddd mm ss 我在
  • 如何使用 JSONata 将嵌套对象展平为单深度对象?

    我是 JSONata 新手 在创建展平函数时遇到一些麻烦 我想把这个输入 user key value map CreatedDate 123424 Department Name XYZ 进入这个 user key value map C
  • 在 OpenCV 中使用 FindExtrinsicCameraParams2

    我在对象坐标和相应的图像点 在图像平面上 中有 4 个共面点 我想计算物平面相对于相机的相对平移和旋转 FindExtrinsicCameraParams2 应该是解决方案 但我在使用它时遇到了麻烦 编译时不断出现错误 有人在OpenCV中
  • 显示 WordPress 中最新的搜索词

    有没有办法显示我网站上最近完成的搜索词 我想显示访问者最近执行的 3 5 个搜索词 以便鼓励其他用户也搜索某些内容 Edit 在这种情况下 如果有人搜索新内容 刷新页面可能会显示一组新的搜索词 我确信至少有一些插件可以帮助您解决此问题 我会
  • ngx-bootstrap 日期选择器不起作用

    我正在学习 Angular2 和 Bootstrap4 我的公司使用以下网站 http valor software com ngx bootstrap datepicker http valor software com ngx boot
  • Blazor - Web 程序集加载时间

    我开发了 Blazor Server 服务器应用程序 客户显然不喜欢 无法重新连接到服务器 重新加载页面以恢复功能 的消息 这就是我尝试探索迁移到 Web Assembly 的原因 我正在努力 如何加快 Web 程序集加载时间 因为主页无法
  • C++ 预处理器输出中的 是什么?

    Summary C 预处理器输出包括一些行
  • 将固定宽度文本文件导入sqlite

    将固定宽度文本文件导入到 sqlite 表中 最好不使用外围软件 的好方法是什么 例如 指定每个字段的宽度 Field 1 10 characters starting with the second character Field 2 5
  • 如何在C#中调用需要证书的Web服务?

    我需要与具有以下权限的第三方进行通信 asmx网络服务 此 Web 服务使用 https 我有所需的证书 pfx 第一次尝试使用添加此服务时Add Service Reference在 Visual Studio 中 我收到错误 我通过将证
  • 禁用标准。 Python 沙箱实现中的文件 I/O 和文件 I/O

    我正在尝试设置 Python 沙箱并希望禁止访问标准和文件 I O 我正在运行的 Python 服务器内运行沙箱 我已经看过类似的模块RestrictedPython and PyPy 但是 我希望能够在正在运行的 Python 服务器内部
  • 当对象属性不存在时引发错误

    别名标题 对象属性的严格模式 我正在开发一个错误管理器 我希望它非常严格 假设您正在调用一个不存在的属性 这通常被解释为未定义 相反 它应该抛出一个错误 例如 var obj obj PI throw Error instead of un
  • Brew doctor:dyld:库未加载&错误:zlib 没有可用的公式

    When I brew doctor我收到以下错误 dyld Library not loaded usr lib libltdl 7 dylib Referenced from usr local bin php Reason image
  • 为什么我有 PUSH ecx?

    有人可以告诉我这两个的目的是什么吗push ecx下面的说明 我不明白他们到底要做什么 我意识到push epb正在保存堆栈基指针 然后mov epb esp正在将堆栈指针分配给前一个堆栈基指针 int main 01301190 push