c++与汇编

转载 2013年12月01日 10:05:04

分析.cpp文件编译生成的汇编文件里语句的作用

1
2
3
4
int main(int argc, char** argv)
{
return 1;
}
1
g++ -S test.cpp

生成test.s汇编文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  .file "null-test.cpp"
  .text
  .globl    main
  .type main, @function
main:
.LFB0:
  .cfi_startproc     pushq  %rbp
  .cfi_def_cfa_offset 16
  .cfi_offset 6, -16
  movq  %rsp, %rbp
  .cfi_def_cfa_register 6
  movl  %edi, -4(%rbp)
  movq  %rsi, -16(%rbp)
  movl  $1, %eax
  popq  %rbp
  .cfi_def_cfa 7, 8     ret
  .cfi_endproc   //在函数结束的时候使用与.cfi_startproc相配套使用
.LFE0:
  .size main, .-main
  .ident    "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
  .section  .note.GNU-stack,"",@progbits

  看到上面有一些语句如

cfi_def_cfa  cfi_endproc  cfi_startproc的命令,这些前面都有个关键字cfi  它是Call Frame infromation的意思。

                                      查看堆栈的信息

Call stack layout.svg

CFA是什么意思就不太清楚了 可能是control flow analysis的意思吧?

.cfi_startproc   用在每个函数的开始,用于初始化一些内部数据结构
.cfi_endproc   在函数结束的时候使用与.cfi_startproc相配套使用
.cfi_def_cfa_offset 16
1
2
.cfi_def_cfa_offset offset
.cfi_def_cfa_offset modifies a rule for computing CFA. Register remains the same, but offset is new. Note that it is the absolute offset that will be added to a defined register to compute CFA address.

.cfi_def_cfa 7, 8

 
  
1
2
.cfi_def_cfa register, offset    
.cfi_def_cfa defines a rule for computing CFA as: take address from register and add offset to it.

.cfi_def_cfa_register 6

1
2
.cfi_def_cfa_register register
.cfi_def_cfa_register modifies a rule for computing CFA. From now on register will be used instead of the old one. Offset remains the same.
 

.cfi_offset 6, -16

1
2
3
.cfi_offset register, offset
 
Previous value of register is saved at offset offset from CFA.

.cfi_startproc 和 .cfi_endproc 分别是 dwarf2 CFI 的初始过程和结束过程指令,它们隐藏了一些 CFI 有关的操作。ret 是从当前过程中返回的指令。这就是一个最简单的 main 函数内部的三个步骤:CFI 初始操作 – 返回 – CFI 结束操作。由于第一个和最后一个步骤永远伴随着函数,我们大可将注意力集中在这两个步骤之间的代码,也就是 main 函数的实际内容。eax 是一个通用的寄存器,根据 cdesl 调用约定(即 C 语言调用约定),在函数返回时,返回值必须保存在 eax 寄存器中,交给调用者处理。

 

rbp寄存器 是ebp寄存器64位扩展,ebp寄存器扩展基址指针寄存器(extended base pointer)  其内存放一个指针,该指针指向系统栈最上面一个栈帧的底部。BP

为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据,它的作用是在调用函数时保存ESP使函数结束时可以正确返回;加E(enhance)代表增强型寄存器,用于32位数据处理。
 

EAX也是一种32位通用寄存器。 EAX寄存器称为累加器,AX寄存器是算术运算的主要寄存器,所有的输入、输出只使用AL或AX人作为数据寄存器。在80386及其以上的微处理器中,EAX寄存器可以用来存储单元偏移地址

将数据33221100H传送到EAX寄存器的指令

EAX可称为数据寄存器,你除了直接访问外,还可分别对其高十六位和低十六位进行访问。它们的低十六位就是把它们前边儿的E去掉,即EAX的低十六位就是AX。而且它们的低十六位又可以分别进行八位访问,也就是说,AX还可以再进行分解,即AX还可分为AH(高八位)AL(低八位)。

 

.file, .text, etc are assembler directives.

.LFB0, .LFE0 are local labels, which are normally used as branch destinations within a function.

深入理解汇编语言和c++语言(1)---从a+b说起

最近突然对c语言,以及c语言如何转换到汇编语言特别的感兴趣,于是写了这个系列,首先让我们看一个小程序: #include using namespace std; int main(){ in...
  • yncxcw123
  • yncxcw123
  • 2016年05月08日 13:42
  • 513

C++ && 汇编

C++是一种面向对象的高级语言,但是由于其基于C语言发展而来,因此其内在原理和C语言如出一辙,于是就来看看C++程序翻译成汇编代码是啥样的(在x86 linux环境下,使用g++ 翻译得到的结果),采...
  • u011907342
  • u011907342
  • 2015年07月04日 13:21
  • 1427

用汇编分析C++程序

一、   引用 “引用”是C++中引入的重要概念之一。指针的不安全使人们对它诟病颇多,C++引用机制恰如其分的解决了这一问题。在C++语法上,引用和指针是不同的,但在内部实现机制上,它们是完全相同的...
  • zang141588761
  • zang141588761
  • 2017年01月18日 15:07
  • 331

C++ 内嵌汇编 实现 加法操作

程序体现了怎么在C++的代码中进行汇编程序开发 #include #include void asmFunc(int* pAddress); void main() { int *pAdd...
  • sakawa_x
  • sakawa_x
  • 2014年12月29日 15:07
  • 1080

C与汇编混合编程(1)

一个C与汇编混写的小例子
  • chen_tr
  • chen_tr
  • 2016年03月19日 23:31
  • 2421

郁金香汇编逆向与外挂(60)

郁金香外挂学习 工具 CE、代码注入器 60  游戏CALL 1、用CE打开扫雷运行两次。 在地址 01003E4C处输入跟随表达式 MessageBoxA 找到地址77D50838 观察到其有4个参...
  • qq314777895
  • qq314777895
  • 2015年05月14日 12:33
  • 659

如何在Visual C++中使用汇编语言

 如何在Visual C++中使用汇编语言           今天,可能大多数的程序员都会对汇编语言怀有戒心,认为它是一种非常难理解及使用的语言,要么就认为它是老掉牙了,早就应该被更高级的语言取代。...
  • xieqidong
  • xieqidong
  • 2008年06月08日 18:37
  • 5038

内嵌汇编简介(在C++中嵌入汇编语句)

为了加速游戏,一提起汇编语言,大家也许会感到很神秘。其实如果你学起来就会发现,它并非想象中那样难。特别是内嵌汇编,由于它和C++紧密结合,使你不必考虑很多烦琐的细节(例如输入输出函数的写法),学习起来...
  • gxj1680
  • gxj1680
  • 2009年05月21日 10:49
  • 8523

从反汇编看C++(一)

汇编比C++更接近于机器语言
  • Carry_Fly
  • Carry_Fly
  • 2014年10月16日 22:33
  • 944

汇编和C++函数互调

新建ASM文件 MyAsm.asm,内容如下 .386 .model flat,stdcall CppFunc PROTO .DATA text db 'Hello' .CODE AsmFun...
  • yjz1409276
  • yjz1409276
  • 2014年03月31日 22:40
  • 1070
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++与汇编
举报原因:
原因补充:

(最多只允许输入30个字)