3

示例:0xAABBCCDD将变成0xDDCCBBAA

由于第一次 XOR 操作中的访问冲突异常,我的程序崩溃了。

似乎有一个更好的幼稚解决方案,使用移位或旋转,但无论如何,这是代码:

  ;; #########################################################################

      .486
      .model flat, stdcall
      option casemap :none   ; case sensitive

;; #########################################################################

      include \masm32\include\masm32.inc
      include \masm32\include\kernel32.inc

      includelib \masm32\lib\kernel32.lib
    includelib \masm32\lib\masm32.lib


.code
;; The following program will flip the sequence of the bytes in the eax
;; example : 0xAABBCCDD will turn into 0xDDCCBBAA
start:
MOV eax, 0AABBCCDDh 
XOR BYTE PTR [eax], al ;; Swap first byte and last byte
XOR al, BYTE PTR [eax]
XOR BYTE PTR [eax], al 
XOR BYTE PTR [eax+1], ah ;; Swap 2nd byte of eax and 3rd byte
XOR ah, BYTE PTR [eax+1]
XOR BYTE PTR [eax+1], ah
end_prog:
    ;;Exit the program, eax is the exit code
    push eax
    call ExitProcess
END start

我在这里做错了什么?有没有更好的解决方案?

4

3 回答 3

16

为什么不简单:

 mov  eax, 0AABBCCDDh
 bswap eax

我不确定您要在程序中做什么,但可以说出 CPU 实际尝试做什么(但不能,这就是崩溃的原因):

这个:

XOR BYTE PTR [eax], al 

尝试计算寄存器 AL 中的值(字节大小)和内存中地址 0AABBCCDDh(EAX 寄存器的内容)的字节值的异或运算。只要在这个地址上没有操作系统分配的任何内存,程序就会与 GPF 一起崩溃。

不使用 bswap 的正确字节交换如下(感谢XJ):

    xchg  ah, al
    ror   eax, 16
    xchg  ah, al.
于 2013-10-14T23:21:13.470 回答
4

另一种解决方案,rol仅使用说明:

mov eax,0xAABBCCDDh
rol ax,8            ; 0AABBDDCCh
rol eax,16          ; 0DDCCAABBh
rol ax,8            ; 0DDCCBBAAh

我相信,在大多数情况下,这将比使用xchg指令稍微快一点,尽管我认为没有理由不简单地使用bswap,因为它更干净而且可能更快。

于 2018-08-21T18:40:33.757 回答
2

怎么样...

    mov eax, 0AABBCCDDh
    xchg al, ah ; 0AABBDDCCh
    rol eax, 16 ; 0DDCCAABBh
    xchg al, ah ; 0DDCCBBAAh

那不会做一个寄存器中想要的吗?我看到 XJ 已经发布了(向左旋转,向右旋转 - 相同的结果)必须快点打败你们!:)

于 2013-10-15T00:24:55.737 回答