一段简单程序从汇编看C指针
2012-03-29 18:05
218 查看
首先需要明白的两个概念:
指针:普通变量的地址
指针变量:该变量内存放的是指针
程序分析如下:
#include<stdio.h>
void main(){
int a,b;
a = 10;
b = 100;
int *pointa,*pointb; //声明 *只是表示指针类型 int表示只能指向长度为4字节的int类型
pointa = &a; //指针存放地址,&取地址
pointb = &b;
printf("%d,%d\n",a,b);
printf("%d,%d\n",*pointa,*pointb); // *表示去内容,和声明时*含义不同(注意区分)
}
@ILT+0(_main):
00401005 jmp main (00401010) //main作为跳转首地址
0040100A int 3 //类型3(专用:断点中断)中断 机器码0cch 是留给调试工具使用的中断
0040100B int 3
0040100C int 3
0040100D int 3
0040100E int 3
0040100F int 3
--- C:\point.cpp -----------------------------------------------------------------------------------------------------------------
1: #include<stdio.h>
2:
3: void main(){ //调用main 保存原寄存器内容 入栈操作
00401010 push ebp
00401011 mov ebp,esp
00401013 sub esp,50h
00401016 push ebx
00401017 push esi
00401018 push edi
00401019 lea edi,[ebp-50h]
0040101C mov ecx,14h
00401021 mov eax,0CCCCCCCCh
00401026 rep stos dword ptr [edi]
4: int a,b;
5: a = 10;
00401028 mov dword ptr [ebp-4],0Ah //局部变量在不同环境下存放不同内存(即可马上销毁) 入栈ss
6: b = 100;
0040102F mov dword ptr [ebp-8],64h
7: int *pointa,*pointb;
8: pointa = &a;
00401036 lea eax,[ebp-4] //取局部变量a的偏移地址给eax(int 4字节)
00401039 mov dword ptr [ebp-0Ch],eax
9: pointb = &b;
0040103C lea ecx,[ebp-8]
0040103F mov dword ptr [ebp-10h],ecx
10: printf("%d,%d\n",a,b);
00401042 mov edx,dword ptr [ebp-8] //从右到左依此入栈
00401045 push edx
00401046 mov eax,dword ptr [ebp-4]
00401049 push eax
0040104A push offset string "%d,%d\n" (0042201c)
0040104F call printf (004010a0) //系统调用 004010a0和下面系统调用统一操作
00401054 add esp,0Ch
11: printf("%d,%d\n",*pointa,*pointb);
00401057 mov ecx,dword ptr [ebp-10h] //取地址 给ecx
0040105A mov edx,dword ptr [ecx] //取值 ecx存在要取的值的地址
0040105C push edx
0040105D mov eax,dword ptr [ebp-0Ch]
00401060 mov ecx,dword ptr [eax]
00401062 push ecx
00401063 push offset string "%d,%d\n" (0042201c)
00401068 call printf (004010a0)
0040106D add esp,0Ch
12: }
00401070 pop edi //恢复现场
00401071 pop esi
00401072 pop ebx
00401073 add esp,50h
00401076 cmp ebp,esp
00401078 call __chkesp (00401120)
0040107D mov esp,ebp
0040107F pop ebp
00401080 ret
指针:普通变量的地址
指针变量:该变量内存放的是指针
程序分析如下:
#include<stdio.h>
void main(){
int a,b;
a = 10;
b = 100;
int *pointa,*pointb; //声明 *只是表示指针类型 int表示只能指向长度为4字节的int类型
pointa = &a; //指针存放地址,&取地址
pointb = &b;
printf("%d,%d\n",a,b);
printf("%d,%d\n",*pointa,*pointb); // *表示去内容,和声明时*含义不同(注意区分)
}
@ILT+0(_main):
00401005 jmp main (00401010) //main作为跳转首地址
0040100A int 3 //类型3(专用:断点中断)中断 机器码0cch 是留给调试工具使用的中断
0040100B int 3
0040100C int 3
0040100D int 3
0040100E int 3
0040100F int 3
--- C:\point.cpp -----------------------------------------------------------------------------------------------------------------
1: #include<stdio.h>
2:
3: void main(){ //调用main 保存原寄存器内容 入栈操作
00401010 push ebp
00401011 mov ebp,esp
00401013 sub esp,50h
00401016 push ebx
00401017 push esi
00401018 push edi
00401019 lea edi,[ebp-50h]
0040101C mov ecx,14h
00401021 mov eax,0CCCCCCCCh
00401026 rep stos dword ptr [edi]
4: int a,b;
5: a = 10;
00401028 mov dword ptr [ebp-4],0Ah //局部变量在不同环境下存放不同内存(即可马上销毁) 入栈ss
6: b = 100;
0040102F mov dword ptr [ebp-8],64h
7: int *pointa,*pointb;
8: pointa = &a;
00401036 lea eax,[ebp-4] //取局部变量a的偏移地址给eax(int 4字节)
00401039 mov dword ptr [ebp-0Ch],eax
9: pointb = &b;
0040103C lea ecx,[ebp-8]
0040103F mov dword ptr [ebp-10h],ecx
10: printf("%d,%d\n",a,b);
00401042 mov edx,dword ptr [ebp-8] //从右到左依此入栈
00401045 push edx
00401046 mov eax,dword ptr [ebp-4]
00401049 push eax
0040104A push offset string "%d,%d\n" (0042201c)
0040104F call printf (004010a0) //系统调用 004010a0和下面系统调用统一操作
00401054 add esp,0Ch
11: printf("%d,%d\n",*pointa,*pointb);
00401057 mov ecx,dword ptr [ebp-10h] //取地址 给ecx
0040105A mov edx,dword ptr [ecx] //取值 ecx存在要取的值的地址
0040105C push edx
0040105D mov eax,dword ptr [ebp-0Ch]
00401060 mov ecx,dword ptr [eax]
00401062 push ecx
00401063 push offset string "%d,%d\n" (0042201c)
00401068 call printf (004010a0)
0040106D add esp,0Ch
12: }
00401070 pop edi //恢复现场
00401071 pop esi
00401072 pop ebx
00401073 add esp,50h
00401076 cmp ebp,esp
00401078 call __chkesp (00401120)
0040107D mov esp,ebp
0040107F pop ebp
00401080 ret
相关文章推荐
- 一段简单c程序的汇编语言学习(ubuntu+x86)
- 一段简单c程序的汇编语言学习(ubuntu+x86)
- 一段简单的汇编程序,显示键盘按健的扫描码和ASCII码
- 一段简单c程序的汇编语言学习(ubuntu+x86)
- C++反汇编揭秘1 – 一个简单C++程序反汇编解析 (Rev. 3)
- 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 一段程序显示你对指针,数据结构定义的了解的程度
- 一个用delphi写的整合汇编与api的简单的窗口程序
- 实验--反汇编一个简单的C程序(李鹏举)
- 1_简单的C程序反汇编及分析
- 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 反汇编一个简单的C程序
- 反汇编入门试手 简单程序
- C++反汇编揭秘1 – 一个简单C++程序反汇编解析 (Rev. 3)
- 用MASM写一个简单的实现递归操作的汇编程序,所谓递归,上课已经跟大家说清楚了,如果我们只考虑简单的只分一次的递
- C++反汇编揭秘1 – 一个简单C++程序反汇编解析 (Rev. 3)
- 一个简单的C语言的汇编程序
- linux内核分析作业:以一简单C程序为例,分析汇编代码理解计算机如何工作
- Linux下最简单的汇编程序