C++ 在win 7 64位上的visual studio 2012中编写x86汇编代码时出现的问题
我想创建一个应用程序,用x86汇编语言在控制台中显示字符数组。 我是在VisualStudio2012终极版中编写的。此外,我的Windows是7 64位的。 在编译器中运行时,我的意思是在visual studio中,出现以下错误: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' 我的
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]
,尽管内联汇编在某些情况下受到限制。