回复:https://blog.csdn.net/sinat_27382047/article/details/70339455#plain 我快被这评论系统弄疯了!!!!!!

对了,我还发现一件事情,我以为不用旧的 MASM 的库,因为输入以下的命令都没有编译出错
includelib user32.lib
includelib kernel32.lib
includelib msvcrt.lib
includelib masm32.lib
。。。。。。
直到我输入了:
includelib m.lib   ; 就是我乱写的
也通过了编译... 果然这个命令是假的吧!(其实是 VS 会判断 lib 库是否存在,并包含,不存在就不包含,但不给警告和错误信息。但是包含 inc 文件如果不存在会报错)
然后我改写了您提供的汇编程序:
.model flat,stdcall  
.code  
main PROC  
    mov eax,10000h      ; EAX = 10000h  
    add eax,40000h      ; EAX = 50000h  
    sub eax,20000h      ; EAX = 30000h  
    ret
main ENDP  
END main  
可以通过!!!
然后改成:
.model flat,stdcall  
.code  
start: 
    mov eax,10000h      ; EAX = 10000h  
    add eax,40000h      ; EAX = 50000h  
    sub eax,20000h      ; EAX = 30000h  
    ret
end start
果然也能呢。

但是用 main 汇编函数的方式才可以进行调试, start 这种方式是不能调试的。


您提供的代码中并没有用到 lib 库,ExitProcess 是在前面自定义的汇编函数,而不是库里的。

不,ExitProcess 是存在的,这应该类似于 C++ 里的 extern 扩展外部函数,具体这个函数是在哪,还有待研究




-----------------------------2018-04-29更新---------------------------------------

.MODEL flat,stdcall  
    
;Visual Studio 2017 可以自动链接到相应的 DLL,不需要导入库,但是需要声明要用的函数

ExitProcess PROTO STDCALL :DWORD						;声明需要调用的 API
MessageBoxA PROTO STDCALL :DWORD,:DWORD,:DWORD,:DWORD	;声明需要调用的 API   冒号后面是参数
  
.data

szCaption	db	'恭喜',0
szText		db	'当您看到这个信息的时候,您已经可以编译Win32汇编程序了!',0

.code  

main PROC
	;传入 MessageBoxA API 所需要的四个参数,通过 PUSH 方法,按照从右往左的顺序压入栈中
	push 0h
	push offset szCaption
	push offset szText
	push 0 
	;调用时,会自动从栈中取出四个参数,并执行相应的功能
	call MessageBoxA

	push 0h
    call ExitProcess  
  
main ENDP  
END main  

回复:https://blog.csdn.net/sinat_27382047/article/details/70339455#plain 我快被这评论系统弄疯了!!!!!!_第1张图片

现在已经发现,使用 Visual Studio 2017 写函数,只要声明了 WIndows API 的函数,在编译的时候会自动连接到相应的 DLL ,不需要再手动导入函数(Windows API)库了。

WIndows API 函数声明可以在 masm 的 inc 文件中找到,也可以在 VC++ 的系统头文件中找到,更多的内容就不赘述了。

你可能感兴趣的:(评论)