使用汇编语言中的循环和xchg指令交换数组中的元素



我正在上一门关于汇编语言的课程,我遇到了这个问题,它是使用循环和xchg指令来交换数组中的所有元素数组是这样的inputStr包含这些元素"A"、"B","C","D","E","F","G","H"。在使用循环和xchg之后,它必须看起来像"G","H","E","F","C","D","A","B"。

我已经试过很多次了,但是我的输出是不对的。我想不出其中的逻辑,也不知道该怎么做。

这是我的代码,它在x86

.386
.model flat, stdcall
.stack 4096
ExitProcess PROTO, dwExitCode: DWORD
.data
inputStr BYTE "A", "B", "C", "D", "E", "F", "G", "H"
.code
main PROC
mov ecx, 8
xor ebx, ebx
mov ebx, offset inputStr

l1:
xor eax, eax
mov al, [ebx]
add ebx, ecx
sub ebx, 2
xchg al, [ebx]
add ebx, 1
sub ebx, ecx
xchg al, [ebx]
inc ebx
dec ecx

loop l1

INVOKE ExitProcess, 0
main ENDP
END main

在有N个元素的数组中,为了进行反转,您可以执行N/2交换。如果你把元素配对,就像你从一个(N/2)个元素的数组开始,所以交换的次数变成(N/2)/2。

显然,您需要使用loopxchg指令。两者都非常慢,所以也没有理由在下一个代码中使用更好的movzx:

mov  ecx, (8 / 2) / 2        ; Number of swaps
mov  ebx, offset inputStr
T1:
mov  ax, [ebx]               ; Reading a pair
xchg ax, [ebx + ecx * 4 - 2] ; Swapping a pair
mov  [ebx], ax               ; Writing a pair
add  ebx, 2
loop T1

迭代实际做什么:

"A", "B", "C", "D", "E", "F", "G", "H"
<---------------- 8 ----------------->
ECX=2   "G", "H", "C", "D", "E", "F", "A", "B"
^                             ^
EBX                           EBX + 2 * 4 - 2
^
ECX
"G", "H", "C", "D", "E", "F", "A", "B"
<------ 4 ------->
ECX=1   "G", "H", "E", "F", "C", "D", "A", "B"
^         ^
EBX       EBX + 1 * 4 - 2
^
ECX
ECX=0

在64位中,可以像这样简单:

ITEMS = 8
inputList WORD "A", "B", "C", "D", "E", "F", "G", "H"
mov rbx, inputList
mov ecx, ITEMS/2/2
@@:
mov eax, [rbx]
xchg [rbx+rcx*8-4], eax
mov [rbx], eax
add rbx, 4
loop @B

它只是通过XCHG对2字节的元素产生所需的结果。

从这里你应该能够很容易地使用AX而不是RAX构造16位的变体。

最新更新