使用 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.cppMyAssembly.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 messagemessage 应该在数据段中并且没有 : 。由于有.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)

NX二次开发-UFUN获取当前工作部件tag UF_ASSEM_ask_work_part

NX二次开发-UFUN替换组件UF_ASSEM_use_alternate