gpt4 book ai didi

assembly - 在汇编程序中交换最高有效字节和最低有效字节

转载 作者:行者123 更新时间:2023-12-02 21:36:13 25 4
gpt4 key购买 nike

假设我们将数字 1 保存在 EAX 寄存器中,并将最高有效字节与最低有效字节交换。新交换的号码是256还是16777216?

我在汇编程序中尝试过将 AL- 的值与 AH-Register 的值交换。我的结果是 256。我不认为这是正确的,我也不理解 256 的结果。我认为 EAX 寄存器是 32 位,而不是 16 位。

该问题与交换的正确结果有关。

最佳答案

为此有一个特殊的操作码,称为 BSWAP ,例如:

    MOV     EAX,1   ; EAX is 0x00000001  or 1 decimal  
BSWAP EAX ; EAX is 0x01000000 or 16777216 decimal

它将交换任何 32 位通用寄存器的所有 4 个字节。这会将小端 32 位值转换为大端,反之亦然。

FWIW,交换 16 位值的字节,例如在 AX 中,你可以这样做

    MOV     AX,1    ; AX is 0x0001 or 1 decimal
XCHG AL,AH ; AX is 0x0100 or 256 decimal

或者,根据 @PeterCordes 的说法:

    MOV     AX,0x1234
ROL AX,8 ; AX is 0x3412 now

没有特殊的操作码可以交换 32 位寄存器的高字节和低字节(并保持其他两个字节不变)。你只能做这样的事情:

编辑

<使用 RORXCHG AL,AHROLBSWAP 删除代码 >

正如 @Fifoernik 在评论中指出的那样(谢谢!),比我删除的代码容易得多:

    MOV     EAX,0x12345678
ROL EAX,8 ; EAX is 0x34567812 rotate left one byte: 12 34 56 78 --> 34 56 78 12
XCHG AL,AH ; EAX is 0x34561278 swap 12 and 78: 34 56 78 12 --> 34 56 12 78
ROR EAX,8 ; EAX is 0x78345612 rotate back: 34 56 12 78 --> 78 34 56 12

编辑2

正如 @PeterCordes 指出的,这甚至可能会更快一点:

    MOV     EAX,0x12345678
ROL EAX,8 ; EAX is 0x34567812 rotate left one byte: 12 34 56 78 --> 34 56 78 12
ROL AX,8 ; EAX is 0x34561278 swaps 12 and 78: 34 56 78 12 --> 34 56 12 78
ROR EAX,8 ; EAX is 0x78345612 rotate back: 34 56 12 78 --> 78 34 56 12

但我没有为其中任何一个计时。

关于assembly - 在汇编程序中交换最高有效字节和最低有效字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45640326/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com