我正在上一門關于匯編語言的課程,我遇到了這個問題,它使用回圈和 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
uj5u.com熱心網友回復:
在具有 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
uj5u.com熱心網友回復:
在 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 位變體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/534300.html
標籤:Intel Collective 数组循环部件x86masm
上一篇:如何將這段代碼轉換成匯編語言
