青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-16  評(píng)論-116  文章-0  trackbacks-0
轉(zhuǎn)載請(qǐng)注明出處:http://m.shnenglu.com/greatws/archive/2008/09/05/61057.html

32位系統(tǒng),eax,ecx,edx,ebx這些寄存器都是32位的,而要使用一個(gè)64位的變量,需要用到2個(gè)寄存器,或者一個(gè)寄存器用到2次,往往在某些地方就會(huì)出現(xiàn)意想不到的問(wèn)題。

今天參加了CSDN的英雄會(huì),有幸見(jiàn)了些名人,回到家上CSDN,看到個(gè)帖子
http://topic.csdn.net/u/20080905/16/3823c75d-c33b-4ea0-83b1-8386d03e6c6c.html
具體內(nèi)容:

題目:
1、不能用庫(kù)函數(shù),要求達(dá)到效率o(1);
2、將符號(hào)'@'插入字符串ptr的首位,字符串ptr原內(nèi)容按照原來(lái)的順序排在'@'之后.

void insert(char *str, char tmp)
{
     
//填寫(xiě)代碼:
}

void main(void)
{
    
char ptr[16]="abcdefg";
    
char temp='@';
    insert(ptr, temp);
    printf(
"%s\n;",ptr);
}


我很容易想到
void insert(char *str, char tmp)
{
    
*((__int64*)(str + 1)) = *(__int64*)str;
    
*str = tmp;
}

可是結(jié)果卻很令人驚訝,輸出@abcddfg,有一個(gè)字節(jié)不對(duì)。仔細(xì)一想,應(yīng)該是把64位變量放到2個(gè)寄存器中了。
用OD反一下,看下主函數(shù)里的關(guān)鍵地方,OH,前面分配棧的一句是sub esp,18

 100401030  /$  A1 DCB64000   mov     eax, dword ptr [40B6DC]  
 200401035  |?  8945 EC       mov     dword ptr [ebp-14], eax
 300401038  |?  8B0D E0B64000 mov     ecx, dword ptr [40B6E0]
 40040103E  |?  894D F0       mov     dword ptr [ebp-10], ecx
 500401041  |?  33D2          xor     edx, edx                         ;  namespac.0040E2B8
 600401043  |?  8955 F4       mov     dword ptr [ebp-C], edx
 700401046  |?  8955 F8       mov     dword ptr [ebp-8], edx
 800401049  |?  C645 EB 40    mov     byte ptr [ebp-15], 40
 90040104D  |?  0FB645 EB     movzx   eax, byte ptr [ebp-15]
1000401051  |.  50            push    eax
1100401052  |?  8D4D EC       lea     ecx, dword ptr [ebp-14]
1200401055  |?  51            push    ecx
1300401056  |.  E8 A5FFFFFF   call    00401000
140040105B  |?  83C4 08       add     esp, 8
第一行,0x04B6DC就是常量字符串"abcdefg"的地址,把分2次每次4個(gè)送入棧,完成char ptr[16]的初始化,第8 9行是把'@'放入eax,第10行把最后一個(gè)參數(shù)入棧,也就是@,11行把ebp-14也就是ptr傳給ecx,12行把ptr入棧,也就是倒數(shù)第二個(gè)參數(shù),然后調(diào)用下面的函數(shù)。

 100401000  /$  55            push    ebp
 200401001  |.  8BEC          mov     ebp, esp
 300401003  |.  8B45 08       mov     eax, dword ptr [ebp+8]
 400401006  |.  8B4D 08       mov     ecx, dword ptr [ebp+8]
 500401009  |?  8B11          mov     edx, dword ptr [ecx]
 60040100B  |.  8950 01       mov     dword ptr [eax+1], edx
 70040100E  |?  8B49 04       mov     ecx, dword ptr [ecx+4]
 800401011  |?  8948 05       mov     dword ptr [eax+5], ecx
 900401014  |?  8B55 08       mov     edx, dword ptr [ebp+8]
1000401017  |.  8A45 0C       mov     al, byte ptr [ebp+C]
110040101A  |.  8802          mov     byte ptr [edx], al
120040101C  |?  5D            pop     ebp
130040101D  |.  C3            retn
3 4行把剛才入棧的ptr指針存入eax,ecx
第5行把char ptr[16]的前4個(gè)字節(jié)abcd存入edx,也就是0x64636261,注意高低位
然后把edx里的4個(gè)字節(jié)的數(shù),寫(xiě)入ptr+1的位置,可見(jiàn)問(wèn)題就出現(xiàn)在這里,一下寫(xiě)入4個(gè)字節(jié),在ptr+1到ptr+4的位置,由于*(ptr+4)里的內(nèi)容并未保存,所以被覆蓋了,導(dǎo)致后面第2次讀取的數(shù)據(jù)不正確,最后的結(jié)果也不會(huì)輸出正確

看了下邊網(wǎng)友的回帖,比較好的方法就是用移位,本來(lái)是數(shù),移位肯定不會(huì)出問(wèn)題,使用的是shld雙精度左移指令(為什么是左移不是右移?同樣注意高低位),保證數(shù)據(jù)不會(huì)丟失
void insert(char *str, char tmp)
{
    
*(__int64*)str <<= 8;
    
*str = tmp;
}
運(yùn)行,結(jié)果正確

可以看出,在32位系統(tǒng)使用64位變量需要很注意,尤其是在賦值的時(shí)候,比如我上邊的例子。往往在一個(gè)大工程里,出現(xiàn)這樣的問(wèn)題,很難查出原因來(lái),因此,需要格外注意。還有在多線程的時(shí)候,一個(gè)讀一個(gè)寫(xiě),由于使用2個(gè)寄存器,就有可能在一個(gè)寫(xiě)線程操作到一個(gè)64位數(shù)的32位的時(shí)候,線程正好切換到讀線程,導(dǎo)致產(chǎn)生一些奇怪的數(shù)據(jù),而且這種奇怪的情況并不是每次運(yùn)行都能體現(xiàn)出來(lái),造成的損失可想而知。所以對(duì)跨線程使用64位變量必須嚴(yán)格進(jìn)行同步。


by greatws
posted on 2008-09-05 22:22 greatws 閱讀(3405) 評(píng)論(4)  編輯 收藏 引用

評(píng)論:
# re: 32位系統(tǒng)上使用64位變量需要特別注意 2008-09-06 00:24 | clear
*((__int64*)(str + 1)) = *(__int64*)str;

這個(gè)可是即使在64位系統(tǒng)上,應(yīng)該也不能保證正確的代碼吧...
_int64數(shù)據(jù)在特定系統(tǒng)上都是有特定對(duì)齊要求的,不能簡(jiǎn)單的把一個(gè)地址轉(zhuǎn)換到_int64*的說(shuō)  回復(fù)  更多評(píng)論
  
# re: 32位系統(tǒng)上使用64位變量需要特別注意 2008-09-06 00:26 | clear
就是_int32*也是有對(duì)齊要求的,只不過(guò)x86系統(tǒng)把這個(gè)對(duì)齊要求降低到1罷了
在很多嵌入式系統(tǒng)里面,也是要求4字節(jié)對(duì)齊32位數(shù)據(jù)的說(shuō)  回復(fù)  更多評(píng)論
  
# re: 32位系統(tǒng)上使用64位變量需要特別注意[未登錄](méi) 2008-09-06 14:05 | megax
這么做的意義是什么呢?這么做肯定是非法操作啊,沒(méi)看懂。。。  回復(fù)  更多評(píng)論
  
# re: 32位系統(tǒng)上使用64位變量需要特別注意 2008-09-07 14:47 | 陳梓瀚(vczh)
編譯器的bug……  回復(fù)  更多評(píng)論
  

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久不见久久见免费视频1| 在线观看三级视频欧美| 亚洲欧美日韩在线观看a三区| 一本色道久久综合亚洲精品不| 欧美亚洲视频在线观看| 亚洲精品久久久久久下一站| 亚洲精品一区二区三区福利| 亚洲欧美一区二区三区极速播放| 国产欧美一区二区在线观看| 欧美日韩精品不卡| 免费观看国产成人| 欧美黄色日本| 久久久久亚洲综合| 亚洲婷婷免费| 亚洲激情在线视频| 欧美大片一区二区三区| 一本色道久久88综合亚洲精品ⅰ | 99亚洲伊人久久精品影院红桃| 欧美日韩免费高清一区色橹橹| 久久久久久夜| 亚洲影音一区| 欧美日韩国产一区二区三区| 欧美顶级艳妇交换群宴| 久久久久国色av免费看影院| 久久夜色精品一区| 欧美成年人视频| 欧美日韩国产在线| 欧美日韩亚洲激情| 亚洲精品美女在线观看| 亚洲美女精品成人在线视频| 亚洲免费大片| 亚洲欧美视频一区| 久久久精彩视频| 亚洲黄色成人久久久| 亚洲男人影院| 欧美三级黄美女| 国产精品一区二区三区四区| 欧美亚洲一级| 欧美va亚洲va国产综合| 亚洲第一毛片| 亚洲一区二区在线播放| 老司机免费视频久久| 欧美三级视频在线| 日韩视频在线观看| 在线欧美三区| 亚洲精品欧洲| 美日韩丰满少妇在线观看| 亚洲一区二区三区免费观看 | 亚洲高清av| 久久精品导航| 久久久精品免费视频| 亚洲高清在线观看一区| 亚洲日韩成人| 国产精品视频免费在线观看| 欧美在线播放视频| 欧美日韩一卡| 宅男噜噜噜66一区二区| 亚洲精品久久久久中文字幕欢迎你| 亚洲高清视频在线观看| 亚洲美女福利视频网站| 亚洲欧美国内爽妇网| 欧美一级二区| 欧美成人免费在线视频| 欧美福利一区| 久久免费偷拍视频| 日韩亚洲视频在线| 日韩网站在线观看| 国产精品啊啊啊| 一区二区免费看| 中文国产亚洲喷潮| 国产一区二区三区电影在线观看| 欧美不卡一区| 国产日韩在线播放| 亚洲综合视频网| 亚洲欧美久久久| 国产亚洲制服色| 日韩视频一区二区| 国产毛片一区二区| 欧美1区视频| 国产视频一区在线观看| 亚洲精品视频在线| 亚洲日本中文| 欧美精品国产一区二区| 亚洲国产专区| 亚洲美女一区| 欧美顶级艳妇交换群宴| 亚洲午夜在线视频| 黄色亚洲免费| 一个色综合av| 亚洲一区免费观看| 在线看成人片| 欧美一区1区三区3区公司| 激情久久久久久久久久久久久久久久| 欧美中文字幕| 亚洲国产精品激情在线观看| 亚洲人成亚洲人成在线观看图片| 欧美承认网站| 在线观看久久av| 久久综合狠狠综合久久综青草 | 蜜桃av久久久亚洲精品| 欧美网站在线观看| 欧美激情亚洲综合一区| 国内久久精品| 欧美紧缚bdsm在线视频| 性做久久久久久| 老司机午夜精品视频| 在线视频欧美日韩精品| 韩曰欧美视频免费观看| 欧美成人精品在线观看| 欧美成人一品| 亚洲精品免费看| 狠久久av成人天堂| 国产精品久久九九| 欧美国产一区二区在线观看| 久久综合九色九九| 免费成人你懂的| 正在播放日韩| 在线视频成人| 激情欧美一区二区三区| 国内精品免费在线观看| 亚洲精品久久| 久久人人97超碰国产公开结果| 中文亚洲视频在线| 国产一区久久久| 欧美精品日日鲁夜夜添| 欧美一级视频| 亚洲一区免费网站| 免费亚洲电影| 免费成人在线观看视频| 亚洲天堂网在线观看| av成人免费在线| 亚洲欧美日韩精品一区二区 | 国产欧美精品| 欧美精品一区二| 亚洲欧美色婷婷| 一区二区三区日韩欧美| 一区二区三区四区五区在线| 香蕉成人久久| 欧美另类女人| 亚洲无线一线二线三线区别av| 麻豆精品一区二区综合av| 欧美高清在线视频| 久久久人成影片一区二区三区观看 | 99在线精品免费视频九九视| 亚洲欧美日韩国产综合精品二区 | 欧美日韩亚洲91| 亚洲高清视频中文字幕| 久久9热精品视频| 欧美成人精品影院| 亚洲在线视频免费观看| 欧美亚洲自偷自偷| 久久久99免费视频| 国产精品久久久久7777婷婷| 国内一区二区三区| 欧美精品一区二区三区很污很色的| 欧美永久精品| 欧美一区午夜精品| 国产精品高潮呻吟| 亚洲国产成人av| 欧美成人一区二区| 久久这里只有| 亚洲福利视频一区二区| 亚洲一区二区黄色| 久久久国产精品一区| 亚洲视屏一区| 免费美女久久99| 在线日韩中文字幕| 亚洲精品精选| 国产精品主播| 久久国产婷婷国产香蕉| 日韩视频精品| 国产精品婷婷午夜在线观看| 久久精品视频一| 久久综合久久久久88| 亚洲精品免费在线| 亚洲欧洲日本国产| 欧美日韩hd| 久久久水蜜桃| 欧美午夜精品久久久久久久| 久久久夜夜夜| 欧美专区第一页| 激情综合电影网| 亚洲人成毛片在线播放| 国精产品99永久一区一区| 日韩午夜电影av| 在线综合亚洲| 久久av一区| 亚洲一区久久| 麻豆亚洲精品| 欧美高清视频一区二区| 国产自产精品| 一本色道久久99精品综合| 黄色精品在线看| 亚洲视频播放| 亚洲影院色在线观看免费| 欧美日韩国产精品 | 欧美伊久线香蕉线新在线| 在线看国产一区| 亚洲欧洲午夜| 日韩一级精品视频在线观看|