WIN32汇编学习笔记(一)

来源:互联网 发布:50知天命60耳顺 编辑:程序博客网 时间:2024/05/19 18:16

工具选择

目前发现RadASM比较好用,代码补全和高亮好评,可以修改配色。

helloworld与基本框架

.386.model flat, stdcalloption casemap:noneinclude windows.incinclude user32.incinclude kernel32.incincludelib user32.libincludelib kernel32.lib.data    szCaption db 'Hi', 0    szMsg     db 'Hello World!', 0.codestart:    invoke MessageBox, NULL, addr szMsg, addr szCaption, MB_OK    invoke ExitProcess, NULLend start

  .386指定指令集,类似的还有.8086(dos汇编下的默认指令集),.186,.286,.386/.386p,.486/.486p,.586/.586p。带p的伪指令表示程序中可以使用特权指令。

  如果要在程序中使用MMX指令进行图像处理,还需要加上.MMX伪指令,如:
.586
.mmx

  .model指定内存模式,win32下只有flat一种,所有的数据和代码都位于4GB的一个段中。如果定义了.model flat,MASM会自动为段寄存器进行如下定义:
ASSUME cs:flat,ds:flat,ss:flat,es:flat,fs:error,gs:error
 即默认不使用fs和gs寄存器,如果在程序中进行使用就会得到一个错误。要使用的话可以显示地指定fs:nothing或fs:flat,这样就可以把这个错误留给有需要的人。

  option语句的选项不少,不过常用的只有casemap:none这一个选项,用于指定大小写敏感。因为windows API 是区分大小写的,不打开的话出问题的概率会比较大。

简化段伪指令的格式如下表:

简化段伪指令 功 能 注释 .CODE [段名] 创建一个代码段 段名为可选项,如不给出段名,则采用默认段名。对于多个代码段的模型,则应为每个代码段指定段名。 .DATA 创建一个数据段 段名是:_DATA .DATA? 创建无初值变量的数据段 段名是:_BSS .FARDATA [段名] 建立有初值的远调用数据段 可指定段名,如不指定,则将以FAR_DATA命名。 .FARDATA? [段名] 建立无初值的远调用数据段 可指定段名,如不指定,则将以FAR_BSS命名。 .CONST 建立只读的常量数据段 段名是:CONST .STACK [大小] 创建一个堆栈段并指定堆栈段大小 段名是:stack。如不指定堆栈段大小,则缺省值为1KB

  值得注意的是,在.model flat模式中的段其实是对一整块儿内存的分段,因为32位的寄存器寻址能力以及超过了4GB,理论上来说是不需要段的,这种分段是为了编程时的方便,可以避免一些不必要的错误。

  ctrl+F5构建并运行此程序。hello world

done

0 0
原创粉丝点击