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

隨筆-16  評(píng)論-116  文章-0  trackbacks-0
轉(zhuǎn)載請(qǐng)注明出處:http://www.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>
            欧美激情精品久久久久久| 欧美国产日韩免费| 国产精品香蕉在线观看| 午夜精品久久久久久| 欧美色大人视频| 午夜精彩国产免费不卡不顿大片| 最新中文字幕一区二区三区| 久久精品色图| 亚洲高清一区二区三区| 91久久国产综合久久| 欧美日韩一区在线观看视频| 香蕉成人伊视频在线观看| 欧美亚洲系列| 亚洲人成亚洲人成在线观看| 亚洲国产精彩中文乱码av在线播放| 欧美黄色免费| 欧美一区二区三区在| 久久久久九九视频| 一区二区三区精品视频| 亚洲欧美成人在线| 影音先锋久久精品| 一区二区不卡在线视频 午夜欧美不卡'| 欧美日韩亚洲天堂| 久久中文字幕导航| 欧美日韩第一页| 久久久久免费视频| 欧美精品在线视频观看| 久久er精品视频| 欧美激情综合五月色丁香小说| 久久gogo国模裸体人体| 欧美日韩成人在线观看| 久久精品国产77777蜜臀| 麻豆精品视频| 久久狠狠亚洲综合| 欧美日韩另类丝袜其他| 久久一二三四| 欧美午夜不卡影院在线观看完整版免费 | 亚洲最新视频在线播放| 亚洲高清精品中出| 国产精品高潮久久| 亚洲激情在线视频| 国产性做久久久久久| 99国产精品视频免费观看| 在线观看不卡| 欧美一级视频一区二区| 亚洲免费视频中文字幕| 欧美激情中文字幕乱码免费| 久久天堂精品| 国产日韩欧美高清免费| 国产精品99久久久久久有的能看| 影音先锋久久| 久久一区二区三区四区五区| 久久国产精品一区二区| 国产精品视频导航| 一本一道久久综合狠狠老精东影业 | 亚洲深爱激情| 免费观看久久久4p| 美女脱光内衣内裤视频久久网站| 国产日产精品一区二区三区四区的观看方式| 亚洲激情av| 日韩天天综合| 欧美精品在线一区| 亚洲黄色小视频| 日韩视频在线观看国产| 欧美国产一区二区| 91久久精品一区二区别| 日韩视频中午一区| 欧美日韩一区二区视频在线| 亚洲精品一二三| 一区二区三区免费在线观看| 欧美日韩视频在线一区二区| 一区二区黄色| 午夜精品999| 国产视频观看一区| 久久av在线| 欧美成人精品h版在线观看| 韩国在线一区| 麻豆freexxxx性91精品| 亚洲国产精品视频| 亚洲少妇中出一区| 国产伦精品一区二区三区视频黑人| 亚洲综合精品| 狂野欧美一区| 久久久久一区二区三区| 欧美大片在线看| 亚洲开发第一视频在线播放| 欧美伦理在线观看| 一区二区高清| 毛片一区二区三区| 亚洲精品视频免费观看| 欧美另类一区二区三区| 性色av一区二区三区| 麻豆精品视频在线观看视频| 亚洲理论在线观看| 国产精品久久久久av免费| 久久精品国产999大香线蕉| 欧美激情精品久久久久久| 亚洲一区二区毛片| 国内外成人在线| 欧美日韩ab片| 欧美影院在线| 亚洲美女在线视频| 久久男人资源视频| 亚洲视频免费| 在线日韩一区二区| 国产精品久久国产精品99gif| 欧美亚洲一级片| 最近中文字幕mv在线一区二区三区四区| 亚洲一区三区电影在线观看| 在线观看日韩www视频免费| 欧美日韩午夜在线| 久久天天躁狠狠躁夜夜爽蜜月| 99香蕉国产精品偷在线观看| 蜜桃av一区二区三区| 亚洲欧美日韩国产| 亚洲精品国产精品国自产观看浪潮| 国产欧美日本| 欧美日韩国产成人| 久久综合九色99| 欧美一级免费视频| 一本久久知道综合久久| 亚洲国产裸拍裸体视频在线观看乱了| 欧美一区二区啪啪| 亚洲午夜一区二区三区| 亚洲精品久久久久中文字幕欢迎你 | 欧美在线网址| 一本色道久久综合狠狠躁篇怎么玩| 欧美成人自拍视频| 久久影视精品| 性欧美大战久久久久久久免费观看| 99热这里只有精品8| 亚洲国产美女| 激情亚洲网站| 极品尤物久久久av免费看| 国产美女诱惑一区二区| 国产精品久久久久久久久果冻传媒| 欧美精品一区二区三区一线天视频| 麻豆精品在线视频| 久久久综合网站| 久久精品观看| 老**午夜毛片一区二区三区| 久久久久久网| 久久天天狠狠| 欧美成人一品| 欧美激情精品久久久久久免费印度| 欧美成人免费全部观看天天性色| 久久精品亚洲一区| 久久五月激情| 免费黄网站欧美| 欧美精品激情在线观看| 欧美精品www在线观看| 欧美精品免费看| 欧美深夜影院| 国产欧美午夜| 136国产福利精品导航网址| 亚洲国产成人在线播放| 亚洲精品久久久久久下一站| 一本色道久久综合| 午夜视频久久久| 久久精品网址| 欧美高清在线| 99精品99久久久久久宅男| 中文在线资源观看网站视频免费不卡 | 亚洲黄色有码视频| 日韩视频在线观看一区二区| 亚洲深夜福利视频| 午夜精品福利一区二区三区av | 99re8这里有精品热视频免费| 中文精品一区二区三区 | 亚洲毛片在线观看| 亚洲免费中文字幕| 久久综合色8888| 国产精品v欧美精品v日韩 | 亚洲在线网站| 久久久女女女女999久久| 亚洲国产另类久久久精品极度| 亚洲天堂av图片| 久久亚洲一区二区三区四区| 欧美日韩国产综合一区二区| 国产日本欧美一区二区三区在线| 亚洲国产婷婷香蕉久久久久久99 | 亚洲少妇自拍| 蜜臀av一级做a爰片久久| 国产精品久久激情| 亚洲高清在线| 欧美一区国产一区| 亚洲欧洲一区| 久久精品国产亚洲一区二区三区| 欧美激情在线播放| 国产综合久久| 亚洲综合三区| 亚洲精品国产精品久久清纯直播| 午夜精品久久一牛影视| 欧美日韩aaaaa| 亚洲第一在线视频| 久久精品国产清自在天天线| 亚洲美女av黄| 蜜臀va亚洲va欧美va天堂| 国产欧美一区二区精品秋霞影院 | 久久精品国产精品亚洲|