能力值:
( LV6,RANK:80 )
|
-
-
2 楼
[QUOTE=jstwjw;915963]char *s;
_asm{
push esi
push eax
mov esi,[0x0DA3604]
mov eax,[0x0DA3600]
//mov eax,[eax+esi*8] <----这句加进就出错
pop eax
pop es...[/QUOTE]
答案几乎是肯定的
|
能力值:
( LV3,RANK:20 )
|
-
-
3 楼
没用过C或者C++,不过听说C++里好像也有try-catch,或者在_asm语句块开始的时候pushad,语句块结束的时候popad,不知道行不行,
|
能力值:
( LV6,RANK:80 )
|
-
-
4 楼
他读7ABE620的地址 我看怎么都不大好使
|
能力值:
( LV3,RANK:20 )
|
-
-
5 楼
mov esi,[0x0DA3604] mov eax,[0x0DA3600]
不是都有括号吗,
|
能力值:
( LV3,RANK:20 )
|
-
-
6 楼
感觉或许是那个"*"符号的问题,后面能用乘号不?
楼主慢慢来,一个语句一个语句的写,嘿嘿,汇编不比高级语言呀,
|
能力值:
( LV6,RANK:80 )
|
-
-
7 楼
....内联这种括号没用的
|
能力值:
( LV15,RANK:670 )
|
-
-
8 楼
mov esi,[0x0DA3604]
mov eax,[0x0DA3600]
这两个地址是怎么来的?
你确定这两个地址可读/写吗?
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
已解决,2个原因
1.内联汇编的mov eax,[0x5fbbb4] 的就是 mov eax,0x5fbbb4
要从内存取数,改成
mov eax, 0x5fbbb4
mov eax, [eax]
2.我计算偏移地址出错,后面的地址指向无效址
下面是读内存数据的C语言版 和 汇编语言版
实现从[[[[[[005fbbb4]+0]+98]+10]+8*n]+0]中读取一个字符串
//第n条[[[[[[005fbbb4]+0]+98]+10]+8*n]+0]
int i;
int n=198;
char *s;
/////////////////////内存读取开始C语言
i=(int)*(int *)(0x5fbbb4);
i=(int)*(int *)(i+0);
i=(int)*(int *)(i+0x98);
i=(int)*(int *)(i+0x10);
i=(int)*(int *)(i+8*n);
//字符串类型
s=(char *)(i);
/////////////////////内存读取结束
this->m_list.AddString(s);
/////////////////////内存读取开始 内联汇编
_asm{
mov esi, 199
//mov eax, [0x5fbbb4]
mov eax, 0x5fbbb4
mov eax, [eax]
mov eax, [eax+0]
mov eax, [eax+0x98]
mov eax, [eax+0x10]
mov eax, [eax+8*esi]
mov s,eax
}
/////////////////////内存读取结束
this->m_list.AddString(s);
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
////C语言版编译后的代码
10001ACD |. C745 F4 C6000>MOV DWORD PTR SS:[EBP-C],0C6
10001AD4 |. A1 B4BB5F00 MOV EAX,DWORD PTR DS:[5FBBB4]
10001AD9 |. 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX
10001ADC |. 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8]
10001ADF |. 8B11 MOV EDX,DWORD PTR DS:[ECX]
10001AE1 |. 8955 F8 MOV DWORD PTR SS:[EBP-8],EDX
10001AE4 |. 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
10001AE7 |. 8B88 98000000 MOV ECX,DWORD PTR DS:[EAX+98]
10001AED |. 894D F8 MOV DWORD PTR SS:[EBP-8],ECX
10001AF0 |. 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8]
10001AF3 |. 8B42 10 MOV EAX,DWORD PTR DS:[EDX+10]
10001AF6 |. 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX
10001AF9 |. 8B4D F4 MOV ECX,DWORD PTR SS:[EBP-C]
10001AFC |. 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8]
10001AFF |. 8B04CA MOV EAX,DWORD PTR DS:[EDX+ECX*8]
10001B02 |. 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX
10001B05 |. 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8]
10001B08 |. 894D F0 MOV DWORD PTR SS:[EBP-10],ECX
10001B0B |. 8B55 F0 MOV EDX,DWORD PTR SS:[EBP-10]
10001B0E |. 52 PUSH EDX
10001B0F |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
10001B12 |. 83C1 60 ADD ECX,60
10001B15 |. E8 96030000 CALL ildll.?AddString@CListBox@@QAEHPBD@Z ; JMP 到 MFC42D.#1021
/////内联汇编汇编后的代码
10001B1A |. BE C7000000 MOV ESI,0C7
10001B1F |. B8 B4BB5F00 MOV EAX,5FBBB4
10001B24 |. 8B00 MOV EAX,DWORD PTR DS:[EAX]
10001B26 |. 8B00 MOV EAX,DWORD PTR DS:[EAX]
10001B28 |. 8B80 98000000 MOV EAX,DWORD PTR DS:[EAX+98]
10001B2E |. 8B40 10 MOV EAX,DWORD PTR DS:[EAX+10]
10001B31 |. 8B04F0 MOV EAX,DWORD PTR DS:[EAX+ESI*8]
10001B34 |. 8945 F0 MOV DWORD PTR SS:[EBP-10],EAX
10001B37 |. 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
10001B3A |. 50 PUSH EAX
10001B3B |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
10001B3E |. 83C1 60 ADD ECX,60
10001B41 |. E8 6A030000 CALL ildll.?AddString@CListBox@@QAEHPBD@Z ; JMP 到 MFC42D.#1021
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
学习了 ~~
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
mov eax,[eax+esi*8]
这个[eax+esi*8] 里没有值会报错的
|
能力值:
( LV2,RANK:10 )
|
-
-
13 楼
使用寄存器定义变量,再用Release编译后就是下面的代码,和用内联汇编的一样
定义寄存器变量加个前缀,如 register int i;
100014B1 |. A1 B4BB5F00 mov eax, dword ptr [5FBBB4]
100014BC |. 8B08 mov ecx, dword ptr [eax]
100014BE |. 8B91 98000000 mov edx, dword ptr [ecx+98]
100014C4 |. 8B8F 80000000 mov ecx, dword ptr [edi+80]
100014CA |. 8B42 10 mov eax, dword ptr [edx+10]
100014CD |. 8B80 30060000 mov eax, dword ptr [eax+630]
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
VC++6 试验了内联汇编几条语句
mov eax, dword ptr ds:[0x5fbbb4]
mov eax, ds:[0x5fbbb4]
编译后是:mov eax,[5fbbb4]
mov eax, dword ptr [0x5fbbb4]
mov eax, [0x5fbbb4]
mov eax, 0x5fbbb4
编译后是:mov eax,5fbbb4
所以要从内存读取,一定不能省了段前缀 ds:
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
学习了 还是高级语言方便啊
|