visual studio c ++中的内联汇编问题

时间:2017-01-22 17:10:24

标签: c++ visual-c++ assembly x86 inline-assembly

我是汇编的新手,我决定使用内联汇编为图形实现一些简单的函数,我开始使用构造函数,它应该将邻接矩阵的所有元素初始化为0,但我不明白是什么我做错了

el

当我使用调试器时,我发现在执行此指令后,我正在更新的mov [edi + eax*4], dword ptr 0 数组的int元素包含非零值:

el

为什么在此指令之后我在Sleep数组中放置了非零的int值?我希望我正在更新的索引处的整数设置为零。

1 个答案:

答案 0 :(得分:3)

当使用Microsoft的英特尔语法和dword ptr限定符时,您应该在内存操作数上指定大小,而不是直接值。

这一行是个问题:

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

虽然您在立即值dword ptr上指定0,但Microsoft编译器/汇编器将意识到0可以放入一个字节并将发出指令:

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

您真正想要做的是告诉编译器/汇编器内存操作数中项的大小是32位DWORD。为此,请将指令修改为:

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

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

除非这是一个要求您以这种方式编码的赋值,否则您应该使用 C ++ 代码将数组清零。它还将使此代码更易于维护和读取。如果使用合理的优化级别,编译器应该能够生成有效的代码来进行调零。