使用Virtual Studio在Assembly中打印Hello World

时间:2017-05-01 17:55:22

标签: assembly x86

我开始通过观察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 个答案:

答案 0 :(得分:0)

.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