*nux编程的108种奇淫巧计-5(rbp寄存器)
来源:互联网 发布:linux 根目录挂载 编辑:程序博客网 时间:2024/04/28 06:31
昨天在家浏览了纽约大学的一个课件,找到一个例子,很有趣,我稍微修改了一下,支持32位和64位环境:如下。
以后该系列采用这样的模式,首篇只贴代码,续篇进行解释和分析,期间希望读者朋友能自己做实验。
理解该代码就算对rbp,rsp寄存器以及一些调用有了直接的接触。
里面有两个奇怪的数字17和23,这是为什么呢?续篇给予解答。
编译方法:
64位环境:
g++ -g test.cpp -o test_64 //64位代码
g++ -g -m32 test.cpp -o test_32 //32位代码
32位环境:
g++ -g test.cpp -o test_32
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>
int done = 0;
int thread1( void )
{
printf( "Hello from thread1 /n" );
while ( !done );
printf( "/nThread1 is quitting/n" );
exit(0);
}
int thread2( void )
{
printf( "Hello from thread2 /n" );
while ( !done );
printf( "/nThread2 is quitting/n" );
exit(0);
}
int thread3( void )
{
printf( "Hello from thread3 /n" );
while ( !done );
printf( "/nThread3 is quitting/n" );
exit(0);
}
int thread4( void )
{
printf( "Hello from thread4 /n" );
while ( !done );
printf( "/nThread4 is quitting/n" );
exit(0);
}
typedef int (*THREAD)(void);
THREAD ready[] = { thread1, thread2, thread3, thread4 };
const int thread_count = sizeof( ready )/sizeof( THREAD );
int next_thread = 0; // array-index for 'ready' list
void upon_signal( int signum )
{
unsigned long *tos; // this is used for addressing the stack-frame
#if defined(__i386__)
asm(" movl %%ebp, %0 " : "=m" (tos) ); // initializes frame-pointer
tos[17] = (unsigned long)ready[ next_thread ];
#elif defined(__x86_64__)
asm(" mov %%rbp, %0 " : "=m" (tos) ); // initializes frame-pointer
tos[23] = (unsigned long)ready[ next_thread ];
#endif
// This was useful during development -- to display the stack elements
//for (int i = 0; i < 30; i++) printf( "before:tos[%d]=%16X /n", i, tos[i] );
next_thread = ( 1 + next_thread ) % thread_count; // "circular" array
if ( signum == SIGINT ) done = 1; // to terminate on <CONTROL>-C
}
int main( int argc, char **argv )
{
signal( SIGINT, upon_signal );
struct itimerval it;
it.it_value.tv_sec = 1;
it.it_value.tv_usec = 0;
it.it_interval.tv_sec = 0;
it.it_interval.tv_usec = 200000;
setitimer( ITIMER_REAL, &it, NULL );
signal( SIGALRM, upon_signal );
while ( !done );
printf( "/nQuitting/n" );
}
- *nux编程的108种奇淫巧计-5(rbp寄存器)
- *nux编程的108种奇淫巧计-6(shellcode)
- linux编程的108种奇淫巧计-2(RDTSC)
- linux编程的108种奇淫巧计-2(RDTSC)
- linux编程的108种奇淫巧计-8(嵌入汇编的另一种写法)
- linux编程的108种奇淫巧计-1(FALSE SHARING)
- linux编程的108种奇淫巧计-3(magic 2)
- linux编程的108种奇淫巧计-1(FALSE SHARING)【续】
- linux编程的108种奇淫巧计-4(编译展开)
- linux编程的108种奇淫巧计-4(编译展开)(续)
- linux编程的108种奇淫巧计-1(FALSE SHARING)
- linux编程的108种奇淫巧计-1(FALSE SHARING)【续】
- linux编程的108种奇淫巧计-3(magic 2)
- linux编程的108种奇淫巧计-4(编译展开)
- linux编程的108种奇淫巧计-4(编译展开)(续)
- linux编程的108种奇淫巧计-4(编译展开)
- linux编程的108种奇淫巧计-7(Lock-free实验)
- linux编程的108种奇淫巧计-7(Lock-free实验)【答网友问】
- Flash 平台技术的优化(六) 计时器与 ENTER_FRAME 事件
- 不用除法和求模运算,判断一个数能否被3整除
- Key-Value配置信息类(.ini文件信息管理类)的设计与实现
- 两个数据库间拷贝表和数据 -oracle
- css 背景的妙用
- *nux编程的108种奇淫巧计-5(rbp寄存器)
- VS2005 C++ 调用C# DLL
- SPFA + 静态邻接表 模板
- Ubuntu下tftp的安装
- Web Service应用
- Linux 内核对浮点数的支持
- QML 3D Demo
- JMP数据深入分析
- excel文件转换成xml文件