Masm的汇编

; Hello.asm
; 使用 Win32ASM 写的 Hello, world 程序
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; ml /c /coff Hello.asm
; Link /subsystem:windows Hello.obj
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
		.386
		.model flat,stdcall
		option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include		windows.inc
include		user32.inc
includelib	user32.lib
include		kernel32.inc
includelib	kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
		.data
szCaption	db	'A MessageBox !',0
szText		db	'Hello, World !',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
		.code
start:
		invoke	MessageBox,NULL,offset szText,offset szCaption,MB_OK
		invoke	ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
		end	start

  .386代表了指令集(带p代表可以使用特权指令)

      .model 内存模式[,语言模式][,其他模式]               (内存模式影响最后生成的可执行文件的大小,win32只有一种flat模式即程序只有一个段      语言模式,为程序的是用什么类型实现,如调用子程序时是被调用程序压栈,还是调用程序压)

    .date .stack等伪指令的分段是因为有分页机制,会定义这个段的属性,与段寄存器那个段不是一个意思。

     invole 函数名[参数名]即为调用API,即push a,push b,call之类的。

    win32汇编很多与c语言很像

 

 

变量:

      全局变量和局部变量:标号:目的指令                                      标号是局部变量,只对函数可见,

                             标号::目的指令                                   标号是全局变量   

                             不能从一个函数跳到另一个局部标号

                              @@可以表示标号名,可以用@F或@B引用,这个标号名可以重复使用

                     局部变量的实现,即将其压入栈中,用ebp来表示局部变量

                        对局部变量取地址时,用addr指令,为lea eax ,[ebp-4]

                                                                       push eax

       

posted @ 2016-05-11 22:10  xhyxhy  阅读(356)  评论(0编辑  收藏  举报