2017-01-22 98 views
-1

我是新来的组装和我决定实现一些简单的功能使用内联汇编图表,我开始与这是应该的邻接矩阵的所有元素初始化为0的构造,但我不明白我做错了什么问题与内联汇编在Visual Studio C++

struct graph { 
int el[MAX_V][MAX_V]; 
int noVert; 
int noEdges; 
bool directed; 

graph() { 
    _asm { 

    mov  ebx, 0 
    mov  esi, MAX_V 
    mov  edi, this 
START_L1: 
    cmp  ebx, MAX_V 
    je  END_L1 

    mov  ecx, 0 
    START_L2: 
    cmp  ecx, MAX_V 
    je  END_L2 

    mov  eax, ebx 
    imul esi 
    add  eax, ecx 
    mov  [edi + eax*4], dword ptr 0 

    inc  ecx 
    jmp  START_L2; 
    END_L2: 

    inc  ebx 
    jmp  START_L1 
END_L1: 

    } 
} 
} 

当我使用调试器我发现,执行该指令后,我更新了el阵列的INT元素包含非零值:

mov  [edi + eax*4], dword ptr 0 

为什么我getti放置在el阵列在该指令之后纳克非零int值?我期待我正在更新的索引处的整数设置为零。

+2

因此,[它不工作(http://meta.stackexchange.com/q/147616/333362)? – wally

+0

这是行不通的,在调试它取代了内存的某些部分与一些随机变量,这就是它 –

+2

什么是它应该做的?请张贴足够的信息来复制问题。东西我可以复制并粘贴到Visual Studio,编译和与你所期望的细节你有什么调试将使这个问题比较容易回答。 – wally

回答

3

当使用微软的Intel语法与dword ptr预选赛应指定的内存操作数的大小,而不是直接的价值。

这条线是一个问题:

mov  [edi + eax*4], dword ptr 0 

虽然你对眼前的价值0指定dword ptr微软编译器/汇编器会意识到0可以容纳一个字节,并会发出指令为:

mov  byte ptr [edi+eax*4], 0 

你真正想要做的是告诉编译器/汇编程序,在内存操作数项的大小是32位的DWORD。要做到这一点修改指令是:

mov  dword ptr [edi + eax*4], 0 

的原因,你的代码似乎有垃圾数组中,因为只有每个数组元素的最低显著字节被设置为0


除非这是一个任务是要你这样的代码,你真的应该使用C++代码零出数组。它也将使这个代码更易于维护和阅读。如果使用合理的优化级别,编译器应该能够生成高效的代码来进行调零。