【问题标题】:Tring to print Hello World in Assembly with Virtual Studio使用 Virtual Studio 在 Assembly 中打印 Hello World
【发布时间】: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库,但是不知道怎么解决。

我将不胜感激。

【问题讨论】:

    标签: assembly x86


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-16
      • 1970-01-01
      • 2015-05-04
      • 2018-03-11
      • 2014-01-10
      • 2013-08-23
      • 1970-01-01
      相关资源
      最近更新 更多