当前位置: 首页 > 知识库问答 >
问题:

了解汇编中的C程序

施令雪
2023-03-14

我试图理解这个简单的C程序:

int square(int num) {
    return num * num; 
}

当它在汇编代码中时:

square(int): 
  push rbp ;push rbp register onto stack
  mov rbp, rsp ;move contents of rbp register into rsp register 
  mov DWORD PTR [rbp-4], edi ;not sure what happens here 
  mov eax, DWORD PTR [rbp-4] ;not sure what happens here
  imul eax, DWORD PTR [rbp-4] ;multiply eax and DWORD PTR [rbp-4] (?)
  pop rbp ;pop original register out of stack
  ret ;return 
  1. 第三线和第四线发生了什么
  2. 为什么必须使用另外两个寄存器(edi和eax)来代替rsp
  3. DWORD PTR[rbp-4]实际发生了什么

共有1个答案

有睿
2023-03-14
mov DWORD PTR [rbp-4], edi ;not sure what happens here

系统 V ABI x86_64通过寄存器传递函数参数 - 第一个整数参数在 rdi/edi 寄存器中传递。因此,此行将参数 num 复制到本地(与存储在 rbp 中的帧指针值的偏移量 -4 字节)。

mov eax, DWORD PTR [rbp-4] ;not sure what happens here

这会将本地的值复制到 eax 寄存器。

imul eax, DWORD PTR [rbp-4] ;multiply eax and DWORD PTR [rbp-4] (?)

这会将 eax 中的值乘以本地值,并将结果存储到 eax(eax 也恰好是存储函数返回值的寄存器)。

正如其他人在评论中指出的,使用优化进行编译可能会消除局部变量,并直接从< code>edi写入< code>eax。

 类似资料:
  • 问题内容: 如何做到这一点? 如果我想分析某些东西是如何编译的,我将如何获取发出的汇编代码? 问题答案: 使用该选项来gcc(或g ++)。 这将在helloworld.c上运行预处理器(cpp),执行初始编译,然后在运行汇编器之前停止。 默认情况下,这将输出一个文件。仍可以使用该选项设置输出文件。 当然,这只有在您拥有原始来源的情况下才有效。如果仅具有结果对象文件,则可以通过设置选项(或-d缩写

  • 让我们有一个名为myClass的小类。我很感兴趣的是,当方法内联或不内联时,如何看待. ash的差异。我制作了两个程序,在cpp文件中带有和不带有内联关键字,但. ash的输出是相同的。我知道内联只是编译器的提示,很有可能我是优化的受害者,但有可能在一个小的cpp示例中看到内联和非内联方法的差异吗? h: cpp: 主要: 附注: 两种情况下的ASM输出:

  • 12.2 C语言程序的汇编输出 在Turbo C++或Borland C++编程环境下,我们可TCC或BCC行命令把一个C语言的源程序转换成汇编语言的源程序。通过阅读汇编语言程序可以很准确地知道C语言语句的功能是如何实现的,这样,可为将来学习《编译原理》课程中的"寄存器调度"和"代码生成"等相关知识打下良好的基础。 C语言源程序转换的命令格式如下: TCC -S t1.cpp 或 BCC -S t

  • 汇编语言是用于特定于特定计算机体系结构的计算机或其他可编程设备的低级编程语言,与大多数高级编程语言相反,后者通常可跨多个系统移植。

  • 5. C内联汇编 用C写程序比直接用汇编写程序更简洁,可读性更好,但效率可能不如汇编程序,因为C程序毕竟要经由编译器生成汇编代码,尽管现代编译器的优化已经做得很好了,但还是不如手写的汇编代码。另外,有些平台相关的指令必须手写,在C语言中没有等价的语法,因为C语言的语法和概念是对各种平台的抽象,而各种平台特有的一些东西就不会在C语言中出现了,例如x86是端口I/O,而C语言就没有这个概念,所以in/

  • 本文向大家介绍了解元编程吗?说说你对ES6中的元编程的理解相关面试题,主要包含被问及了解元编程吗?说说你对ES6中的元编程的理解时的应答技巧和注意事项,需要的朋友参考一下 了解元编程吗?说说你对ES6中的元编程的理解 作者:水木子