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

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

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

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

題目:
1、不能用庫函數(shù),要求達(dá)到效率o(1);
2、將符號'@'插入字符串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,有一個字節(jié)不對。仔細(xì)一想,應(yīng)該是把64位變量放到2個寄存器中了。
用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個送入棧,完成char ptr[16]的初始化,第8 9行是把'@'放入eax,第10行把最后一個參數(shù)入棧,也就是@,11行把ebp-14也就是ptr傳給ecx,12行把ptr入棧,也就是倒數(shù)第二個參數(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個字節(jié)abcd存入edx,也就是0x64636261,注意高低位
然后把edx里的4個字節(jié)的數(shù),寫入ptr+1的位置,可見問題就出現(xiàn)在這里,一下寫入4個字節(jié),在ptr+1到ptr+4的位置,由于*(ptr+4)里的內(nèi)容并未保存,所以被覆蓋了,導(dǎo)致后面第2次讀取的數(shù)據(jù)不正確,最后的結(jié)果也不會輸出正確

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

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


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

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

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

只有注冊用戶登錄后才能發(fā)表評論。
網(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>
            欧美成人免费观看| 欧美成人嫩草网站| 国产视频精品va久久久久久| 亚洲在线观看视频| 亚洲综合欧美| 狠狠干综合网| 欧美激情小视频| 欧美精品免费播放| 亚欧成人精品| 久久综合99re88久久爱| 亚洲黄网站黄| 国产精品99久久久久久宅男 | 日韩亚洲不卡在线| 国产精品久久久久久久午夜| 欧美在线视频在线播放完整版免费观看 | 亚洲欧美日韩一区二区三区在线观看| 亚洲天堂av高清| 国内精品国产成人| 亚洲激情成人在线| 国产精品一区二区在线观看不卡 | 亚洲欧洲一区二区在线观看 | 欧美在线视频一区二区| 久久视频国产精品免费视频在线| 亚洲精品日韩在线| 亚洲综合激情| 亚洲精品视频一区二区三区| 一区二区免费在线视频| 国内精品久久久久影院薰衣草| 欧美激情按摩在线| 国产乱码精品一区二区三区不卡| 欧美国产一区在线| 国产精品视频一二| 91久久国产精品91久久性色| 国产日产欧产精品推荐色| 亚洲国产精品传媒在线观看 | 欧美日韩国产探花| 久热精品视频在线| 国产精品久久99| 91久久精品一区二区三区| 国产性色一区二区| 一区二区欧美精品| 亚洲国产精品第一区二区| 亚洲欧美一区二区在线观看| 日韩一区二区免费高清| 久久免费视频这里只有精品| 欧美一级专区免费大片| 欧美精品在线观看| 免费成人av资源网| 韩国亚洲精品| 欧美亚洲视频在线看网址| 亚洲摸下面视频| 欧美日韩国产片| 欧美激情第三页| 在线观看日韩国产| 久久国产色av| 久久久久国产免费免费| 国产欧美一区二区三区国产幕精品 | 久久精精品视频| 国产九九精品视频| 亚洲图片你懂的| 亚洲砖区区免费| 国产精品国产三级国产专播精品人| 亚洲黄色免费电影| 亚洲人体大胆视频| 欧美刺激性大交免费视频| 欧美成人综合| 亚洲美女性视频| 欧美日本不卡| 日韩亚洲欧美中文三级| 亚洲深夜福利网站| 欧美视频在线播放| 亚洲素人一区二区| 欧美一区二区高清| 国产亚洲欧美日韩在线一区| 欧美影院成年免费版| 看片网站欧美日韩| 亚洲欧洲精品一区二区三区波多野1战4 | 欧美性猛交xxxx乱大交退制版| 亚洲三级免费| 亚洲欧美日韩天堂一区二区| 国产精品视频不卡| 久久精品国产2020观看福利| 鲁鲁狠狠狠7777一区二区| 在线观看亚洲专区| 欧美精品在线观看| 亚洲一区二区精品在线观看| 狠狠色综合色区| 久久深夜福利免费观看| 欧美黄色精品| 亚洲欧美日韩精品综合在线观看| 国产欧美日本一区二区三区| 久久久久久69| 亚洲日本在线视频观看| 午夜久久影院| 一区二区在线观看视频在线观看| 欧美成人高清| 午夜精品久久久久久久白皮肤| 蜜桃av一区二区三区| 亚洲视频一二区| 韩日欧美一区二区三区| 欧美理论片在线观看| 性视频1819p久久| 91久久久久久久久| 久久精品主播| 亚洲最黄网站| 亚洲成人资源| 国产伦精品一区二区三区四区免费| 久久久久国产精品www| 一区二区免费在线播放| 麻豆精品精华液| 亚洲欧美不卡| 亚洲乱码国产乱码精品精天堂| 国产欧美精品va在线观看| 欧美激情区在线播放| 欧美伊人精品成人久久综合97| 亚洲精品网站在线播放gif| 另类专区欧美制服同性| 午夜精品免费视频| 亚洲毛片av在线| 黄色成人在线免费| 国产精品爽爽爽| 欧美日韩在线三区| 欧美大片91| 老司机免费视频久久| 欧美一级黄色录像| 亚洲午夜免费视频| 亚洲精品欧美日韩| 亚洲高清激情| 欧美大尺度在线| 免费成人毛片| 另类亚洲自拍| 久久婷婷蜜乳一本欲蜜臀| 欧美一区二区三区播放老司机| 一区二区三区.www| 一区二区久久| av成人免费观看| 一本高清dvd不卡在线观看| 亚洲黄色性网站| 亚洲黄色片网站| 亚洲激情一区二区| 亚洲激情另类| 亚洲精品欧洲| 99精品视频免费| 99热在线精品观看| 在线视频欧美日韩精品| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 欧美视频免费在线| 欧美日韩视频在线一区二区观看视频 | 女仆av观看一区| 女生裸体视频一区二区三区| 免费成人av| 亚洲国产精品久久久久| 亚洲国产一区二区视频| 亚洲精品视频在线观看网站| 99re6热只有精品免费观看| 一区二区欧美日韩| 亚洲欧美国产三级| 欧美中文在线字幕| 快射av在线播放一区| 欧美成人激情在线| 欧美三级欧美一级| 国产欧美在线观看一区| 黄色国产精品一区二区三区| 亚洲国产精品成人综合| 一区二区国产日产| 欧美在线|欧美| 欧美成年人视频网站欧美| 亚洲欧洲一区二区天堂久久| 夜夜精品视频一区二区| 欧美一区二区观看视频| 乱码第一页成人| 国产精品高潮呻吟久久av无限| 国产欧美日韩在线 | 国产毛片精品视频| 亚洲第一在线综合在线| 亚洲精品视频啊美女在线直播| 亚洲午夜精品久久久久久app| 欧美在线国产| 亚洲国产欧美另类丝袜| 亚洲一区二区三区免费观看| 久久天天躁夜夜躁狠狠躁2022| 欧美精品aa| 国内精品久久久久久久影视麻豆 | 亚洲欧洲日韩在线| 亚洲欧美中文在线视频| 欧美jizz19hd性欧美| 亚洲少妇中出一区| 欧美成人在线网站| 国产女优一区| 在线亚洲观看| 欧美二区乱c少妇| 亚洲——在线| 欧美日本国产在线| 亚洲电影中文字幕| 欧美在线一二三四区| 亚洲另类视频| 欧美成va人片在线观看| 国产一区二区三区丝袜 | 亚洲高清中文字幕| 久久久精品免费视频|