我对汇编语言编程很新,所以它可能是一个非常明显的错误,但是......
我使用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
所以我只是想知道,部分代码中是否存在明显的错误,或者是编译器搞砸了。
答案 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