程序集中的procs:main:nop vs main proc

时间:2013-01-18 03:26:27

标签: c++ assembly

我正在使用visual c ++ express编译器来编译asm32:

; Example assembly language program -- adds 158 to number in memory
; Author:  R. Detmer
; Date:    1/2008

.586
.MODEL FLAT

.STACK  4096            ; reserve 4096-byte stack

.DATA                   ; reserve storage for data
number  DWORD   -105
sum     DWORD   ?

.CODE                           ; start of main program code
main    PROC
        mov     eax, number     ; first number to EAX
        add     eax, 158        ; add 158
        mov     sum, eax        ; sum to memory

        mov   eax, 0            ; exit with return code 0
        ret
main    ENDP

END                             ; end of source code

上面给出了一个链接错误,而这个:

..
.CODE                           ; start of main program code
main:nop    
        mov     eax, number     ; first number to EAX
        add     eax, 158        ; add 158
        mov     sum, eax        ; sum to memory

        mov   eax, 0            ; exit with return code 0
        ret
end main                          ; end of source code
..

非常有用!

唯一的区别是main:nop vs main proc

这两者之间有什么区别?为什么一个被end main关闭而另一个被main endp main关闭?

这是我得到的错误:

1>------ Build started: Project: asm1, Configuration: Release Win32 ------
1>  Assembling [Inputs]...
1>LINK : error LNK2001: unresolved external symbol _WinMainCRTStartup
1>C:\Users\...\Downloads\asm1\Release\asm1.exe : fatal error LNK1120: 1 unresolved externals

2 个答案:

答案 0 :(得分:3)

它与PROC指令没有任何关系。您的原始代码缺少“' main' END指令的操作数。其中指定了程序的入口点。如果没有,链接器将尝试查找可执行文件_WinMainCRTStartup的默认入口点。而这失败是因为你没有那个并且没有连接CRT。

修正:

main    PROC
        ; etc...
main    ENDP

END     main

答案 1 :(得分:1)

Hans Passant绝对正确。

此外,您可能会发现这些链接很有用: