我正在上一门关于汇编语言的课程,我遇到了这个问题,它是使用循环和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。
显然,您需要使用loop
和xchg
指令。两者都非常慢,所以也没有理由在下一个代码中使用更好的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位的变体。