2012-04-24 31 views
0

使用FASM我試圖移動dword與SHR指令應該將位移到右邊附加零。下面是代碼:FASM SHR奇怪的行爲


format ELF executable 3 

entry start 

segment readable executable 

start: 
    cmp byte [counter],0 
    jz fin 

    mov eax,4 
    mov ebx,1 
    mov ecx,some 
    mov edx,4 
    int 0x80 ; write 4 bytes 

    mov eax,4 
    mov ebx,1 
    mov ecx,splitter 
    mov edx,1 
    int 0x80 ; write a split byte (0x42) 

    shr dword [some],4 

    dec byte [counter] 
    jmp start 
fin: 
    mov eax,1 
    xor ebx,ebx 
    int 0x80 

segment readable writeable 

some db 0x89,0xAB,0xCD,0xEF 
splitter db 0x42 
counter db 10 

我期望能獲得類似的東西:0x89ABCDEF -> 0x089ABCDE -> 0x0089ABCD -> 0x00089ABC -> 0x000089AB -> 0x0000089A -> 0x00000089 -> 0x00000008 -> 0x00000000 但我得到這個代替:0x89ABCDEF -> 0xB8DAFC0E -> 0xABCDEF00 -> 0xDAFC0E00 -> 0xCDEF0000 -> 0xFC0E0000 -> 0xEF000000 -> 0x0E000000 -> 0x00000000

我在做什麼錯?

P. S.通過打開在十六進制編輯器中重定向輸出的文件來獲取此值。 (這不是輸出本身)

回答

1

你的號碼存儲小端。 http://en.wikipedia.org/wiki/Endianness

爲了澄清, 0x89ABCDEF存儲爲0xEFCDAB89,所以右移產生0x0EFCDAB8,這是你看到的字節數,按相反的順序

+0

但是,如果沒有改變輸入值是正常打印... – user28667 2012-04-24 19:08:35

+0

無論您的打印或者你的十六進制編輯器正在做一個字節順序的隱式反轉。基本上你「看到」的字節是你正在移位的字節的相反順序。 – TJD 2012-04-24 19:14:19

+0

非常感謝!我在'BSWAP'之間寫了'SHR',而不是很好。但我不確定這是最好的方法...... – user28667 2012-04-24 19:37:39