打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
汇编语言指令详解
指令(instruction)是一种语句,它在程序汇编编译时变得可执行。汇编器将指令翻译为机器语言字节,并且在运行时由 CPU 加载和执行。

一条指令有四个组成部分:
  • 标号(可选)
  • 指令助记符(必需)
  • 操作数(通常是必需的)
  • 注释(可选)

不同部分的位置安排如下所示:

[label: ] mnemonic [operands] [;comment]

现在分别了解每个部分,先从标号字段开始。

1) 标号

标号(label)是一种标识符,是指令和数据的位置标记。标号位于指令的前端,表示指令的地址。同样,标号也位于变量的前端,表示变量的地址。标号有两种类型:数据标号和代码标号。

数据标号标识变量的位置,它提供了一种方便的手段在代码中引用该变量。比如,下面定义了一个名为 count 的变量:
复制纯文本复制
  1. count DWORD 100
count DWORD 100
汇编器为每个标号分配一个数字地址。可以在一个标号后面定义多个数据项。在下面的例子中,array 定义了第一个数字(1024)的位置,其他数字在内存中的位置紧随其后:
复制纯文本复制
  1. array DWORD 1024, 2048
  2. DWORD 4096, 8192
array DWORD 1024, 2048
      DWORD 4096, 8192
程序代码区(指令所在区段)的标号必须用冒号(:)结束。代码标号用作跳转和循环指令的目标。例如,下面的 JMP 指令创建一个循环,将程序控制传递给标号 target 标识的位置:
复制纯文本复制
  1. target:
  2. mov ax,bx
  3. ...
  4. jmp target
target: mov ax,bx ... jmp target
代码标号可以与指令在同一行上,也可以自己独立一行:
复制纯文本复制
  1. L1: mov ax, bx
  2. L2 :
L1: mov ax, bx
L2 :
标号命名规则要求,只要每个标号在其封闭子程序页中是唯一的,那么就可以多次使用相同的标号。

2) 指令助记符

指令助记符(instruction mnemonic)是标记一条指令的短单词。在英语中,助记符是帮助记忆的方法。相似地,汇编语言指令助记符,如 mov, add 和 sub,给出了指令执行操作类型的线索。下面是一些指令助记符的例子:

助记符 说明 助记符 说明
MOV 传送(分配)数值 MUL 两个数值相乘
ADD 两个数值相加 JMP 跳转到一个新位置
SUB 从一个数值中减去另一个数值 CALL 调用一个子程序

3) 操作数

操作数是指令输入输出的数值。汇编语言指令操作数的个数范围是 0〜3 个,每个操作数可以是寄存器、内存操作数、整数表达式和输入输岀端口。

生成内存操作数有不同的方法,比如,使用变量名、带方括号的寄存器等。变量名暗示了变量地址,并指示计算机使用给定地址的内存内容。下表列出了一些操作数示例:

示例 操作数类型 示例  操作数类型
96  整数常量 eax 寄存器
2+4 整数表达式 count 内存

现在来考虑一些包含不同个数操作数的汇编语言指令示例。比如,STC 指令没有操作数:
复制纯文本复制
  1. stc ;进位标志位置 1
stc ;进位标志位置 1
INC 指令有一个操作数:
复制纯文本复制
  1. inc eax ;EAX 加 1
inc eax                ;EAX 加 1
MOV 指令有两个操作数:
复制纯文本复制
  1. mov count, ebx ;将 EBX 传送给变量 count
mov count, ebx ;将 EBX 传送给变量 count
操作数有固有顺序。当指令有多个操作数时,通常第一个操作数被称为目的操作数,第二个操作数被称为源操作数(source operand)。

一般情况下,目的操作数的内容由指令修改。比如,在 mov 指令中,数据就是从源操作数复制到目的操作数。

IMUL 指令有三个操作数,第一个是目的操作数,第二个和第三个是进行乘法的源操作数:
复制纯文本复制
  1. imul eax,ebx,5
imul eax,ebx,5
在上例中,EBX 与 5 相乘,结果存放在 EAX 寄存器中。

4) 注释

注释是程序编写者与阅读者交流程序设计信息的重要途径。程序清单的开始部分通常包含如下信息:
  • 程序目标的说明
  • 程序创建者或修改者的名单
  • 程序创建和修改的日期
  • 程序实现技术的说明

注释有两种指定方法:
  • 单行注释,用分号(;)开始。汇编器将忽略在同一行上分号之后的所有字符。
  • 块注释,用 COMMENT 伪指令和一个用户定义的符号开始。汇编器将忽略其后所有的文本行,直到相同的用户定义符号出现为止。

示例如下:
复制纯文本复制
  1. COMMENT !
  2. This line is a comment.
  3. This line is also a comment.
  4. !
COMMENT ! This line is a comment. This line is also a comment. !
其他符号也可以使用,只要该符号不出现在注释行中:
复制纯文本复制
  1. COMMENT &
  2. This line is a comment.
  3. This line is also a comment.
  4. &
COMMENT &
        This line is a comment.
        This line is also a comment.
&
当然,程序员应该在整个程序中提供注释,尤其是代码意图不太明显的地方。

5) NOP(空操作)指令

最安全(也是最无用)的指令是 NOP(空操作)。它在程序空间中占有一个字节,但是不做任何操作。它有时被编译器和汇编器用于将代码对齐到有效的地址边界。

在下面的例子中,第一条指令 MOV 生成了 3 字节的机器代码。NOP 指令就把第三条指令的地址对齐到双字边界(4 的偶数倍):
复制纯文本复制
  1. 00000000 66 8B C3 mov ax,bx
  2. 00000003 90 nop ;对齐下条指令
  3. 00000004 8B D1 mov edx,ecx
00000000 66 8B C3 mov ax,bx 00000003 90 nop ;对齐下条指令 00000004 8B D1 mov edx,ecx
x86 处理器被设计为从双字的偶数倍地址处加载代码和数据,这使得加载速度更快。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
51单片机自学教程(2)
lea指令与mov指令
FASM 第二章 - 2.1 x86 体系指令 - xuyibo.org
技术派汇编语言之操作码和助记符(Intel系列)
51单片机指令系统(1)
学习linux内核时常碰到的汇编指令(2)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服