gpt4 book ai didi

assembly - EAX 寄存器的反转字节顺序

转载 作者:行者123 更新时间:2023-12-02 19:22:43 25 4
gpt4 key购买 nike

示例: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

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

最佳答案

为什么不简单地:

 mov  eax, 0AABBCCDDh
bswap eax

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

这个:

XOR BYTE PTR [eax], al 

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

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

    xchg  ah, al
ror eax, 16
xchg ah, al.

关于assembly - EAX 寄存器的反转字节顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19370775/

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