linux - FASM SHR 奇怪的行为

标签 linux assembly

使用 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. 这个值是通过打开我在十六进制编辑器中重定向输出的文件获得的。 (不是输出本身)

最佳答案

您的号码存储为小端。 http://en.wikipedia.org/wiki/Endianness

为了澄清, 0x89ABCDEF存储为0xEFCDAB89,所以右移产生0x0EFCDAB8,也就是你看到的字节,倒序

关于linux - FASM SHR 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10304287/

相关文章:

linux - ubuntu 13.04 和 g++

c - 如何获取 C 程序本身设置的所有环境变量?

c - 将符号从 .global 更改为 .weak 会产生什么后果?

c++ - 为什么使用 leal 而不是 incq?

python - 如何从另一个 Python 脚本内部运行一个 Python 脚本?

c++ - 对 `sd_notify' 的 undefined reference

linux - 将 oneline 命令放入别名中

c - 为什么将 char 传递给函数会改变它在 c 中的值?

assembly - 如何根据实模式偏移和寻址确定 x86 机器操作码值?

c - 在我的 C 程序中使用 gdb 需要帮助