2024年3月31日发(作者:)

MASM32

Introduction to Assembler ................................................................................................................... 2

MASM Reference ............................................................................................................................. 11

宏参考MACRO Reference ...................................................................................................... 11

伪指令参考 .............................................................................................................................. 16

语法参考 .................................................................................................................................. 30

其它参考 .......................................................................................................................................... 36

寄存器大全 .............................................................................................................................. 36

标志寄存器 Processor Flags ................................................................................................... 36

80位数据寄存器Stack of 80-bit Data Registers ..................................................................... 37

Ascii 字符表Ascii Characters ................................................................................................. 38

奔腾指令优化参考. 39

调用格式Calling Conventions ................................................................................................. 42

命令行工具Command Line Tools ........................................................................................... 42

Introduction to Assembler

汇编概述

直线内存模式FLAT Memory Model

32位(二进制位,bit。下同)Windows程序使用“直线内存模式”。这样的程序实际只有一

个段,包括程序的所有代码和数据,而且只能在386以上的INTEL处理器上运行。早期的

16位程序使用段和偏移来代表地址,每个段的大小不能超过64KB,而“直线内存模式”只

有偏移,它的大小是4G,即0XFFFFFFFF,这种地址表示方式使汇编程序更易于开发。

在FLAT模式下,所有的段寄存器都自动设置成为同一个值,32位Windows程序中段/偏移

形式的地址在不是必须的。对于DOS程序员来说,32位Windows PE格式的应用程序好象

是.COM程序一样,使用单一的段包括了代码和数据,只操作偏移地址,而不是用段/偏移地

址。

直线内存模式时,应用程序在4G内存空间内所有的引用都是近程地址(NEAR code

addressing)和近程数据(NEAR data addressing)。GS和FS段寄存器在普通的FLAT模式应

用程序中并不使用,一般是操作系统用于操作实例(used in instances)。

保护模式内存Protected Mode Memory

DOS是真实地址内存模式,这样应用程序可能改写操作系统的代码,而引起系统瘫痪。例如

在编写CGA(注:早期显示模式,显示缓存地址在B800处开始)程序时,使用B800内存

区域,如果LOOP循环写的不对,就可能改写高位内存中的DOS代码或BIOS设置,造成死

机。设计保护模式就是用来防止这样的事情发生,内存管理器控制并保护应用程序访问的地

址,阻止应用程序访问没有权限的内存区域。16位Windows是模拟多任务的操作系统,它

的应用程序也可能改写其它应用程序甚至是操作系统的内存。

改写了操作系统代码,应用程序调用某个系统函数时就会引起死机,最常见的就是“蓝屏”

(注:Windows95/98常见故障)死机。如果开发的应用程序本身存在逻辑混乱,应该是一个

“黑屏”死机。

更改硬件、在多任务基础上使用硬件的时候,保护模式会更加可靠。因为汇编语言编程时允

许读写任何地址,所以要留心读写的句柄和地址。如果分配了10K内存来读而却试图读20K

内容,就会引起页错误。也可能因为使用变量或寄存器指向的地址超出了应用程序权限范围,

而引起内存读写失败。操作系统会将页异常传递给造成出错的应用程序,如果应用程序没有

处理异常,操作系统就会关闭应用程序。这给应用程序提供一个在保护模式下,得到有读写

权限的地址范围的一种方法。

操作数Instruction Operands

操作数被用来做汇编指令助记符(mnemonic)中的参数。一条指令可能有0到3个操作数,

有两个操作数的逻辑或数学指令当中,位于右边的是源操作数,左边的是目的操作数。如

mov eax,1;mov是汇编代码助记符,eax是目的操作数,1是源操作数。指令的操作结果是

将1放入eax。在其它处理器的汇编语言中,操作数使用顺序不同的都会特别注明。

指令码和助记符Opcodes and Mnemonics

Intel极兼容处理器的硬件层面,内建指令(instructions)叫opcodes(注:二进制的指令码),以