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