Win32汇编语言程序设计 - 基础组成


一个基础的汇编语言示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
TITLE 汇编语言示例程序

; 程序的描述:打印字符串"hello world!\n"
; 作者:shigc
; 创建日期:2022-02-13

.386
.model flat,stdcall
option casemap :none ; 大小写敏感
.stack 4096

include masm32.inc
include kernel32.inc

includelib masm32.lib
includelib kernel32.lib

.data
szHello BYTE "hello world!",0dh,0ah,0

.code
main PROC
invoke StdOut, addr szHello
invoke ExitProcess,0
main ENDP
END main

说明:

  • TITLE伪指令将整行标记为注释,改行可以放置任何东西
  • 分号是注释符号,编译器会忽略分号右边的所有文本
  • .386 指出该程序要求的最低CPU(Intel 386)
  • .model 伪指令用于设置程序的内存模型,flat为Windows程序使用的模式(代码和数据使用同一个4GB段),stdcall为API调用时右边的参数先入栈
  • option casemap :none 设置符号(函数和变量)大小写敏感,但是汇编指令还是不区分大小写的
  • .stack 4096 设置堆栈大小为4096,默认值1024
  • include masm32.inc 用于从masm32.inc文件中复制必需的定义和设置信息,查找目录为INCLUDE环境变量定义的目录
  • includelib masm32.lib用于链接过程中从对应静态库中链接对应的符号,查找目录为LIB环境变量定义的目录
  • .data 伪指令标识了程序包含变量的区域
  • .code 伪指令标识了程序包含指令的区域
  • PROC 伪指令用于标识一个过程的开始
  • invoke 伪指令用于将参数入栈,并调用过程,addr伪指令用于传递指针参数
  • ENDP 伪指令用于标识一个过程的结束
  • END 伪指令用于标明该行是汇编源程序最后一行,后面的所有内容不参与编译

基本组成

  1. 汇编指令

机器码的助记符,有对应的机器码

  1. 伪指令

没有对应的机器码,由编译器执行,计算机不执行

  1. 其他符号

如+,-,*,/等,由编译器识别,没有对应的机器码

基本元素

  1. 整数常量

整数常量由符号(可选)开头,后跟一个或多个数字以及一个表示数制基数的字符后缀:[{+|-}] 数字[基数]。以字母开头的十六进制常量前面必须添加一个0,以防止汇编器将其解释为标识符。

基数 进制 基数 进制
h 十六进制 r 编码实数
q/o 八进制 t 十进制(可选)
d 十进制 y 二进制(可选)
b 二进制
  1. 整数表达式

整数表达式是包含整数值和算术运算符的数学表达式。整数表达式计算的结果必须是能够以32个数据位存储的整数(0~FFFFFFFFh)。

运算符 名称 优先级
() 圆括号 1
+, - 一元加、减(符号位) 2
*, / 乘、除 3
MOD 取余数 3
+, - 加、减 4
  1. 实数常量

有两种类型的实数常量:十进制实数和编码(十六进制)实数。

  • 十进制实数常量由符号( sign)、整数(integer)部分、小数点、表示小数的整数和指数(exponent)部分组成

    1
    2
    3
    4
    5
    示例:
    2.
    +3.0
    -44.2E+05
    26.E5
  • 编码实数:编码实数是以16进制数表示一个实数的,遵循IEEE浮点数格式

    1
    2
    示例:
    +1.0 可以表示为3F800000r
    精度 说明
    单精度 32 位:1 位符号位,8 位阶码,23 位为有效数字的小数部分。大致的规格化范围:2-126 〜2127 。也被称为短实数 (short real)
    双精度 64 位:1 位符号位,11 位阶码,52 位为有效数字的小数部分。大致的规格化范围:2-1022 〜21023 。也被称为长实数 (longreal)
    扩展双精度 80 位:1 位符号位,15 位阶码,1 位为整数部分,63 位为有效数字的小数部分。大致的规格化范围:2-16382〜216383。也被称为扩展实数 (extended real)
  1. 字符常量

字符常量是以单引号或双引号括起来的单个字符。汇编器将其转换为与字符对应的二进制数ASCII码。

  1. 字符串常量

字符串常量是以单引号或双引号括起来的串字符。

  1. 保留字
  • 指令助记符,如MOV,ADD,和MUL等
  • 伪指令,用于告诉MASM如何编译程序
  • 属性,用于为变量和操作数提供有关尺寸以及使用方式的信息,如BYTE,WORD等
  • 运算符,用在常量表达式中
  • 预定义符号,如@data,在编译时返回整数常量值。
  1. 标识符

标识符是程序员选择的名字,用来标识变量、常量、过程或代码标号。创建标识符时要注意以下几点:

  • 标识符可包含1~247个字符。
  • 标识符大小写不敏感(MASM默认)。
  • 标识符的第一个字符必须是字母(A~Z和a~z)、下划线(_)、@、?或$,后续字符可以是数字。
  • 标识符不能与汇编器的保留字相同。
  1. 伪指令

伪指令是内嵌在程序源代码中,由汇编器识别并执行相应动作的命令。与真正的指令不同,伪指令在程序运行时并不执行。伪指令可用于定义变量、宏以及过程,可用于命名段以及执行许多其他与汇编器相关的簿记任务。MASM 中伪指令大小写不敏感,如.data,.DATA 和.Data 是等价的

  1. 指令

汇编语言中的指令是一条汇编语句,在程序被汇编后就变成可执行的机器指了。汇编器把汇编指令翻译成机器语言字节码,在运行时可以加载至内存由处理器执行。一条汇编指令包含4个基本部分:

  • 标号(可选)
  • 指令助记符(必需)
  • 操作数(通常是必需的)
  • 注释(可选)
  1. NOP操作符

最安全的指令是NOP(no operation),一条NOP 指令占用一个字节的存储,什么也不做。有
时编译器或汇编器使用NOP指令把代码对齐到偶数地址边界。


文章作者: shigc
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 shigc !
  目录