能力值:
( LV8,RANK:130 )
|
-
-
2 楼
自己狠狠顶一下
|
能力值:
( LV6,RANK:90 )
|
-
-
3 楼
printf("%I64d %s", i ,"hello");
|
能力值:
( LV8,RANK:130 )
|
-
-
4 楼
楼上是一种解决方法,但不是我想问的,楼下继续
|
能力值:
( LV6,RANK:90 )
|
-
-
5 楼
__int64 i = 0xffffffffff;
的时候你看他传了几个参数给printf
00401028 |. C745 F8 FFFFFFFF mov [local.2],-1 0040102F |. C745 FC FF000000 mov [local.1],0FF ;以上2句 i = 0xffffffffff 00401036 |. 68 24004200 push 12313213.00420024 ; ASCII "hello" 0040103B |. 8B45 FC mov eax,[local.1] 0040103E |. 50 push eax ; /<%s> 0040103F |. 8B4D F8 mov ecx,[local.2] ; | 00401042 |. 51 push ecx ; |<%d> 00401043 |. 68 840F4200 push 12313213.00420F84 ; |format = "%d %s" 00401048 |. E8 33000000 call 12313213.printf ; \printf
你要是
__int64 i = 0xffffffffff;
printf("%d%d %s", i ,"hello");
这样也不会异常
|
能力值:
( LV8,RANK:130 )
|
-
-
6 楼
问题是出在printf的内部,外面push的次数都是一样的,没有明白楼上想表达什么?请指点
|
能力值:
( LV6,RANK:90 )
|
-
-
7 楼
int i=1;
printf('%d',i, i);
如果这样为什么出错你理解了,那上面也这个意思。
|
能力值:
( LV6,RANK:90 )
|
-
-
8 楼
0040103B |. 8B45 FC mov eax,[local.1]
0040103E |. 50 push eax ; /<%s>
这个。eax值是0xff.正常时候是传的字串首地址,现在传了0xff,然后要去访问0xff内存地址上的东西,当然会异常了。
|
能力值:
( LV12,RANK:240 )
|
-
-
9 楼
http://bbs.pediy.com/showthread.php?t=38234&viewgoodnees=1&prefixid=
|
能力值:
( LV6,RANK:90 )
|
-
-
10 楼
去看MSDN中printf format specifications部分的内容,你的格式字段要和参数保持一致,这是个规定。把握不好会出错。
你给的%d字段在32位机中只能是4个字节,你又非要给它8个字去输出,多出来部分怎么办呢,直接给下一个参数吧,而字符串地址就由想要输出的"Hello"变成了前面8个字节的高32位(即为0xff),哪有字符串的地址为0xff呢,系统就直接给出的异常.
你可以用"%d %d %s"来验证64位整数下的输出情况,就晓得了。
|
能力值:
( LV8,RANK:130 )
|
-
-
11 楼
开始我也是这样理解的,事实上我通过google给出的解释也是这样的,4个字节的偏移造成的访问地址出错,但我的疑问是当我传
__int64 i = 0xffffffff; // 长度不超过4个字节就正常
的时候,反汇编代码如下:
00401036 push offset string "hello" (00423fe0) 0040103B mov eax,dword ptr [ebp-4] 0040103E push eax 0040103F mov ecx,dword ptr [ebp-8] 00401042 push ecx 00401043 push offset string "%d %s" (0042301c) 00401048 call printf (00401080) 0040104D add esp,10h
和传>4个字节的值压栈方式没什么区别?那么深一层次的说,问题到底是在哪里不一样了呢?我开始的怀疑是如果是传入<=4 byte的__int64也会当作4个字节来优化处理的,但反汇编代码不是这样的,所以我的疑惑还是没有解决
|
能力值:
( LV6,RANK:90 )
|
-
-
12 楼
那是因为你传的0,也就是NULL。相当于
format("%d %s", i的低4字节, NULL, "hello");
|
能力值:
( LV8,RANK:130 )
|
-
-
13 楼
了解了一点
楼上能附上关键的汇编代码吗?(有注释的)
|
能力值:
( LV6,RANK:90 )
|
-
-
14 楼
内容如下:
00401028 |. C745 F8 FFFFFFFF mov [local.2],-1 ;低4字节0xffffffff 0040102F |. C745 FC 00000000 mov [local.1],0 ;高4字节0,以上2句 i = 0xffffffff; 00401036 |. 68 24004200 push 12313123.00420024 ; ASCII "hello" 0040103B |. 8B45 FC mov eax,[local.1] 0040103E |. 50 push eax ; /<%s> eax = 0 0040103F |. 8B4D F8 mov ecx,[local.2] ; | 00401042 |. 51 push ecx ; |<%d> ecx= 0xffffffff 00401043 |. 68 1C004200 push 12313123.0042001C ; |format = "%d %s" 00401048 |. E8 33000000 call 12313123.printf ; \printf
自己跟踪一遍就明白了。
|
|
|