在MASM中交换两个数组

时间:2018-04-05 19:27:50

标签: assembly x86 masm

我需要交换两个数组:

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是指令中应使用的唯一立即/字面值   我也只能使用submov说明。

我只需要知道我是否需要改变任何东西。

1 个答案:

答案 0 :(得分:1)

此任务的约束是:

  • 0是唯一可以使用的立即/文字值
  • submov是唯一可以使用的说明

因为数组在内存中互相跟随,所以我会从第二个数组开始使用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=4EDX=-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