测试你的C语言功底?
2008-03-16 18:59
148 查看
如何在下面的test函数里加入代码可以使程序运行起来输入和输出的相等?
(环境是vc6Debug方式下)
#include<stdio.h>
void test()
{
int t;
scanf("%d",&t);
在这里加入代码
}
main()
{
int m;
test();
printf("m=%d",m);
}
例题一解答
这一题需要去了解在函数体中栈内存的分配情况。
#include<stdio.h>
void test()
{
//当程序流程进入test函数入口的时候也会对变量作一些寄存器的保护和预留空间
// push ebp
// mov ebp,esp
// sub esp,48h
// push ebx
// push esi
// push edi
// lea edi,[ebp-48h]
// mov ecx,12h
// mov eax,0CCCCCCCCh
// rep stos dword ptr [edi]
// 预留了0x12*sizeof(DWORD)个字节空间
// 变量t的地址为ebp-4
int t;
scanf("%d",&t);//?请在以下添加代码,使用main函数中的变量m输出值等test函数中的变量t;
//计算变量t在内存中的位置和上一层函数中变量m在内存中位置的差
//先写到这一句用反汇编看一下
//变量t和m都在预留空间的最下端(堆栈是向上长的,变量是按定义先后也是从下向上放的)
//push edi(main)...............................0x1
//push esi(main)...............................0x2
//push ebx(main)...............................0x3
//push ebp(自己)...............................0x4
//返回地址............................................0x5
//0x10*sizeof(DWORD)的空间............................0x15
//空间最下面的DWORD字节存放变量m......................0x16
//我们把t向下偏移0x16的位置(存放着变量m)上把t的内容写进去即可。
//也可以看一下OD里图:
*( &t + 0x16) = t;
//这样整型指针pos就指到了变量m我们把t的值直接赋给*p(就是m)即可
a3a0
。
}
int main()
{
//当程序进入main函数的时候,会对一些局部变量作一些预留空间
// push ebp
// mov ebp,esp
// sub esp,44h
// push ebx
// push esi
// push edi
// lea edi,[ebp-44h]
// mov ecx,11h
// mov eax,0CCCCCCCCh
// rep stos dword ptr [edi]
// 预留了0x11*sizeof(DWORD)个字节空间
// m的变量地址是ebp-4
int m;
test();
printf("m=%d",m);
return 0;
}
转自:http://www.51asm.com/LessonQuest1.html
(环境是vc6Debug方式下)
#include<stdio.h>
void test()
{
int t;
scanf("%d",&t);
在这里加入代码
}
main()
{
int m;
test();
printf("m=%d",m);
}
例题一解答
这一题需要去了解在函数体中栈内存的分配情况。
#include<stdio.h>
void test()
{
//当程序流程进入test函数入口的时候也会对变量作一些寄存器的保护和预留空间
// push ebp
// mov ebp,esp
// sub esp,48h
// push ebx
// push esi
// push edi
// lea edi,[ebp-48h]
// mov ecx,12h
// mov eax,0CCCCCCCCh
// rep stos dword ptr [edi]
// 预留了0x12*sizeof(DWORD)个字节空间
// 变量t的地址为ebp-4
int t;
scanf("%d",&t);//?请在以下添加代码,使用main函数中的变量m输出值等test函数中的变量t;
//计算变量t在内存中的位置和上一层函数中变量m在内存中位置的差
//先写到这一句用反汇编看一下
//变量t和m都在预留空间的最下端(堆栈是向上长的,变量是按定义先后也是从下向上放的)
//push edi(main)...............................0x1
//push esi(main)...............................0x2
//push ebx(main)...............................0x3
//push ebp(自己)...............................0x4
//返回地址............................................0x5
//0x10*sizeof(DWORD)的空间............................0x15
//空间最下面的DWORD字节存放变量m......................0x16
//我们把t向下偏移0x16的位置(存放着变量m)上把t的内容写进去即可。
//也可以看一下OD里图:
*( &t + 0x16) = t;
//这样整型指针pos就指到了变量m我们把t的值直接赋给*p(就是m)即可
a3a0
。
}
int main()
{
//当程序进入main函数的时候,会对一些局部变量作一些预留空间
// push ebp
// mov ebp,esp
// sub esp,44h
// push ebx
// push esi
// push edi
// lea edi,[ebp-44h]
// mov ecx,11h
// mov eax,0CCCCCCCCh
// rep stos dword ptr [edi]
// 预留了0x11*sizeof(DWORD)个字节空间
// m的变量地址是ebp-4
int m;
test();
printf("m=%d",m);
return 0;
}
转自:http://www.51asm.com/LessonQuest1.html
相关文章推荐
- ZZ测试你的C语言功底?
- 推荐几道C语言笔试题,测试你的C语言功底
- 绝对能够测试你的C语言功力的几个问题!
- Big-Endian和Little-Endian的判断,以及我写的C语言测试程序
- C语言测试:想成为嵌入式程序员应知道的0x10个基本问题
- 一个C语言解析ini文件的测试
- C语言测试一个函数运行时间的模板
- C语言测试
- 一套帮助你理解C语言的测试题
- 一个关于C语言指针的测试
- [收藏]C语言测试:想成为嵌入式程序员应知道的0x10个基本问题
- 测试一下你的C语言水平
- [FWD]有趣的C语言问题 测试你对C语言的熟悉程度
- C语言字符串库函数的实现也是笔试题常考的题目,以下代码没有严格测试,只是简单的实现:
- C语言测试大小端的两种正确方法
- Linux下C语言&_测试位
- C语言编程小测试。输出1-100内的所有素数。
- C语言测试 IP port 是否可达
- C语言:打印图形练习测试
- 测试C语言中变参函数