首页 > 解决方案 > 使用内联汇编交换数组中的 2 个整数会导致奇怪的内存值

问题描述

     int Perm[4326];

      
        __asm
{                   MOV EBX, 6
        FACT:       MOV Perm[4320 + EBX * 4], EBX     
                    DEC EBX
                    TEST EBX, EBX
                    JE FACTEND
                    JMP FACT
        FACTEND:     // This puts the numbers 1,2,3,4,5,6 in Perm[4320]...Perm[4325]
                    //In between there are is some recursion that's not relevant
                    MOV EBX, 2
                    XOR ESI,ESI
                    MOV EAX, Perm[EBX*4+4319]
                    TEST AL,1
                    JZ EVEN             
                    MOV ECX, Perm[4320]
                    MOV Perm[4320], EAX
                    MOV Perm[EBX * 4 + 4319], ECX
                    JMP KLOOP
       EVEN:        MOV ECX, Perm[ESI * 4 + 4320]
                    MOV Perm[ESI*4 + 4320], EAX             
                    MOV Perm[EBX * 4 + 4319], ECX
       KLOOP:       INC ESI

从 Perm[4321] 到 Perm [4325] 的内存看起来像这样:

01000000 02000000 03000000 04000000 05000000 06000000

我正在苦苦挣扎的是

MOV EAX, Perm[EBX*4+4319] 结果 EAX 为 00000002

而 MOV ECX Perm[4320*4] 结果 ECX 为 01000000

并且在交换(偶数标签)之后,内存变为

00000002 00000000 03010000 04000000 05000000 06000000

我正在尝试在汇编中实现用于数组排列的堆算法,在本例中为 int 数组。

由于这是小端序,因此 1 在内存中写为 01000000 是没有意义的,因为它应该是 00 00 00 01 ,我也不明白为什么我会用看似相同的指令得到 2 个不同的结果( MOV EAX、Perm 和 MOV ECX、Perm)

标签: visual-c++x86swapinline-assembly

解决方案


推荐阅读