错误C2432非法引用__asm的“第二个操作数”中的16位数据

时间:2015-11-20 22:04:04

标签: c visual-studio assembly inline-assembly 32-bit

在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 :
}

1 个答案:

答案 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中存储地址获得任何收益,因为你没有修改它。