这个装配程序有什么问题?

时间:2009-06-30 04:27:39

标签: assembly

我对汇编语言编程很新,所以它可能是一个非常明显的错误,但是......

我使用MSVC ++,当我编译任何具有扩展名为.asm的文件的项目时,它使用规则

NAME    EXTENSIONS    COMMAND LINE                                  RULE FILE
MASM    *.asm         ml.exe \c [All Options] [Additional Opti...   C:\Program Files\Microsoft Visual St...

为了确保编译器正常工作,我尝试了代码

main proc
  mov ax, 10
main endp
end main

但是当我编译它时,我得到三个错误

.\compt1.asm(1) : error A2034:must be in segment block : main
.\compt1.asm(2) : error A2034:must be in segment block
.\compt1.asm(3) : fatal error A1010:unmatched block nesting : main

所以我只是想知道,部分代码中是否存在明显的错误,或者是编译器搞砸了。

6 个答案:

答案 0 :(得分:1)

试试这个:

.model small
.stack
.data
message   db "Hello world!", "$"

.code

main   proc
   mov   ax,seg message
   mov   ds,ax

   mov   ah,09
   lea   dx,message
   int   21h

   mov   ax,4c00h
   int   21h
main   endp
end main

答案 1 :(得分:1)

我认为代码需要一些指令,试试这个:

.model small
.code
main:
  mov ax, 10
end main

在这里,.model说我们将使用“小”内存程序模型,而.code表示以下行是可执行代码。

编辑: 好的,还有另一个例子应该运行正常。

; 
  include \masm32\include\masm32rt.inc
;

comment * -----------------------------------------------------
                 Build this console app with
              "MAKEIT.BAT" on the PROJECT menu.
        ----------------------------------------------------- *

  .data?
    value dd ?

  .data
    item dd 0

  .code

start:

; -------------------------------------------------------------------------

  call main
  inkey        ; wait for a keystroke before exiting
  exit

; -------------------------------------------------------------------------

main proc

  print "Hello World",13,10
  ret

main endp

; -------------------------------------------------------------------------

end start

(我是从here获得的)

答案 2 :(得分:1)

在代码之前缺少“.code”指令,以使MASM知道这应该在代码段中。除此之外,您不会以任何方式从代码返回,因此CPU幸福地尝试执行任何字节,就好像它们是可执行代码一样。难怪它在跑步后崩溃。

答案 3 :(得分:1)

从快速浏览看,VS.NET下的程序集似乎不常见,您必须设置自定义构建规则。您可以在此处找到示例: http://www.cs.virginia.edu/~evans/cs216/guides/vsasm.html

出于好奇,你想要完成什么?如果您只是为了好玩或者学习汇编语言,那么使用专用的汇编编辑器可能会更好。 The MASM32 SDK就是这样一种选择。然后,您可以链接到从Visual Studio项目创建的库。

如果您计划在C / C ++项目的时间关键部分中使用小部分程序集,我建议您在决定之前仔细查看编译器内在函数( http://msdn.microsoft.com/en-us/library/26td21ds.aspx)使用完全手工编码的汇编文件。

答案 4 :(得分:0)

您需要使用segment声明。点击顶部的segment CODE

答案 5 :(得分:0)

这似乎对我有用,使用以下ML和LINK线 ml / coff / c test.asm
链接/子系统:console test.obj

TITLE Test app
.386
.MODEL flat, stdcall
.STACK 4096
; --------------------
.code
main PROC
ret
main ENDP
; --------------------
END main