panic

objdump -Sdl

从  esp 知道栈顶指针,从panic堆栈知道里面的数据。

EBP: edxxxf90 ESP: edxxxf5c

EDX: 0000040f
ESI: 00000008
 
 
Stack:
00000082 00004000 0000d170 99214984 00000410 edc9fb74 992198f4 00000030
c173ab36 00000000 00000000 edcc8410 edcfaac0 edc9ffd4 c1298c23 ed06f350
780fd148 edc9ffb8 c1508b0a 00000001 edcc83c0 00004000 00000001 edc9ffc0

mov    -0x20(%ebp),%esi
movsbl (%esi,%edx,1),%eax
 
 

........ ---------- edxxxf90  (edxxxf90 - 0x20 = edxxxf70)
...
00000030

992198f4
edc9fb74 ---------- edxxxf5c + 0x14 = edxxxf70

00000410 

99214984

0000d170

00004000

00000082  ---------- edxxxf5c
=============================================================================
 558 struct fast_pool {
 559     __u32       pool[4];
 560     unsigned long   last;
 561     unsigned short  count;
 562     unsigned char   rotate;
 563     unsigned char   last_timer_intr;
 564 };
 
 
1587     unsigned    i = f->count;
1588      cce:   0f b7 70 14             movzwl 0x14(%eax),%esi -------%eax存的是 结构体的基地址,成员count 的偏移量为0x14

1589     unsigned    input_rotate = f->rotate;
1590      cd2:   0f b6 48 16             movzbl 0x16(%eax),%ecx
 
 
             lea    0x0(%esi,%eiz,1),%esi
 
 
1631         w = w ^ f->pool[i & 3] ^
1632      cf8:   89 f7                   mov    %esi,%edi 
1633             f->pool[(i + 1) & 3];
1634      cfa:   83 c6 01                add    $0x1,%esi
1635      cfd:   89 f2                   mov    %esi,%edx
1636     if (debug_random == 1) {
1637         BUG_ON(1);  
1638         debug_random = 0;
1639     }
1640 
1641         w = w ^ f->pool[i & 3] ^
1642      cff:   83 e7 03                and    $0x3,%edi
1643             f->pool[(i + 1) & 3];
1644      d02:   83 e2 03                and    $0x3,%edx
=============================================================================
5606 void add_interrupt_randomness(int irq, int irq_flags) 5607     1e4a:   8d 72 10                lea    0x10(%edx),%esi 5608     1e4d:   29 d0                   sub    %edx,%eax 5609     1e4f:   89 75 dc                mov    %esi,-0x24(%ebp) 5610     1e52:   89 45 e0                mov    %eax,-0x20(%ebp) 5611     1e55:   8d 76 00                lea    0x0(%esi),%esi 5613     __u32       w; 5614     unsigned    i = f->count; 5615     unsigned    input_rotate = f->rotate; 5616  5617     while (nbytes--) { 5618         w = rol32(*bytes++, input_rotate & 31) ^ f->pool[i & 3] ^ 5619     1e58:   8b 75 e0                mov    -0x20(%ebp),%esi -----所以  -0x20(%ebp) 就是%eax 5620     1e5b:   0f be 04 16             movsbl (%esi,%edx,1),%eax ----%edx 就是i 5621  5622     1e5f:   89 d6                   mov    %edx,%esi 5624             f->pool[(i + 1) & 3]; 5625     1e61:   83 c2 01                add    $0x1,%edx 5626     1e64:   89 d7                   mov    %edx,%edi 5627      
 
=============================================================================

  
  
  
  

32位汇编语言中lea指令!

2011-09-05 09:16 pan017  |  分类:汇编语言  |  浏览5034次
据说lea指令是取得源操作数的有效地址,这个有效地址是什么意思?是运行时内存编号吗?假设有个变量data DWORD 100H 那么执行  lea eax,data在编译时 转换成什么语句?如何做到的呀?
提问者采纳
2011-09-05 09:43
由编译器计算出data变量的地址,然后替换掉指令中出现data变量标识。
lea指令的源操作数就是一个变量标号,所以就是将变量的地址取出来,放到目的操作数中 
=====================================================================
比如:
		.data
hInstance		dd		?
                        .code
lea          eax,hInstance
======================================================================
编译后:
0040102D  |.  8D05 00304000 lea     eax, dword ptr [403000]
意思就是将[]中的值放入eax中,[]中出现的就是hInstance的内存地址
追问
我想问就是这个403000 在编译时期就能确定的吗?既然是偏移值为何这么大?
回答
标号地址会经过转换直接放在指令码中,这个是由编译器在编译的时候算出来。
追问
嗯我知道是算出来的,但是为何这个值如此大?我的程序毕竟只有几行大小。
回答
操作系统将一个exe文件复制到内存,都会给一个基地址,又叫模块句柄,一般都是400000,这是操作系统分配的,和8086不一样,这里面的内容很多,你看一下汇编的保护模式编程和windows程序设计就明白了
追问
哦,原来是有默认行为的啊,谢谢你的解答。但是这样的话,难道每个asm程序在编译时都分配了0x0040 0000基地址?这样的话操作系统怎么能同时运行两个ASM程序哇。。。
回答
80386还要对存放在存储器中的代码及数据的共享和保护提供支持。任务甲和任务乙并存,任务甲和任务乙必须隔离,以免相互影响。但它们又可能要共享部分代码和数据。所以,80386既要支持任务隔离,又要支持可共享代码和数据的共享,还要支持特权保护。
==========================================================
你看了保护模式就明白了,你可以留邮箱,资料我给你发过去
追问
实在万分感谢,让我明白不少东西  [email protected] 含泪跪求资料,望不吝赐教!

你可能感兴趣的:(panic)