Assembly 这个汇编程序有什么问题?

Assembly 这个汇编程序有什么问题?,assembly,Assembly,我对汇编语言编程非常陌生,所以这可能是一个非常明显的错误,但是 我使用MSVC++,当我编译任何具有.asm扩展名的文件的项目时,它使用规则 NAME EXTENSIONS COMMAND LINE RULE FILE MASM *.asm ml.exe \c [All Options] [Additional Opti... C:\Program Files\Microsoft Visual

我对汇编语言编程非常陌生,所以这可能是一个非常明显的错误,但是

我使用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

所以我只是想知道,部分代码中是否有明显的错误,或者是编译器弄糟了。

您需要使用
语句。尝试顶部的
段代码。

尝试以下方法:

.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
.model small
.code
main:
  mov ax, 10
end main

我认为代码需要一些指令,请尝试以下操作:

.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
.model small
.code
main:
  mov ax, 10
end main
这里,.model表示我们将使用一个“小”内存程序模型,.code表示以下几行是可执行代码

编辑: 好的,还有一个例子应该运行Ok

; 
  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

(我取自)

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

使用下面的ML和链接行,这似乎对我有效
ml/coff/c测试。asm
链路/子系统:控制台测试。obj

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

通过快速浏览,VS.NET下的程序集似乎非常少见,您必须设置自定义生成规则。您可以在此处找到一个示例:

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


如果您计划在C/C++项目的关键部分计时时使用小的程序集段,我建议您在决定使用完全手工编码的程序集文件之前仔细查看编译器内部函数()。

如果我在第一行之前添加“segement CODE”,则无法工作。我会收到不同的错误,第7行有一个错误“符号类型冲突”和第15行关于“\coff”开关和前导下划线的一个。我得到一个关于\coff开关和前导下划线的警告,然后它有一个运行时错误。您能详细说明MAKEIT.bay的构建吗?它在项目菜单上的确切位置吗?