在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 :
}
答案 0 :(得分:1)
Google错误消息。答案是right there in MS's documentation(第一次google点击)。
非法引用'identifier'
中的16位数据16位寄存器用作索引或基址寄存器。编译器 不支持引用16位数据。 16位寄存器不能 在编译32位代码时用作索引或基址寄存器。
第一段有点令人困惑,因为听起来问题是16位操作数大小,而不是16位地址大小。但是第二段明确表示:它拒绝使用地址大小前缀来组合类似mov ax, [si]
的内容,因为忽略地址的upper16对于内联asm来说并不是一件有用的事情。
他们认为在编译时捕获类似错别字错误比发出崩溃代码更好。
可能只需将行更改为mov ax, [tab]
。你没有从esi
中存储地址获得任何收益,因为你没有修改它。