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

2024-02-05

在 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(使用前将#替换为@)

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

随机推荐