汇编语言指令详解

2023-05-16

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

一条指令有四个组成部分:

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


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

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

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

1) 标号

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

数据标号标识变量的位置,它提供了一种方便的手段在代码中引用该变量。比如,下面定义了一个名为 count 的变量:


  
  1. count DWORD 100

汇编器为每个标号分配一个数字地址。可以在一个标号后面定义多个数据项。在下面的例子中,array 定义了第一个数字(1024)的位置,其他数字在内存中的位置紧随其后:


  
  1. array DWORD 1024, 2048
  2. DWORD 4096, 8192

程序代码区(指令所在区段)的标号必须用冒号(:)结束。代码标号用作跳转和循环指令的目标。例如,下面的 JMP 指令创建一个循环,将程序控制传递给标号 target 标识的位置:


  
  1. target:
  2. mov ax,bx
  3. ...
  4. jmp target

代码标号可以与指令在同一行上,也可以自己独立一行:


  
  1. L1: mov ax, bx
  2. 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

INC 指令有一个操作数:


  
  1. inc eax ;EAX 加 1

MOV 指令有两个操作数:


  
  1. mov count, ebx ;将 EBX 传送给变量 count

操作数有固有顺序。当指令有多个操作数时,通常第一个操作数被称为目的操作数,第二个操作数被称为源操作数(source operand)。

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

IMUL 指令有三个操作数,第一个是目的操作数,第二个和第三个是进行乘法的源操作数:


  
  1. 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. !

其他符号也可以使用,只要该符号不出现在注释行中:


  
  1. COMMENT &
  2. This line is a comment.
  3. This line is also a comment.
  4. &

当然,程序员应该在整个程序中提供注释,尤其是代码意图不太明显的地方。

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

x86 处理器被设计为从双字的偶数倍地址处加载代码和数据,这使得加载速度更快。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

汇编语言指令详解 的相关文章

  • Proxmox VE 修改集群名称

    作者 xff1a 田逸 xff08 formyz Proxmox VE集群一旦创建 xff0c 其集群的名称就固定下来 在Proxmox VE Web管理后台 xff0c 没有相应的菜单或按钮对应与集群名称的修改 xff08 仅仅发现修改虚
  • 第3章 高可用负载均衡集群规划

    作者 xff1a 田逸 xff08 formyz xff09 开篇之初 xff0c 先举几个反例 xff0c 来说明事前规划的重要性 案例一 xff1a 某广告媒体公司 xff0c 需要部署一套媒体播放系统 xff0c 由一台应用服务器和一
  • 《企业级Linux高可用负载均衡集群实践真传》目录

    第1章 关于负载均衡 2 1 1 负载均衡定义 2 1 2 负载均衡在生产环境中的基本要求 3 1 2 1 在线可扩展性 3 1 2 2 高可用性 3 1 2 3 多服务性 4 1 3 负载均衡基本功能 4 1 3 1 负载均衡 4 1 3
  • 4.3 实施部署Nginx 高可用负载均衡集群

    作者 xff1a 田逸 xff08 formyz xff09 部署大致可分为 xff1a 准备工作 配置 验证与交付几个步骤 xff0c 接下来按顺序逐一介绍 4 3 1 准备工作 Nginx高可以负载均衡集群准备工作分两个层面 xff1a
  • xrdp设置开机自启动 update-rc.d xrdp enable

    xrdp设置开机自启动 update rc d xrdp enable
  • FreeRDP 编译和使用介绍

    FreeRDP 编译和使用介绍 FreeRDP是开源的 xff0c 免费的RemoteDesktop Protocol RDP 执行版本 xff0c 它支持多个操作系统平台如Windows xff0c Linux和Android 源代码下载
  • CCF201809-3 元素选择器

    试题编号 xff1a 201809 3试题名称 xff1a 元素选择器时间限制 xff1a 1 0s内存限制 xff1a 256 0MB问题描述 xff1a 版本一 xff08 时间 xff1a 2018 10 23 xff09 xff08
  • CCF201812-4 数据中心

    试题编号 xff1a 201812 4试题名称 xff1a 数据中心时间限制 xff1a 1 0s内存限制 xff1a 512 0MB问题描述 xff1a 样例输入 4 5 1 1 2 3 1 3 4 1 4 5 2 3 8 3 4 2 样
  • R语言一次性更新全部packages

    install packages lib 61 lib lt libPaths 1 pkgs 61 as data frame installed packages lib stringsAsFactors 61 FALSE Package
  • ArchLinux详细安装及配置过程

    总结一下archlinux的安装过程 xff0c 也作为以后安装的参考 xff08 本篇细节内容有待完善 xff0c 目前仅供参考 xff09 可参考archlinux的官方安装教程 xff1a https wiki archlinux o
  • 虚拟机Linux扩容

    查看初始空间 查看分区 扩容 xff1a 1 磁盘分区 root 64 ecs 7837 fdisk dev sda WARNING DOS compatible mode is deprecated It s strongly recom
  • MySQL数据库优化的八种方式(经典必看)

    引言 xff1a 关于数据库优化 xff0c 网上有不少资料和方法 xff0c 但是不少质量参差不齐 xff0c 有些总结的不够到位 xff0c 内容冗杂 偶尔发现了这篇文章 xff0c 总结得很经典 xff0c 文章流量也很大 xff0c
  • .Net Core·寄托于IIS的REST服务405的问题

    Net Core WebAPI寄托于IIS xff0c 使用Put Delete谓词进行访问返回 34 HTTP Error 405 0 Method Not Allowed 34 的错误 IIS7 5中集成了名为 34 WebDAV 34
  • BruteXSS安装和使用

    1 安装Python2 7版本 https www python org downloads windows 使用版本V2 7 13 2 下载BurteXSS https sourceforge net projects brutexss
  • Linux环境CentOS安装xrdp,实现RDP连接(工具MobaXterm)

    root 64 localhost root yum install xrdp Repository extras is listed more than once in the configuration Last metadata ex
  • Linux环境安装iperf3(网络性能测试工具)

    root 64 localhost yum search iperf 已加载插件 xff1a fastestmirror Loading mirror speeds from cached hostfile base mirrors tun
  • C++教程

    C 43 43 教程 xff1a 源码 参考网址 xff1a C 43 43 简介 编程宝库 1 include lt iostream gt 2 using namespace std 3 4 int main 5 6 cout lt l
  • Linux命令执行命令自动输入y

    echo y rm i cc root 64 bogon shell touck cc bash touck 未找到命令 root 64 bogon shell touch cc root 64 bogon shell ll cc rw r
  • 查看Oracle数据库版本号

    Oracle 1 select from v version 2 select from product component version 3 set serveroutput on exec dbms output put line d

随机推荐

  • SQL Server2008官方下载地址

    官网地址 xff1a https www microsoft com zh cn download details aspx id 61 30438
  • C#+vs2019windos窗口实现数字图像基础处理(灰度化,二值化,对比度,亮度)

    目录 一 灰度化二 亮度三 对比度四 可变阈值二值化五 自适应二值化 一 灰度化 在三原色理论中 xff0c 所有颜色都是以红 绿 蓝三原色按不同比例混合构成的 xff0c 不同的红 绿 蓝三原色比例构成了不同的颜色 而灰度数字图像指的是图
  • 达梦数据库常见问题总结

    http www itpub net forum php mod 61 viewthread amp tid 61 1557982
  • Linux命令手动清除缓存echo 3 > /proc/sys/vm/drop_caches

    缓存cache占用过大 CPU达到85 以上 释放掉被系统Cache占用的数据命令 xff1a echo 3 gt proc sys vm drop caches 第一行 xff1a 从操作系统 OS 来看 xff1a 计算机共计 4040
  • MIB Browser failed to register OCX components..解决方法

    1 关闭操作系统的防火墙 xff0c 或者在高级选项里添加入站规则 xff0c 允许UDP 162端口消息进入即可 2 以管理员身份运行 bin mgmibbpe exe
  • Navicat For MongoDB安装及破解

    安装包转载网址 xff1a https blog csdn net qq 40737025 article details 82919700 baidu云 请求头自己加上中间有中文就自己去掉 xff0c 防止屏蔽 pan baidu com
  • C# Winform应用程序调用Microsoft RDP client control实现远程连接(VS2013)

    试了好一会 xff0c 终于成功了 xff01 先说问题 xff1a 1 控件已成功添加到工具箱中 但未在活动设计器中启用 注册控件 xff1a regsvr32 C Windows System32 mstscax dll VS2013提
  • C++中枚举enum详解

    转载博客地址 xff1a https blog csdn net bruce 0712 article details 54984371 众所周知 xff0c C C 43 43 语言可以使用 define和const创建符号常量 xff0
  • Android Rust JNI系列教程(一) 环境配置

    序 本系列文章将从rust环境搭建开始 逐步带大家了解使用rust进行Android JNI开发的基本技能 相关文章共分为如下几步 Rust JNI环境搭建 创建第一个Rust JNI项目Rust与Android互相调用Rust 调用And
  • 私人网盘nextcloud配置问题解决

    安装流程 配置流程非常简单 xff0c 主要是参考了下面这篇博文配置 xff0c 在宝塔面板下安装nextcloud xff0c 非常简单 博文跳转 https www vpsss net 5780 html 大概总结以下步骤 xff1a
  • Linux下使用rclone挂载网盘到本地

    Linux下使用rclone挂载网盘到本地 Rclone是一个支持挂载多数国外网盘的工具 Rclone官网传送们 目前Rclone支持挂载的网盘有 xff1a Google Drive Dropbox Google Cloud Storag
  • kvm 虚拟化安装 Ubuntu 18.04 server

    本文续上篇 裸金属服务器 kvm 虚拟化安装 win10 继续记录使用 KVM 在 Centos 7 5 裸金属服务器上安装 Ubuntu 18 04 Server的过程及遇到的问题 资源准备 首先要配置好 KVM 环境 xff0c 上文已
  • 创建回调函数

    1 新建一个空的工程 xff0c 在工程中随便创建一个类 xff0c 比如 h文件 import lt UIKit UIKit h gt typedef void resultBlock void 64 interface MyView U
  • 虚拟机的复制

    虚拟机的复制 xff08 1 xff09 虚拟机复制需要的两个重要文件 etc libvirt qemu xml文件 虚拟机的配置文件 xff0c 前端管理文件 xff0c 可以使用前端文件回到相应位置寻找后端硬盘文件 var lib li
  • 关于C++循环依赖问题的理解

    简介 如果有两个类 xff0c 类A和类B xff0c A类中有一个B类的对象b作为数据成员 xff0c B类中又有一个A类对象a作为数据成员 xff0c 像这样的情况就叫做循环依赖 那么如何解决类之间的循环依赖问题呢 xff1f 代码实例
  • AndroidStudio配置maven阿里云镜像

    写1行不行 xff0c 要写5行 xff0c 不要写 jcenter google xff0c 半天完不了 Android配置maven阿里云镜像 海阔天空185的博客 CSDN博客 android maven 阿里云 buildscrip
  • Android获取设备唯一标识

    一 IMEI xff1a 国际移动设备识别码的缩写 xff0c 其总长为15位 xff0c 每位数字仅使用0 xff5e 9的数字 双卡双待会有两个IMEI值 xff0c 并且在Android10以后就无法获取到了 xff0c 而且在模拟器
  • 排序之冒泡排序

    话不多说先上代码 package main import 34 fmt 34 func bubleSort arr 5 int for i 61 0 i lt len arr 1 i 43 43 for j 61 0 j lt len ar
  • 如何深入理解计算机视觉?(附思维导图)

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 设为星标 xff0c 与你不见不散 编辑 xff1a Sophia 联盟学习笔记 计算机视觉联盟 报道 公众号 CVLianMeng 人工智能资源 xff08 书籍 43 视频 xff09 全
  • 汇编语言指令详解

    指令 xff08 instruction xff09 是一种语句 xff0c 它在程序汇编编译时变得可执行 汇编器将指令翻译为机器语言字节 xff0c 并且在运行时由 CPU 加载和执行 一条指令有四个组成部分 xff1a 标号 xff08