问题
Example: 0xAABBCCDD will turn into 0xDDCCBBAA
My program crashes, due to Access Violation exception right in the first XOR operation.
It seems like there's a better naive solution, using shifting or rotating, but anyways, here's the code:
;; #########################################################################
.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
What am I doing wrong here? Is there any better solution for this?
回答1:
Why not simply:
mov eax, 0AABBCCDDh
bswap eax
I am not sure what you are trying to do in your program, but can say what the CPU actually tries to do (but can't and that is why crashes):
This one:
XOR BYTE PTR [eax], al
Tries to compute an xor operation of the value in the register AL (byte sized) and a value of the byte in memory at address 0AABBCCDDh (the content of EAX register). As long as on this address there is no any memory allocated by the OS, the program crashes with GPF.
The proper byte swapping without using bswap is the following (Thanks to X.J):
xchg ah, al
ror eax, 16
xchg ah, al.
回答2:
How 'bout...
mov eax, 0AABBCCDDh
xchg al, ah ; 0AABBDDCCh
rol eax, 16 ; 0DDCCAABBh
xchg al, ah ; 0DDCCBBAAh
Would that not do what is wanted in one register? I see X.J has already posted that (rotate left, rotate right - same result) Gotta be quick to beat you guys! :)
回答3:
An alternative solution, using the rol instruction only:
mov eax,0xAABBCCDDh
rol ax,8 ; 0AABBDDCCh
rol eax,16 ; 0DDCCAABBh
rol ax,8 ; 0DDCCBBAAh
I believe, in most cases, this will be ever so slightly faster than using the xchg instruction, although I see no reason not to simply use bswap, which is cleaner and likely faster.
来源:https://stackoverflow.com/questions/19370775/reverse-byte-order-of-eax-register