寄存器有EAX,EBX,ECX,EDX,EDI,ESI,ESP,EBP。
EAX是WIN32 API 默认的返回值存放处。
ECX是LOOP指令自动减一的寄存器。
ESP是堆栈指针。
EBP经常用来在堆栈中寻址。
Masm32安装成功以后,路径如下:
\masm32:IDE环境,内带有文本编辑程序和模板生成程序
\masm32\include:所有的头文件
\masm32\lib:所有的导入库文件
\masm32\bin:可执行文件目录,包括Ml.exe,Link.exe,Rc.exe等。
\masm32\help:帮助文档
用ml.exe 将.asm源码生成.obj文件。
rc.exe:编译资源文件,把资源脚本文件rc编译生成生成.res文件。
link.exe:链接程序,生成exe,dll文件等。
把资源文件和.obj文件链接起来生成可执行文件,也就是pe格式的文件,在链接的时候加上/coff命令。
WIN32中内存是平坦的,对于每个程序来说都可以使用2G范围的地址,但各个程序之间并不会干扰。
Windows为每个程序安排了堆栈段,它是从高地址向低地址延伸的,之所以采用这种方式,是因为这样可以使堆栈指针始终指向最近入栈的元素的起始地址,这样的话,为访问这个元素提供了非常便利的方式。
ptr 显式指定后面的数据的类型
offset 全局变量的地址
addr 局部变量的地址,也可以用在全局变量上
local 定义局部变量
proc 定义子程序
proto 声明子程序
Win32下,
系统功能模块放在Windows的动态链接库(DLL)中
作为Win32 API核心的3个DLL:
KERNEL32.DLL 系统服务功能。
GDI32.DLL 图形设备接口。
USER32.DLL 用户接口服务。
对于汇编语言来说,Win32 API函数返回值的类型只有dword一种类型,它永远放在eax中。
如果要返回的内容在一个eax中放不下,Win32 API采用如下方法来解决:
a) 一般是eax中返回一个指向返回数据的指针;
b) 在调用参数中提供一个缓冲区地址,数据直接返回到这个缓冲区中去。类似变参的概念;
.data
已初始化数据段,可读可写的已定义变量;
当程序装入完成时,这些值就已经在内存中;
.data?
未初始化数据段,可读可写的未定义变量,在可执行文件中不占空间;
.const
常量,可读不可写的变量;
Win32中,数据段是不可执行的,只有代码段有可执行的属性;
对于运行在特权级3的应用程序,.code段不可写。除非把可执行文件PE头部中的属性位改成可写;
对于运行在特权级0的程序,所有的段都有读写权限,包括代码段;