汇编语言基础
基本语言元素
整数常量
整数常量(又称为整形常量)由一个可选前置符号、一个或多个数字、以及一个指明其基数的可选基数字符构成 : [ { + | - } ] digite [ radix]
注意: 以字母开头的十六进制数必须加个前置0,以防汇编器将其解释为标识符
整形常量表达式
整形常量表达式是一种算术表达式,它包含了整数常量和算术运算符。每个表达式的计算结果必须是个整数,并可用32位来存放
实数常量
实数常量(又称为浮点数常量)用于表示十进制实数和编码(十六进制)实数。
十进制实数包含一个可选符号,其后跟随一个整数,一个十进制小数点,一个可选的表示小数部分的整数,和一个可选的指数
编码实数表示的是十六进制实数,用IEEE浮点数格式来表示短实数
字符常量
字符常量是指,用单引号或双引号包含的一个字符。汇编器在内存中保存的是该字符二进制ASCII码的数值
字符串常量
字符串常量是用单引号或双引号包含的一个字符(含空格符)序列
嵌套引号也是被允许的
和字符常量以整数形式一样,字符串常量在内存中的保存形式为整数字节数值序列
保留字
保留字有特殊意义并且只能在其正确的上下文中使用。默认情况下,保留字是没有大小写之分的。
保留字有以下的类型:
- 指令助记符,如mov、add和mul
- 寄存器名称
- 伪指令,告诉汇编器如何汇编程序
- 属性,提供变量与操作数的大小与使用信息。例如Byte和Word。
- 运算符,在常量表达式中使用
- 预定义符号,比如@data,它在汇编时返回常量的整数值
标识符
标识符是由程序员选择的名称,它用于标识变量、常数、子程序和代码标签
伪指令
伪指令是嵌入源代码中的命令,由汇编器识别和执行
伪指令不在运行时执行,但是他们可以定义变量、宏和子程序;为内存段分配名称执行许多其他与汇编器相关的日常任务。
默认情况下,伪指令不区分大小写
汇编器伪指令的一个重要功能是定义程序区段,也称为段,程序中的段具有不同的作用
指令
指令是一种语句,它在程序汇编编译时变得可执行。汇编器讲指令翻译为机器语言字节,并且在运行时由COU加载和执行
一条指令有四个部分:
- 标号(可选)
- 指令助记符(必需)
- 操作数(通常是必需的)
- 注释(可选)
标号
标号是一种标识符,是指令和数据的位置标记。
标号位于指令的前端,表示指令的地址
同样,标号位于变量的前端,表示变量的地址
标号有两种类型:数据标号和代码标号
数据标号标识变量的位置,它提供了一种方便的手段在代码中引用该变量。
汇编器为每个标号分配一个数字地址。可以在一个标号后面定义多个数据项。
程序代码区(指令所在区段)的标号必须使用冒号(:)结束。代码标号用作跳转和循环指令的目标
指令助记符
指令助记符是标记一条指令的短单词
操作数
操作数是指令输入输出的数值
操作数有固有顺序。当指令有多个操作数时,通常第一个操作数被称为目的操作数,第二个操作数被称为源操作数。一般情况下,目的操作数的内容由指令修改注意:
IMUL有3个操作数,第一个是目的操作数,第二个和第三个是进行乘法的源操作数
注释
注释是程序编写者与阅读者交流程序设计信息的重要途径。
NOP(空操作)指令
最安全(也是最无用)的指令是NOP(空操作),它在程序空间中占有一个字节,但是不做任何操作
一个简单的例子
; //AddTwo.asm - adds two 32-bit integers.
.386 ; // .386伪指令 表示这是一个32位程序,能访问32位寄存器和地址
.model flat, stdcall; // 程序的内存模式 flat ,子程序的调用规范(stdcall)
.stack 4096;// 堆栈保留4096字节的存储空间
ExitProcess proto, dwExitCode:dword;// 声明函数原型 原型:函数名,proto,逗号,输入参数列表
.code;// 标记一个程序代码区的起点
main proc;// 标号main 标记程序开始执行的地址
mov eax, 5
add eax, 6
invoke ExitProcess, 0
main endp;// endp 标记一个过程的结束
end main; // end标识程序的入口(main)
列表文件
Microsoft (R) Macro Assembler Version 14.16.27034.0 03/14/20 16:48:17
AddTwo.asm Page 1 - 1
; //AddTwo.asm - adds two 32-bit integers.
.386 ; // .386伪指令 表示这是一个32位程序,能访问32位寄存器和地址
.model flat, stdcall; // 程序的内存模式 flat ,子程序的调用规范(stdcall)
.stack 4096;// 堆栈保留4096字节的存储空间
ExitProcess proto, dwExitCode:dword;// 声明函数原型 原型:函数名,proto,逗号,输入参数列表
00000000 .code;// 标记一个程序代码区的起点
00000000 main proc;// 标号main 标记程序开始执行的地址
00000000 B8 00000005 mov eax, 5
00000005 83 C0 06 add eax, 6
invoke ExitProcess, 0
00000008 6A 00 * push +000000000h
0000000A E8 00000000 E * call ExitProcess
0000000F main endp;// endp 标记一个过程的结束
end main; // end标识程序的入口(main)
Microsoft (R) Macro Assembler Version 14.16.27034.0 03/14/20 16:48:17
AddTwo.asm Symbols 2 - 1
Segments and Groups:
N a m e Size Length Align Combine Class
FLAT . . . . . . . . . . . . . . GROUP
STACK . . . . . . . . . . . . . 32 Bit 00001000 DWord Stack 'STACK'
_DATA . . . . . . . . . . . . . 32 Bit 00000000 DWord Public 'DATA'
_TEXT . . . . . . . . . . . . . 32 Bit 0000000F DWord Public 'CODE'
Procedures, parameters, and locals:
N a m e Type Value Attr
ExitProcess . . . . . . . . . . P Near 00000000 FLAT Length= 00000000 External STDCALL
main . . . . . . . . . . . . . . P Near 00000000 _TEXT Length= 0000000F Public STDCALL
Symbols:
N a m e Type Value Attr
@CodeSize . . . . . . . . . . . Number 00000000h
@DataSize . . . . . . . . . . . Number 00000000h
@Interface . . . . . . . . . . . Number 00000003h
@Model . . . . . . . . . . . . . Number 00000007h
@code . . . . . . . . . . . . . Text _TEXT
@data . . . . . . . . . . . . . Text FLAT
@fardata? . . . . . . . . . . . Text FLAT
@fardata . . . . . . . . . . . . Text FLAT
@stack . . . . . . . . . . . . . Text FLAT
0 Warnings
0 Errors