C++ 在win 7 64位上的visual studio 2012中编写x86汇编代码时出现的问题

C++ 在win 7 64位上的visual studio 2012中编写x86汇编代码时出现的问题,c++,c,visual-studio-2010,visual-studio-2012,assembly,C++,C,Visual Studio 2010,Visual Studio 2012,Assembly,我想创建一个应用程序,用x86汇编语言在控制台中显示字符数组。 我是在VisualStudio2012终极版中编写的。此外,我的Windows是7 64位的。 在编译器中运行时,我的意思是在visual studio中,出现以下错误: main.cpp(8): error C2443: operand size conflict main.cpp(11): error C2432: illegal reference to 16-bit data in 'second operand' 我的

我想创建一个应用程序,用x86汇编语言在控制台中显示字符数组。 我是在VisualStudio2012终极版中编写的。此外,我的Windows是7 64位的。 在编译器中运行时,我的意思是在visual studio中,出现以下错误:

main.cpp(8):  error C2443: operand size conflict
main.cpp(11): error C2432: illegal reference to 16-bit data in 'second operand'
我的代码是:

void main(){
    char nameAndId[] = "name:mohammad mahdi derakhshani .\n";
    int sc=-1;
    while(nameAndId[sc++]!=0){
        _asm{
            push si
line 8:     mov si,sc

            xor edx,edx
line 10:    mov dl,nameAndId[si]
            mov ah,2
            int 21h
            pop si
        }
    }
}

如何解决此问题?

您使用的是
16位SI
寄存器,而不是32位的
ESI

另一方面,我不知道
int21
是否仍然有效,但我建议使用
GetProcAddress
获取指向
writeconolea
api的指针,并调用api,而不是使用旧的d.o.s.函数


第三:循环开始时,
sc
equal-1,因此您引用
nameAndId[-1]
。用
++sc
更改
sc++

那么哪一行是第8行,哪一行是第11行?您至少可以告诉我们错误发生在哪一行。您问题中的汇编代码是实模式DOS代码。我不知道Visual Studio 2012附带的链接器是否能够生成DOS可执行文件,而且您无论如何也无法在Windows 7中直接运行可执行文件。如果您真的想在汇编中编写DOS程序,请使用适合该工作的工具(真正的旧版本的
masm
应该可以工作,就像
tasm
nasm
一样),并获得一个类似于
DOSBox
的模拟器,在其中运行程序。对于汇编程序,在引用地址时使用32位寄存器。那么如何?您能为我修复上面的代码吗?请在此处进行注释。使用
ESI
更改
SI
尝试
mov-dl,name和id[ESI]
,尽管内联汇编在某些情况下受到限制。