我需要交换两个数组:
array1 = [10,9,8,7,6]
array2 = [5,4,3,2,1]
这是我的汇编代码:
.data
array1 DWORD 1, 2, 3, 4, 5
array2 DWORD 6, 7, 8, 9, 10
.code
main proc
mov eax,array2+16
mov edx,array1
mov array1,eax
mov array2+16,edx
mov eax,array2+12
mov edx,array1+4
mov array1+4,eax
mov array2+12,edx
mov eax,array2+8
mov edx,array1+8
mov array1+8,eax
mov array2+8,edx
mov eax,array2+4
mov edx,array1+12
mov array1+12,eax
mov array2+4,edx
mov eax,array2
mov edx,array1+16
mov array1+16,eax
mov array2,edx
在完成所有这些之后,我查看了我的作业说明并且显然是
0是指令中应使用的唯一立即/字面值 我也只能使用
sub
和mov
说明。
我只需要知道我是否需要改变任何东西。
答案 0 :(得分:1)
此任务的约束是:
sub
和mov
是唯一可以使用的说明因为数组在内存中互相跟随,所以我会从第二个数组开始使用2个指针。
array1 DWORD 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
^ ^
| |
array1 array2 = ESI = EDI
指向第一个数组的指针将预先递减,而指向第二个数组的指针将后递增。
对于递减,即减1,我将加载第一个数组的第一个值恰好是1.方便!
对于递增,即加1 而且减去-1 ,我将从我允许使用的直接0中减去相同的1。
因为数组包含 dwords ,所以它足以重复递减/递增 4 次。
交换本身与您在程序中的操作类似。
; Setup
mov ecx, array1 ; ECX=1
mov edx, 0
sub edx, ecx ; EDX=-1
mov esi, offset array2
mov edi, offset array2
; Swap array1[4] with array2[0]
sub esi, ecx ; Pre-decrement on ESI (first array)
sub esi, ecx ; Pre-decrement on ESI (first array)
sub esi, ecx ; Pre-decrement on ESI (first array)
sub esi, ecx ; Pre-decrement on ESI (first array)
mov eax, [esi]
mov ebx, [edi]
mov [edi], eax
mov [esi], ebx
sub edi, edx ; Post-increment on EDI (second array)
sub edi, edx ; Post-increment on EDI (second array)
sub edi, edx ; Post-increment on EDI (second array)
sub edi, edx ; Post-increment on EDI (second array)
; Swap array1[3] with array2[1]
...
由于严格的限制,它无法构建循环。你必须重写最后一段代码5次。
通过几行额外设置,您可以分配ECX=4
和EDX=-4
。这样,预减量和后增量变为每个单个指令。这将削减约25条指令
在查看以下片段之前先试试自己!
sub ecx,edx; ECX = 2
sub ecx,edx; ECX = 3
sub ecx,edx; ECX = 4
mov edx,0
sub edx,ecx; EDX = -4