WIN32汇编学习笔记(一)

工具选择

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

helloworld与基本框架

.386
.model flat, stdcall
option casemap:none

include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib

.data
    szCaption db 'Hi', 0
    szMsg     db 'Hello World!', 0

.code
start:
    invoke MessageBox, NULL, addr szMsg, addr szCaption, MB_OK
    invoke ExitProcess, NULL
end 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值