在 Visual Studio 中,当我用 C 编译 __asm 时,我收到此错误。有人知道这段代码有什么问题吗?我尝试了一切,但没有任何效果。我正在尝试在装配中实现冒泡排序。
unsigned short i = 0;
unsigned short j = 0;
unsigned short max = short(N-2);
unsigned short tab[5];
tab[0] = 54;
tab[1] = 123;
tab[2] = 342;
tab[3] = 5436;
tab[4] = 1234;
unsigned short a = 0;
__asm {
loop1:
inc i
mov j, 0
mov si, tab
loop2:
mov ax, [si] // <- Error C2432 on this line
mov a, ax
inc j
mov ax, j
mov bx, max
cmp ax, bx
jz cdnloop2
loop loop2
cdnloop2:
mov ax, i
mov bx, max
cmp ax, bx
jz endof
loop loop1
endof :
}
谷歌一下错误信息。答案是就在 MS 的文档中 https://msdn.microsoft.com/en-us/library/5zyca2kh.aspx(第一个谷歌点击)。
非法引用“标识符”中的 16 位数据
16 位寄存器用作索引或基址寄存器。编译器
不支持引用 16 位数据。 16位寄存器不能
编译 32 位代码时用作索引或基址寄存器。
第一段有点令人困惑,因为听起来问题是 16 位操作数大小,而不是 16 位地址大小。但第二段说得很清楚:它拒绝使用地址大小前缀来组装类似的东西mov ax, [si]
,因为在内联汇编中忽略地址的 upper16 并不是一件有用的事情。
他们认为最好在编译时捕获类似的拼写错误/错误,而不是发出崩溃的代码。
可能只是将行更改为mov ax, [tab]
。您不会从将地址存储在中获得任何东西esi
,因为你没有修改它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)