使用 Virtual Studio 在 Assembly 中打印 Hello World
Posted
技术标签:
【中文标题】使用 Virtual Studio 在 Assembly 中打印 Hello World【英文标题】:Tring to print Hello World in Assembly with Virtual Studio 【发布时间】:2017-09-29 03:35:55 【问题描述】:我通过观看 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库,但是不知道怎么解决。
我将不胜感激。
【问题讨论】:
【参考方案1】:.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
【讨论】:
以上是关于使用 Virtual Studio 在 Assembly 中打印 Hello World的主要内容,如果未能解决你的问题,请参考以下文章
【求助】关于UF_ASSEM_add_part_to_assembly
为Virtual Studio Code配置Python调试插件(Ubuntu14.04)
Virtual Studio 2013 每次加载程序(dll)缓慢的问题
UFUN函数 UF_ASSEM UF_PART函数(UF_ASSEM_ask_work_part,UF_PART_ask_part_name)