一、汇编语言的基本元素
整数常量
• h十六进制、q/o八进制、d十进制、b二进制
• 如果整数常量后面没有基数后缀,默认是十进制整数
• 以字母开头的十六进制常量前面必须加0
整数表达式
算术运算符 | 优先级 |
---|---|
() | 优先级1 |
*、/、MOD | 优先级2 |
+、- | 优先级3 |
字符常量
• 单引号或者双引号括起来的单个字符。
• ,0表示字符串的截止
• 嵌套引号
“print ‘Hello World’ on the terminal window”,0
‘print “Hello World” on the terminal window’,0
数据标号
• 标识变量的地址,方便变量的引用
• 相对.data数据段在内存起始地址的偏移
count DWORD 100
array DWORD 100, 101, 102, 103
OFFSET
• 获取数据标号的内存地址
.data
str_hello BYTE “Hello World!”,0
.code
mov eax, OFFSET str_hello
eax储存str_hello的内存地址
代码标号
• 标识代码的地址
• 必须以冒号(:)结尾
• 通常作为跳转、循环指令的目标地址
target:
mov eax,100h
…
jmp target
指令助记符
• 指令助记符是一个简短的单词,用于表示一条指令。
指令助记符 | 功能 |
---|---|
mov | 把后面的值赋值给前面 |
add | add a,b是a+b的意思 |
sub | sub a,b是a-b的意思 |
mul | mula,b是a*b的意思 |
jmp | 相当于c++的go to语句 |
call | 用于调用前面写好的过程 |
操作数
操作数是指令的操作对象:寄存器、内存、常量、I/O端口
• inc eax:eax寄存器的值加1
• mov count,ebx:mov指令有两个操作数:count、ebx
NOP指令
• NOP指令,空操作
• 用于计时循环
• NOP指令占用1个字节的内存
• 用于后继指令的对齐
伪指令
• 伪指令内嵌在汇编语言源代码中,由汇编器识别、执行相应动作的命令
• 用于定义变量、段、过程、汇编器选项等
定义变量1 | mov eax, my_var ; mov指令 |
---|---|
定义变量2 | my_var DWORD 100h;DWORD伪指令 |
定义段 | .data、.code、.stack |
定义过程 | PROC-ENDP |
二、定义数据
数据类型
数据类型 | 简写 | 内存占位 |
---|---|---|
BYTE | db | 8位 |
WORD | dw | 16位 |
DWORD | d | 32位 |
QWORD | dq | 64位 |
数据定义
语法:[变量名] 数据定义伪指令 初始值
初始值
• 数据定义语句中要指定初始值
• 多个初始值用逗号隔开my_var DWORD 0, 1, 2, 3
• 0: 可以指定初始值为0
• ?: 表示在程序运行的时候初始化该变量
数据声明的位置
• .data段声明初始化的变量
.data
dw_var1 DWORD 0
• .data?段声明未初始化的变量
.data?
dw_var2 DWORD ?
定义字符串
str_hello BYTE “Hello World!”, 0Dh, 0Ah,
BYTE “I love assembly language”,
BYTE 0Dh, 0Ah, 0
• 0Dh和0Ah是CR/LF(回车、换行)的ASCII编码
• 字符串的结尾是0
DUP伪指令
• 为字符串或者数组分配内存空间
• BYTE 20 DUP(0);20个字节的内存空间
• BYTE 4 DUP(“Hello”):20个字节,连续的4个“Hello”,每个“Hello”5字节
BYTE是‘0’,‘hello’的类型,‘20’,'5’是它们的数量
三、符号常量
符号常量
• 符号常量(或符号定义),将标识符与整数表达式或文本联系起来
• 符号常量不占用存储空间
• 变量占用存储空间
等号伪指令
• 等号伪指令,将符号名和整数表达式联系起来,相当于赋值操作COUNT = 500
EQU伪指令
• EQU伪指令将符号名与整数表达式或任意文本联系起来,相当于赋值操作
name EQU expression
name EQU symbol
PI EQU <3.1415926>
press_key EQU <“Press any key to continue…”, 0>
prompt BYTE pressKey ;
计算数组和字符串的大小
• $是当前所处的地址
• $可以用来计算数组或字符串的大小
str_hello BYTE “Hello World!”, 0Dh, 0Ah,
BYTE “I love assembly language”,
BYTE 0Dh, 0Ah, 0
str_size = ($ - str_hello)
计算数组大小
dw_array DWORD 0, 1, 2, 3, 4
array_size = ($ - dw_array)/4