我开始通过观察tutorial来学习汇编语言,我们在其中使用Visual Studio。正如我所理解的那样,这里我们通过使用Win32的C ++库运行我们的汇编代码(我对C语言知之甚少,而C ++上没有)。因此,在编写程序集时,我们会打开两个文件:Mainer.cpp
和MyAssembly.asm
。
Mainer.cpp
:
extern "C" void doit();
void main()
{
doit();
}
MyAssembly.asm
:
.586
.model flat, c
.stack 100h
.data
.code
doit proc
doit endp
end
我一直在玩我在这里和那里学到的东西,最后我想打印'Hello, World'
(在上面的教程中没有完成)。我在这里:
.586
.model flat, c
.stack 100h
.data
global _main
extern _printf
.code
doit proc
_main:
push message
call _printf
add esp, 4
ret
message:
db 'Hello, World', 10, 0
doit endp
end
但是在尝试调试时我遇到了以下错误:
错误1错误A2071:初始化程序数量对于指定大小而言太大
错误2错误:全局:错误A2008
错误3错误A2071:初始化程序数量对于指定大小而言太大
错误4错误:在指令中:错误A2008
错误5错误A2071:初始化程序数量对于指定大小而言太大
错误6错误A2006:未定义的符号:_printf
查看最后一个错误它似乎没有链接到C库,但我不知道如何解决这个问题。
我很感激任何帮助。
答案 0 :(得分:0)
.model flat,c
使用' c'命名,因此不需要下划线前缀。 push message
应为push offset message
。 message
应位于数据段中且不包含:
。由于存在.cpp源(mainer.cpp),因此将创建默认堆栈段,并且汇编代码不需要指定堆栈段。
.586p
.model flat,c
.data ; initialized data
message db 'Hello, World', 10, 0
.code ; code
extern printf:near
doit proc
push offset message
call printf
add esp, 4
xor eax,eax
ret
doit endp
end