汇编常见指令

2023-05-16

文章目录

  • 常见的运算类汇编指令
    • add指令
    • sub指令
    • mul乘法指令
    • div除法指令
    • inc(自增)(即C语言++)
    • dec(自减)(即–)
    • push(入栈)
    • pop(出栈)
    • and(与)
    • or(或)
    • Test
    • CMP(比较)
  • 常见的传输类汇编指令
    • mov指令
    • call指令
    • ret指令
    • jmp指令
  • 常用控制类指令
    • 转移指令
    • 循环转移指令
    • 过程调用指令
    • 中断控制指令

常见的运算类汇编指令

add指令

  1. add 寄存器,数据 例:add ax,8
  2. add 寄存器,寄存器 例:add ax,bx
  3. add 寄存器,内存单元 例:add ax,[0]
  4. add 内存单元,寄存器 例:add [0],ax

sub指令

  1. sub 寄存器,数据 例:sub ax,8
  2. sub 寄存器,寄存器 例:sub ax,bx
  3. sub 寄存器,内存单元 例:sub ax,[0]
  4. sub 内存单元,寄存器 例:sub [0],ax

mul乘法指令

两个相乘的数,或者全为8位,或者全为16位;

若为8位,一个默认放置于AL中,另一个置于8位寄存器或内存单元中,结果默认放置于AX中;

若为16位,一个默认放置于AX中,另一个置于16位寄存器或内存单元中,结果高位默认置于DX,低位置于AX

无符号数乘法指令: mul 通用寄存器/内存单元
有符号数乘法指令: imul 通用寄存器/内存单元

在这里插入图片描述

div除法指令

【在除号前面的是被除数,除号后面的是除数。】

除法分为8位和16位的运算,有被除数和除数

除数:8位和16位两种,在一个寄存器或内存单元中

被除数: 默认放置在AXDXAX中,除数为8位,被除数为16位,默认在AX中放置;

若除数为16位,被除数为32位,在DXAX中放置,DX存放高16位,AX存放低16位;

结果: 如果除数为8位,则AL存储除法操作的商,AH存储除法操作的余数

如果除数为16位,则AX存储除法操作的商,DX存储除法操作的余数

无符号数除法指令: div 通用寄存器/内存单元
有符号数除法指令: idiv 通用寄存器/内存单元

inc(自增)(即C语言++)

只有一个操作数:寄存器或存储单元

对操作数加1(增量)再将结果返回原处,用于计数器和地址指针的调整

取ax,默认值为5

inc ax   // 则ax值变为6

dec(自减)(即–)

只有一个操作数:寄存器或存储单元

dec ax     // 则ax值变4

push(入栈)

push 寄存器:将一个寄存器中的数据入栈

push 段寄存器:将一个段寄存器中的数据入栈

push 内存单元:将一个内存单元处的字入栈

pop(出栈)

pop 寄存器:用一个寄存器接受出栈的数据。

pop 段寄存器:用一个段寄存器接受出栈的数据

pop 内存单元:出栈,用一个内存字单元接收出栈的数据

and(与)

逻辑与运算,按位进行与运算
通过该运算符可将操作对象的相应位设为0,其他位不变

例:

mov  ax,01100001B
and  ax,10111111B

结果ax变为00100001B

or(或)

逻辑或运算,按位进行或运算

例:

mov  ax,01100001B
or  ax,00001100B

结果ax变为01101101B

Test

作用与and指令相似,进行逻辑于运算,但不会保存结果,Test命令的两个操作数不会被改变。运算结果在设置过相关标记位后会被丢弃,仅对标志寄存器【ZF】进行修改

test  ax,ax   

CMP(比较)

cmp相当于是sub指令,不保存结果,仅对相应标志寄存器进行修改。

 sub ax,bx

常见的传输类汇编指令

mov指令

mov 寄存器,数据
mov 寄存器,寄存器
mov 寄存器,内存单元
mov 内存单元,寄存器
mov 段寄存器,寄存器
mov 寄存器,段寄存器

call指令

  1. call 标号【将当前的IP压栈后,转到标号处执行指令】
(1) (sp) = (sp) -2
	     ((ss) * 16 + (sp)) = (IP)
(2) (IP) = (IP) + 16位位移

16位位移 = “标号”处的地址 - call指令后的第一个字节的地址
16位位移由编译程序在编译时算出。

CPU执行“ call 标号 ” 时,相当于进行:

push IP
jmp near ptr  标号【转到标号处执行指令】
  1. call far ptr 标号
(1) sp = sp -2
         ss * 16 + sp = cs
         sp = sp -2
         ss * 16 + sp = IP
(2) CS = 标号所在的段地址
         IP = 标号所在的偏移地址

CPU执行“ call far ptr 标号 ” 时,相当于进行:

push CS
push IP
jmp far ptr 标号
  1. call 16位寄存器
sp = sp -2
ss * 16 + sp = IP
IP = 16位寄存器

CPU执行“ call 16位寄存器” 时,相当于进行:

push IP
jmp 16位寄存器
  1. call word ptr 内存单元地址
push IP
jmp word ptr 内存单元地址
  1. call dword ptr 内存单元地址
push CS
push IP
jmp dword ptr 内存单元地址

ret指令

ret指令用栈中的数据,修改IP的内容,从而实现近转移。

CPU进行ret指令时,进行下面两步操作:

 (1)  (IP) = ((ss) * 16 + (sp))
(2)  (sp) = (sp) + 2

相当于 pop IP

jmp指令

jmp 段地址:偏移地址

同时修改CS和IP,用指令中给出的段地址修改CS,偏移地址修改IP。

jmp 某一合法寄存器

则是仅修改IP。如jmp ax类似于mov IP,ax

jmp 2AE3:3    即物理地址被修改为2AE33
jmp 3:0B16    0003:0B16,即物理地址被修改为00B46

常用控制类指令

转移指令

  1. 无条件转移指令

直接和间距的区别就是,前者是直接给地址,后者通过寄存器或者其他
段间和段内的区别就是,前者32位(CS:IP 故32位),后者是16位(就ip,所以16位)

段内直接:jmp 地址,目标地址16位
段内间接:jmp 寄存器

段间直接转移就是我们在指令里面直接给出 32 位目标地址(CS:IP)
段间间接转移就是需要通过 32 位的存储器操作数(注意不能是寄存器了)给出目标地址。

段间直接:jmp 地址,目标地址32位
段间间接:jmp  DWORD PTR[BX][BX]指向的是存储器操作数

在这里插入图片描述

  1. 有条件转移指令

根据单个条件标志的设置情况转移:这种转移指令常常用于适用于测试某一次运算的结果并根据其不同特征产生程序分支不同的处理的情况
在这里插入图片描述

比较两个无符号数,并根据比较的结果转移
在这里插入图片描述

比较两个带符号数,并根据比较的结果转移

在这里插入图片描述

常用:

在这里插入图片描述

JZ(Jump if Zero)是此前的运算结果为0时跳转。
若此前运算结果不为0,则不跳转,执行JZ指令后面的下一条指令。

判断结果是否为零,靠的是ZF标志位状态。
若结果是0,则ZF=1
若结果不是0,则ZF=0

所以,JZ指令是在ZF=1时跳转,ZF=0时不跳转。

循环转移指令

  1. 无条件循环指令

要使用loop循环时要提前给CX赋值,给CX赋的值就是你要进行的循环次数,因为每执行一次loop循环CX中存储的值减一,循环结束的标准是CX==0

因此汇编语言的循环写法大致是:

mov cx, 循环次数
s:
循环体(要循环执行的内容)
loop s

循环的条件是:当 CX ≠ 0时。

  1. 条件循环指令

功能:先使得 CX -1,再根据 CX 的值以及 ZF 的值去决定是否循环。

LOOPZ(相等则循环):当 CX ≠ 0,且 ZF = 1时循环
LOOPNZ(不相等则循环):当 CX ≠ 0,且 ZF = 0时循环

因此,条件循环指令前面需要跟能够改变 ZF 状态的指令,用以控制循环

过程调用指令

转移类指令,是程序运行到某个地方之后,就跳转到另外一段代码,不会再回到原处了;
但是对于过程调用指令,我们跳转到子程序运行完了之后,是需要回到原来的地方继续执行主程序的。

调用指令:CALL <子过程的入口地址>
返回指令:RET

中断控制指令

响应中断,即针对某个随机或异常事件执行一段处理程序,称为中断服务程序,本质上是一种特殊的过程调用,且全部是远过程调用。

指令格式:INT n,n=0 ~ 255
中断返回指令

格式:IRET
中断服务程序的最后一条指令,负责恢复断点 、恢复标志寄存器内容

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

汇编常见指令 的相关文章

  • Acwing:合适数对

    今天在补AcWing周赛题目的时候遇到了一道很经典的区间和问题 xff0c 因此写下本篇博客记录下来 原题链接 xff1a 4316 合适数对 AcWing题库 题目描述 输入样例1 xff1a 5 4 5 1 3 4 1 输出样例1 xf
  • 蓝桥杯:统计子矩阵(十三届省赛C++组)

    前言 xff1a 这道题目是矩阵类型题目经典题型 xff0c 解题大体思路是前缀和 43 双指针扫描 xff0c 在我这篇博客中 第十三届蓝桥杯省赛C 43 43 B组题解 第十三届蓝桥杯b组c 43 43 答案 正在黑化的KS的博客 CS
  • pyqt 之 QTableView listvview 添加复选框 Checkbox

    目录 简述 常见的实现方式 具体实现 1 自定义模型QAbstractTableModel xff0c 通过flags 函数来实现 2 自定义委托QAbstractItemDelegate xff0c 通过paint 函数来实现 3 QSt
  • 第十四届蓝桥杯模拟赛第三期(Python)

    写在前面 包含本次模拟赛的10道题题解能过样例 xff0c 应该可以AC若有错误 xff0c 欢迎评论区指出本次题目除了最后两题有些难度 xff0c 其余题目较为简单 xff0c 我只将代码和结果给出 xff0c 如果不能理解欢迎私信我 x
  • Acwing: 一道关于线段树的好题(有助于全面理解线段树)

    题目链接 x1f517 xff1a 2643 序列操作 AcWing题库 前驱知识 xff1a 需要理解线段树的结构和程序基本框架 以及懒标记的操作 题目描述 题目分析 对区间在线进行修改和查询 xff0c 一般就是用线段树来解决 xff0
  • 扩展欧几里得算法及其应用

    前言 由于数论的板子真的很抽象 xff0c 也很难背 xff0c 所以特此记录扩展欧几里得算法的板子和它的用途 本篇文章只涉及应用 xff0c 不涉及证明 xff0c 如需理解证明还请各位移步其他优秀的讲解 xff01 扩展欧几里得算法 先
  • 蓝桥杯:Python组再也不怕组合数计数

    有一类题目是是这样的 xff1a 要求我们从n个数中选m个 xff0c 问共有多少种取法 如果是用C 43 43 写的话 xff0c 要应用到Lucas定理 xff0c 暴力阶乘会超时 这里给大家介绍一个Python3 8 math库自带的
  • 模拟角频率和数字角频率的关系

    概念 xff1a 模拟频率f xff1a 每秒经历多少个周期 xff0c 单位Hz xff0c 即1 s xff1b 模拟角频率 xff1a 每秒经历多少弧度 xff0c 单位rad s xff1b 数字角频率w xff08 归一化角频率
  • 对于时不变系统的理解

    来源 xff1a 信号与系统 对 时不变性 判定的一点注记 知乎
  • 「STM32入门」TIM输出比较

    输出比较的简介 输出比较英文写作OC Output Compare 输出比较可以通过比较CNT和CCR寄存器值的关系 xff0c 来对输出电平进行置高或者置低或者翻转的操作 xff0c 用于输出一定频率和占空比的PWM波形常见应用例子如 x
  • 「数字信号处理」MATLAB设计 双音多频拨号系统

    前言 实验目的 xff1a 用Matlab模拟实现双音多频拨号系统 输入 xff1a 一串数字模拟电话号码 输出 xff1a 检测出的电话号码 Matlab版本 xff1a 2021b 系统 xff1a MacOS 实验方法 xff1a 查
  • 「STM32入门」TIM定时中断

    定时器的简介 定时器可以对输入的时钟进行计数 xff0c 并在计数值达到设定值时触发中断 xff0c 在中断内可以执行中断事件不仅具备基本的定时中断功能 xff0c 而且还包含内外时钟源选择 xff0c 主从触发模式 xff0c 输入捕获
  • 二极管反向恢复过程详细解析

    二极管反向恢复过程 xff0c 现代脉冲电路中大量使用晶体管或二极管作为开关 或者使用主要是由它们构成的逻辑集成电路 而作为开关应用的二极管主要是利用了它的通 电阻很小 断 电阻很大 特性 即二极管对正向及反向电流表现出的开关作用 二极管和
  • 性能优化总结

    性能优化关注点 从图中可以看出 xff0c 性能优化的主要关注 xff1a CPU 内存 磁盘IO 网络IO等四个方面 性能指标 每个关注点都有对应的指标 xff0c 吞吐率 响应时间 QPS IOPS TP99 资源使用率是我们经常关注的
  • Python:优先队列的使用及类的自定义比较函数

    Priority queue模块 该模块定义的优先级队列 xff0c 其内部使用了 heapq 模块 xff0c 所以它的时间复杂度和heapq是相同的 当一个对象的所有元素都是可比较的时 xff0c 默认情况下是根据队列中的对象的第一个元
  • 「STM32入门」USART串口通信

    通信 通信的目的 xff1a 将一个设备的数据传送到另一个设备 xff0c 扩展硬件系统 通信协议 xff1a 制定通信的规则 xff0c 通信双方按照协议规则进行数据收发 STM32常见的通信协议 本文将介绍USART 概念解释 TX R
  • 「数字信号处理」采样过程与内插恢复完整图解

    内插与采样的关系 来源 xff1a 数字信号处理 采样与内插 DSP期末知识点题型4 哔哩哔哩 bilibili
  • 配置vscode作为STM32代码的编辑器(替代keil5)。实现:代码自动补全, 编译,下载。nRF52也可以编译。

    STM32CubeMX新建好工程在工程根目录新建文件夹 vscode在 vscode 文件夹内新建文件c cpp properties json 34 configurations 34 34 name 34 34 STM32 34 任意的
  • Python中的字典

    1 字典概念 Python内置的数据结构之一 xff0c 与列表一样是一个可变序列 以键值对的方式存储数据 xff0c 字典是一个无序的序列 xff08 列表是有序的 xff09 字典通过计算key的hash值确定存储位置 xff0c 所以

随机推荐

  • docker中使用cuda

    需要注意的事项 1 注意应用NVIDIA在docker hub上提供的镜像 本次使用的是 nvidia cuda 10 1 cudnn7 devel ubuntu18 04 2 在宿主机安装 nvidia docker2 3 运行时 要加
  • Mysql8.0 忘记密码怎么办

    Mysql8 0 忘记密码怎么办 今天晨雨帮身边小伙伴解决了mysql8 0无法连接上的问题 中间碰到的一些问题和大家分享一下 跳过密码登录时不成功修改密码时不成功navicat连接时报 2000的问题 1 首先先停止mysql服务 可通过
  • Kurento实战之二:快速部署和体验,Java笔试题编程题

    GitCommit 269548fa27e0089a8b8278fc4fc781d7f65a939b runc Version 1 0 0 rc92 GitCommit ff819c7e9184c13b7c2607fe6c30ae19403
  • QT使用render时pixmap背景不为透明的解决办法

    当我们需要将一个界面绘制成图片时 xff0c 就需要使用到render方法 QPixmap pixmap pwidget gt size pwidget gt render amp pixmap 如果pwidget背景为透明时 xff0c
  • 【iOS】—— 高德地图SDK基础使用

    最近稍微学了学iOS调用高德的SDK xff0c 就随便做做笔记 注意 xff1a 本篇博客基于高德地图SDK的3D地图来写的 xff0c 若使用的是2D地图可能有的方法可能有所不同 xff0c 比如自定义定位蓝点之类的 一 准备工作 xf
  • 如何做代码Code Review

    预防胜于治疗 xff0c 研究表明高效的 Code Review 可以发现70 90 的 bug xff0c Review 作用如下 xff1a 提高团队代码标准 xff0c 所有人共享同一套标准 xff0c 阻止破窗效应 推动团队合作 r
  • 【iOS】—— 浅谈UISearchController

    UISearchController是iOS的一个系统的搜索控件 xff0c 在平时我们输入信息的时候会出现相应的联想搜索的内容 xff0c 然后通过UITableView展示到搜索框的下面 xff0c 供我们选择 原本还想用UITextF
  • Linux Shell中的正则表达式

    Linux Shell中的正则表达式 正则表达式是什么正则表达式通配符 cut命令awk命令sedsort排序命令wc统计命令 正则表达式是什么 正则表达式是用于描述字符排列和匹配模式的一种语法规则 它主要用于字符串的模式分割 匹配 查找及
  • 【Linux】刚烧录完(相当于是第1次连接),VNC树莓派无法连接

    文章目录 解决方法如下 xff1a 1 在Terminal中输入 96 vncserver 96 2 在Terminal中再输入 96 sudo raspi config 96 3 输入连接即可 刚烧录完 xff0c 然后用 ifconfi
  • QT 配置Opencv+gdal心得

    本人研究僧一枚 xff0c 老师给了使用QT开发遥感图像相关程序的课题 xff0c 完全从零开始学习 xff0c 查阅了许多的资料 xff0c 过程里东拼西凑 xff0c 碰壁无数 所以我就想写一些学习的心得体会 xff0c 给自己复习使用
  • Flink 从 kafka 中读取数据并输出到 kafka

    Kafka 是一个分布式的基于发布 订阅的消息系统 xff0c 本身处理的也是流式数据 kafka和flink二者被称为当前处理流式数据的双子星 下面我们将从以下几个步骤展开讲解 xff1a 目录 一 添加maven依赖 二 编写flink
  • 视图创建与管理实验

    xff08 一 xff09 在job数据库中 xff0c 有聘任人员信息表 xff1a Worklnfo表 xff0c 其表结构如下表所示 xff1a create table workinfo id int 4 not null uniq
  • LaTeX的篇章结构

    LaTeX的篇章结构 一般在撰写一个文档时 xff0c 总是先写出文章的提纲 然后根据该提纲进行展开 xff0c 来撰写其他的内容 文章目录 构建小节构建段落标题格式带章节大纲文档目录 构建小节 xff08 1 xff09 用section
  • LaTeX中的参考文献BibLaTeX

    LaTeX中的参考文献BibLaTeX 文章目录 一 介绍二 配置三 参考文献数据库文件四 引用文献1 导入宏包2 添加参考文献数据库3 不同方式引用参考文献4 输出参考文献列表5 编译执行6 修改标题7 列出没有引用的参考文献8 更多样式
  • 独立按键控制LED亮灭

    目录 一 独立按键 二 独立按键控制LED亮灭 三 按键的抖动 四 独立按键控制LED显示二进制 五 独立按键控制LED移位 一 独立按键 轻触按键 xff1a 相当于一种电子开关 xff0c 按下时开关接通 xff0c 松开时开关断开 x
  • 内网权限维持

    权限维持 以下测试均在win7 拓展方面 windows开启rdp 1 设置远程桌面端口 xff08 可以不用输 xff0c 直接第二步 xff0c 默认开启3389 xff09 reg add 34 HKLM System Current
  • 常见优秀代码汇总

    汇总常见的编程习惯 1 语义简单明确 含义 xff1a 写代码时考虑读者 xff0c 优先采取易于读者理解的写法 define THROTL UNSET 2 define THROTL NO LIMIT 1 bool throttle is
  • 2021/7/20

    8 xff1a 30 9 xff1a 00 学习打卡 9 xff1a 30 13 xff1a 00 二招刷题 15 xff1a 00 19 xff1a 00 二招刷题 1 xff0c a题 给你一个长度为N的序列 xff0c 现在需要把他们
  • python可安装软件的制作

    一 生成可执行文件 xff08 exe 安装打包工具pyinstaller 第一种 xff1a 通过win 43 R打开cmd直接使用下面的命令安装即可 pip install pyinstaller 第二种 xff1a 下载pyinsta
  • 汇编常见指令

    文章目录 常见的运算类汇编指令add指令sub指令mul乘法指令div除法指令inc xff08 自增 xff09 xff08 即C语言 43 43 xff09 dec xff08 自减 xff09 xff08 即 xff09 push x