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

隨筆-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)意想不到的問題。

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

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

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

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ù),寫入ptr+1的位置,可見問題就出現(xiàn)在這里,一下寫入4個(gè)字節(jié),在ptr+1到ptr+4的位置,由于*(ptr+4)里的內(nèi)容并未保存,所以被覆蓋了,導(dǎo)致后面第2次讀取的數(shù)據(jù)不正確,最后的結(jié)果也不會(huì)輸出正確

看了下邊網(wǎng)友的回帖,比較好的方法就是用移位,本來是數(shù),移位肯定不會(huì)出問題,使用的是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)這樣的問題,很難查出原因來,因此,需要格外注意。還有在多線程的時(shí)候,一個(gè)讀一個(gè)寫,由于使用2個(gè)寄存器,就有可能在一個(gè)寫線程操作到一個(gè)64位數(shù)的32位的時(shí)候,線程正好切換到讀線程,導(dǎo)致產(chǎn)生一些奇怪的數(shù)據(jù),而且這種奇怪的情況并不是每次運(yùn)行都能體現(xiàn)出來,造成的損失可想而知。所以對(duì)跨線程使用64位變量必須嚴(yán)格進(jìn)行同步。


by greatws
posted on 2008-09-05 22:22 greatws 閱讀(3412) 評(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*的說  回復(fù)  更多評(píng)論
  
# re: 32位系統(tǒng)上使用64位變量需要特別注意 2008-09-06 00:26 | clear
就是_int32*也是有對(duì)齊要求的,只不過x86系統(tǒng)把這個(gè)對(duì)齊要求降低到1罷了
在很多嵌入式系統(tǒng)里面,也是要求4字節(jié)對(duì)齊32位數(shù)據(jù)的說  回復(fù)  更多評(píng)論
  
# re: 32位系統(tǒng)上使用64位變量需要特別注意[未登錄] 2008-09-06 14:05 | megax
這么做的意義是什么呢?這么做肯定是非法操作啊,沒看懂。。。  回復(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   博問   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>
            99综合精品| 亚洲精品资源| 久久大逼视频| 国产综合一区二区| 久久久青草婷婷精品综合日韩| 亚洲免费中文字幕| 国产精品色午夜在线观看| 午夜亚洲福利| 久久精品一本| 91久久久久| 99视频国产精品免费观看| 国产精品二区三区四区| 久久成人资源| 久久久久久久综合色一本| 亚洲激情亚洲| 国产精品99久久久久久白浆小说 | 亚洲午夜精品视频| 国产精品揄拍一区二区| 久久先锋影音av| 欧美成人四级电影| 午夜精品免费视频| 久久久国产精彩视频美女艺术照福利| 在线观看亚洲一区| 日韩视频免费在线| 国产欧美一区二区精品性色| 麻豆精品视频| 国产精品大片wwwwww| 久久蜜桃精品| 欧美日韩国产首页| 老牛嫩草一区二区三区日本| 欧美精品大片| 久久综合网色—综合色88| 欧美精品久久久久久久免费观看| 欧美制服丝袜第一页| 免费久久99精品国产| 香蕉久久夜色精品国产| 欧美福利电影在线观看| 久久精品亚洲乱码伦伦中文 | 久久精品九九| 一本久道久久综合狠狠爱| 欧美一站二站| 午夜精品成人在线| 欧美成人四级电影| 久久亚洲美女| 国产精品久久网站| 亚洲精品乱码久久久久久按摩观| 国产日韩欧美在线看| 99re在线精品| 亚洲美女91| 老巨人导航500精品| 久久成人av少妇免费| 欧美日韩在线高清| 亚洲黄色在线视频| 亚洲国产成人午夜在线一区 | 日韩亚洲视频在线| 亚洲精品一二区| 久久亚洲视频| 可以免费看不卡的av网站| 国产精品资源在线观看| 亚洲视频大全| 亚洲欧美精品在线| 国产精品久久久久久久久免费桃花 | 国产欧美大片| 亚洲一区综合| 亚洲欧美另类久久久精品2019| 欧美精品国产精品| 亚洲国产成人91精品| 亚洲人成网站在线观看播放| 狂野欧美性猛交xxxx巴西| 免费成人黄色av| 一区二区三区自拍| 久久亚洲综合色一区二区三区| 久久蜜桃资源一区二区老牛| 国产综合欧美| 乱中年女人伦av一区二区| 欧美岛国激情| 一本色道久久99精品综合| 欧美日韩极品在线观看一区| 亚洲日产国产精品| 亚洲一级在线观看| 国产精品区一区| 亚洲一区在线看| 久久久久88色偷偷免费| 在线看一区二区| 嫩草成人www欧美| 亚洲精品资源美女情侣酒店| 亚洲尤物在线视频观看| 国产精品一区二区男女羞羞无遮挡| 亚洲欧美日本日韩| 久久综合久久综合这里只有精品| 亚洲电影激情视频网站| 欧美顶级艳妇交换群宴| 亚洲婷婷综合久久一本伊一区| 欧美一区二区三区免费在线看| 好吊妞这里只有精品| 美女网站久久| 一区二区三区毛片| 久久久久久成人| 日韩一二三在线视频播| 国产精品久久久久久久久免费桃花 | 久久精品99| 亚洲欧洲精品一区二区三区| 国产精品mv在线观看| 久久精品九九| 一区二区福利| 欧美激情一级片一区二区| 亚洲一区二区三区四区中文| 极品少妇一区二区三区| 欧美伦理视频网站| 久久大综合网| 日韩一级网站| 欧美mv日韩mv国产网站app| 中国亚洲黄色| 亚洲高清电影| 国产欧美精品一区二区色综合| 免费视频久久| 欧美制服第一页| 99精品国产99久久久久久福利| 久久综合伊人77777蜜臀| 国产精品99久久久久久久久| 伊人成综合网伊人222| 国产精品视频成人| 欧美日本在线播放| 久久这里有精品视频| 亚洲在线一区二区| 亚洲精品在线看| 男男成人高潮片免费网站| 久久成人精品| 一区二区三区视频在线播放| 亚洲电影在线观看| 国产在线不卡视频| 国产精品男女猛烈高潮激情| 欧美区高清在线| 欧美精品免费视频| 麻豆精品在线视频| 久久久xxx| 欧美一级午夜免费电影| 亚洲一区美女视频在线观看免费| 亚洲国产欧美日韩精品| 欧美大片第1页| 欧美成人免费在线观看| 开元免费观看欧美电视剧网站| 欧美在线亚洲综合一区| 欧美亚洲视频一区二区| 亚洲女ⅴideoshd黑人| 亚洲无线视频| 亚洲一区二区三区免费在线观看 | 亚洲视屏在线播放| 亚洲美女免费精品视频在线观看| 亚洲人成小说网站色在线| 亚洲高清网站| 亚洲人成人77777线观看| 亚洲国产一区二区三区在线播| 在线看成人片| 亚洲精品偷拍| 亚洲色图综合久久| 先锋影音国产一区| 久久精品中文字幕一区| 久久久久免费| 亚洲第一页自拍| 日韩视频免费大全中文字幕| 一区二区三区国产| 欧美一区二区免费观在线| 久久久久久一区| 欧美国产日韩免费| 欧美性猛片xxxx免费看久爱| 国产欧美在线观看| 精品1区2区3区4区| 亚洲每日在线| 午夜精品一区二区三区在线| 巨乳诱惑日韩免费av| 欧美激情一区二区三区在线| 日韩一本二本av| 欧美在线播放高清精品| 欧美aⅴ一区二区三区视频| 欧美日韩国产高清| 国产日产高清欧美一区二区三区| 在线观看福利一区| 在线视频日本亚洲性| 欧美一区二区精品| 欧美福利一区| 亚洲一区二区在| 你懂的视频一区二区| 国产精品美女在线观看| 亚洲成人自拍视频| 午夜日韩在线| 亚洲第一综合天堂另类专| 亚洲一区三区电影在线观看| 美女露胸一区二区三区| 国产精品狼人久久影院观看方式| 精品福利电影| 午夜精品视频在线观看一区二区| 欧美国产亚洲视频| 亚洲欧美成人| 欧美日韩亚洲一区在线观看| 韩国亚洲精品| 午夜精品久久久久影视| 亚洲精品美女久久7777777| 欧美在线精品一区| 国产精品va|