首页
社区
课程
招聘
某公司笔试题目 求助
发表于: 2010-1-11 09:27 71143

某公司笔试题目 求助

2010-1-11 09:27
71143
收藏
免费 0
支持
分享
最新回复 (131)
雪    币: 48
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
126
#pragma comment(linker, "/entry:print")
#pragma comment(lib, "msvcrt.lib")
printf ("Who am I\n");

这样子就妥妥的了

上面那个大神的代码,我这里跑起来退出有点异常(win7sp1)

修改下:
void print()
{   
  #pragma comment(linker, "/entry:print")
  #pragma comment(linker, "/SECTION:.text,REW" )
  int mainCRTStartup();
  void main();
  __asm
  {
    MOV   EAX,  OFFSET main
    MOV   BYTE PTR[EAX], 0xB8  //MOV  EAX, 0x
    MOV   DWORD PTR[EAX+1], OFFSET SHOWSTRING
    MOV   WORD PTR[EAX+5], 0xE0FF // JMP  EAX
        mov eax, offset END
        mov byte ptr [eax], 0x90
        //pop ebp改成nop,调整堆栈,保持平衡
  }
  mainCRTStartup();
SHOWSTRING:
  printf ("i am MentalDease\n");
  getchar();
END:;
}
2014-8-1 22:37
0
雪    币: 48
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
127
原来是个坟贴...不过还是蛮有意思的
干脆再问个问题吧。
什么时候会链接crt0啊
mainCRTStartup中堆,全局变量,浮点数等等初始化是个什么意思
要是链接了msvcrt,好像malloc也能用
浮点数,全局变量什么滴,貌似都是妥妥的。这是个什么情况
求解释,谢
2014-8-1 22:51
0
雪    币: 81
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
128
真真假假
2014-8-2 10:56
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
129
能详细解释一下那四句代码吗,,
2014-8-2 23:14
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
130
能详细解释一下那四句代码吗,,
2014-8-2 23:15
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
131
学习了,牛啊
2014-8-3 09:34
0
雪    币: 17683
活跃值: (4671)
能力值: ( LV15,RANK:1878 )
在线值:
发帖
回帖
粉丝
132
楼主使用了getchar在过程中回避堆栈不平衡带来的异常问题,有人断章取义搬到群上说,却不知楼主意图,还抄漏了
以下是完整可编译测试程序,不存在堆栈平衡带来的异常问题,
如果去掉
  __asm {
    mov edi,edi
  }
可能会引起printf被覆盖导致循环入栈而进一步堆栈溢出
如果去掉
  __asm {
  ret
  }
会产生堆栈不平衡带来的异常。
===========================================
//m_test.c  by HighBor (hlaxinux@gmail.com) 2014-08-13 01:50
/* platform: win7; compiler infomation
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
*/
//To compile: cl m_test.c
//

void print() {
#pragma comment(linker,"/entry:print")
#pragma comment(linker,"/SECTION:.text,REW")
int mainCRTStartup();
void main();
__asm {
  mov eax,offset main
  mov BYTE PTR[eax],0xb8
  mov DWORD PTR[eax+1],OFFSET SHOWSTRING
  mov WORD PTR[eax+5],0xE0FF
}
mainCRTStartup();
SHOWSTRING:
  printf("hello world");
  __asm {
  ret
  }
}
void main() {
  __asm {
    mov edi,edi
  }
}
2014-8-13 01:52
0
游客
登录 | 注册 方可回帖
返回
//