关于汇编语言寄存器和指令操作的整理

2023-11-04

最近汇编学到后面的内容, 越来越觉得前面的基础没有掌握好, 弄得最后编写汇编程序的时候, 寄存器瞎用, 没有一点的规矩, 中断操作也不知道是对哪个寄存器里的数进行操作, 每次做一个小程序, 都得翻书后面的INT中断查询表, 感觉很不爽, 今天花了大半天把几本关于汇编的书前面的内容又翻了一遍, 结合自己做的笔记, 做了一个简单的整理, 关于寄存器和指令的, 以作复习汇编之用. 关于存哪个数据用哪个寄存器, 我觉得首先要弄清楚各个寄存器的用途, 以及指令是如何操作数据, 操作的哪个寄存器里的数据, 又是将操作完后的结果数据存放到那个寄存器中去的.

计算机内部寄存器阵列

l  数据寄存器

l  指针及变址寄存器

l  段寄存器

l  控制寄存器

数据寄存器

包括4个16位的寄存器(AX, BX, CX, DX)或者8个8位寄存器(    AH, AL, BH, BL, CH, CL, DH, DL)

这些寄存器都可以用来暂时存放操作数, 运算结果以及其他信息, 但同时又具有某些专用用途

l  AX 数据累加器

算术运算中的主要寄存器, 在乘除运算中用来指定被除数和被除数, 也是乘, 除,运算后积和商的默认存储单元. 另外I/O指令均使用该寄存器与I/O设备传送信息

l  BX 基址寄存器

指令寻址时常用做基址寄存器. 存入偏移量或偏移量的构成成分

l  CX 计算寄存器

在循环指令操作或串处理指令中隐含计数

l  DX 数据寄存器

在双字节长运算是, 与AX构成32位操作数, DX为高16位. 在某些I/O指令中, DX被用来存放端口地址

指针及变址寄存器

这些寄存器都是16位的寄存器, 用来存放16位的操作数或中间结果, 但更经常的用途是存放偏移量, 或位移量

l  SP 堆栈指针寄存器

始终只是栈顶的位置, 与SS寄存器一起组成栈顶数据的物理地址

l  BP 基址指针寄存器

系统默认其指向堆栈中某一单元, 即提供栈中该单元的偏移量. 加段前缀后, BP可作非堆栈段的地址指针

l  SI 源变址寄存器

与DS联用, 指示数据段中某操作的偏移量. 在做串处理时, SI指示源操作数地址, 并有自动增量或自动减量的功能. 变址寻址时, SI与某一位移量共同构成操作数的偏移量

l  DI 目的变址寄存器

与DS联用, 指示数据段中某操作数的偏移量, 或与某一位移量共同构成操作数的偏移量. 串处理操作时, DI指示附加段中目的地址, 并有自动增量或减量的功能

段寄存器

l  CS 代码段

存放当前程序的指令代码

l  DS 数据段

存放程序所涉及的源数据或结果

l  SS 堆栈段

以”先入后出”为原则的数据区

l  ES 附加段

辅助数据区, 存放串或其他数据

控制寄存器

l  IP 指令指针寄存器

它始终指向当前将要执行指令在代码段中存放的偏移量

l  FR 控制标志位

1.     CF 进位标识位

进行加减运算时, 如果最高二进制位产生进位或错位, CF则为1, 否则为0. 程序设计中, 常用条件转移指令JC, JNC指令据此标志位实现转移

2.     PF 奇偶标志位

操作结果中二进制位1的个数为偶数是, PF为1, 某则为0

3.     AF 辅助进位标志位

运算时半字节产生进位或借位时, AF为1, 某则为0. 主要用于BCD码的调整

4.     ZF 零标志位

运算结果为0时, ZF为1, 否则为0

5.     SF 符号标志位

当运算结果的最高位为1时, SF为1, 否则为0. 最高位表示符号数的正和负

6.     TF 跟踪标志位

用于调试程序时进入单步方式工作. TF=1时, 每条指令执行完后产生一个内部中断, 让用户检查指令运行后寄存器, 存储器和各标志位的内容. TF=0时, CPU工作正常, 不产生内部中断

7.     IF 中断允许标志位

IF=1同时中断屏蔽寄存器的相应位为0, 允许系统响应可屏蔽中断, 反之, 不接收外部发出的中断请求

8.     DF 方向位标志位

用于控制串操作时地址指针位移方向. 当DF=1时, 指针向高地址方向移动

9.     OF 溢出标志位

算术运算时结果超出系统所能表示的数的范围. 溢出时, OF=1

关于汇编代码中的指令

  汇编指令语句的格式: [标号:] 指令助记符 [[目的操作数][, 源操作数]] [; 注释]

l  指令助记符

如MOV, SUB这些词分别表示传送, 减法. 汇编源程序时, 系统使用内部对照表将每条指令的助记符翻译成对应的机器码

l  目的操作数

目的操作数一共有两个作用

1.     参与指令操作

2.     暂时储存操作结果

l  源操作数

源操作数主要提供原始数据或操作对象, 面向所有寻址方式. 例如, 在指令SUB AX, BX 中 的值作为减数提供给指令SUB

l  注释

这是对源程序的说明, 在汇编中用 ; 号, 后面的内容将被注释

  介绍指令前, 先熟悉下这些在指令中的符号(必须要记得)

l  imme: 立即数

l  DST: 目的操作数

l  SRC: 源操作数

l  mem: 存储器操作数

l  OPR: 操作数

l  reg: 通用寄存器

l  EA: 偏移地址(偏移量)

l  Sreg: 段寄存器

l  Port: 端口地址

l  Label: 标号

  汇编指令一共可以分为6组:

1.      数据传送指令

2.      算术运算指令

3.      逻辑运算与移位指令

4.      串操作指令

5.      程序控制指令

6.      处理器控制指令

数据传送指令

通用数据传送指令:

  l  MOV     DST, SRC      ;传送指令: 把源操作数的内容送入目的操作数

注意:

1.      立即数做源操作数时, 立即数的长度必须小于等于目的操作数的长度

2.      操作数DST, SRC分别为reg, reg或reg, Sreg或Sreg, reg时, 两者的长度必须保持一致

3.      CS和IP寄存器不能做DST操作数, 不允许用立即数直接为段寄存器赋值

4.      立即数不能作为目的操作数

5.      不能将一个段寄存器的内容直接送到另一个段寄存器中, 可借助通用寄存器或PUSH, POP指令实现这一要求

  l  PUSH     SRC        ;压栈指令: 将一个字数据压入当前栈顶, 位移量disp=-2的地址单元. 数据进栈时, 栈指针SP首先向低地址方向移动两个字节位置, 接着    数据进栈, 形成新的栈顶

  l  POP       DST              ;出栈指令: 弹出栈顶元素, 后将栈顶指针向栈底方向移动一个字

  l  XCHG    OPR1, OPR2        ;交换指令: 将这两个操作数交换

地址传送指令:

  l  LEA        DST, SRC      ;装载有效地址指令: 该指令将源操作数的偏移量OA装载到目的操作数中

  l  LDS        DST, SRC      ;装载数据段指针指令: 将当前数据段中的一个双字数据装入到一个通用寄存器SI(双字数据的低字)和数据段寄存器DS(双字数据的高字)中

  l  LES        DST, SRC      ;装载附加段指针指令: 将附加数据段中的一个32位地址数据指针(附加段指针)送到DI(低字)和ES(高字)寄存器中

标志传送指令: (专用于标志寄存器保护和更新的指令, 共四条)

  l  LAHF     ;标志寄存器送AH指令, 将标志寄存器的低字节送入AH中

  l  SAHF     ;AH送标志寄存器指令, 将AH寄存器内容送标志寄存器FR的低字节

  l  PUSHF   ;标志进栈指令, 标志寄存器进栈

  l  POPF     ;标志出栈指令, 标志寄存器出栈

累加器专用传送指令:

  l  IN   AL, Port        ;从端口读入数据, 存放在AL中

  l  OUT       Port, AL        ;传送AL中的数据到端口

  l  XLAT      OPR或XLAT        ;用于将AL中当前的内容转换为一种代码

算术运算指令

加法指令:

  l  ADD      DST, SRC      ;DST+SRC的和存放到DST中去

  l  ADC       DST, SRC      ;带进位加法指令, DST+SRC+CF

  l  INC        DST              ;增1指令

减法指令:

  l  SUB              DST, RSC      ;DST-SRC, 存放到DST中

  l  SBB        DST, SRC      ;带借位减法指令, DST-SRC-CF

  l  DEC              DST              ;减1指令

  l  NEG       DST              ;求补指令, 求补码

  l  CMP      OPR1, OPR2        ;比较指令

乘法指令:

  l  MUL      SRC        ;无符号数乘指令, AL*SRC, 结果放入AX中

  l  IMUL     SRC        ;有符号数乘指令, AL*SRC, 结果放入AX中

除法指令:

  l  DIV        SRC        ;无符号数除指令, AX/SRC, 商放入AL中, 余数放在AH中

  l  IDIV       SRC        ;符号数除指令, AX/SRC, 上放入AL中, 余数放在AH中

  l  CBW, CWD          ;都是符号扩展指令. 将AL的符号扩到AX中; 将AX的符号扩到DX中

逻辑运算与移位指令

逻辑运算指令:

  l  NOT       OPR       ;逻辑非指令

  l  AND      OPR       ;逻辑与指令

  l  OR         OPR       ;逻辑或指令

  l  XOR       OPR       ;逻辑异或指令

移位指令:

  l  SHL        DST, CNT      ;逻辑左移

  l  SHR       DST, CNT      ;逻辑右移

  l  SAL        DST, CNT      ;算术左移

  l  SAR              DST, CNT      ;算术右移

循环移位指令:

  l  ROL              DST, CNT      ;循环左移

  l  ROR       DST, CNT      ;循环右移

  l  RCL        DST, CNT      ;带进位循环左移

  l  RCR              DST, CNT      ;带进位循环右移

串操作指令

  l  MOVS   ;串传送指令

  l  CMPS    ;串比较指令

  l  SCAS     ;串扫描指令

  l  LODS     ;装入串指令

  l  STOS      ;存储串指令

控制转移指令

转移指令:

  l  JMP              ;无条件转移指令

  l  JX          ;条件转移指令(JC/JNC, JZ/JNZ, JE/JNE, JS/JNS, JO/JNO, JP/JNP…)

循环指令:

  l  LOOP     标号       ;该指令执行时, 技术寄存器CXX首先减1, 然后判断CX, 若为0, 跳出循环

条件循环指令:

  l  LOOPZ/LOOPE, LOOPNZ/LOOPNE       ;前者用于找到第一个不为0的事件, 后者用于找到第一个为0的事件

子程序调用指令:

  l  CALL      子程序名       ;段内直接调用

  l  RET

中断指令:

  l  INT        N(中断类型号)     ;软中断指令

  l  IRET       ;中断返回指令

处理器控制指令

标志处理指令:

  l  CLC        ;进位标志CF置0

  l  CMC      ;进位标志CF求反

  l  STC        ;进位标志值1

  l  CLD              ;方向标志置0

  l  STD              ;方向标志置1

  l  CLI         ;中断允许标志置0

  l  STI         ;中断允许标志置1

其他处理器控制指令:

  l  NOP      ;空操作

  l  HLT        ;停机

  l  WAIT     ;等待

  l  ESC        ;换码

  l  LOCK     ;封锁

 

  当然, 汇编还有很多指令, 我这边没有列出来, 用到的时候查查资料就Okay罗.

  祝大家周末愉快.


http://www.cnblogs.com/technology/archive/2010/05/16/1736782.html


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

关于汇编语言寄存器和指令操作的整理 的相关文章

  • 汇编王爽老师实验12,显示0号除法溢出中断

    整个程序不能脱离dosbox 在dosbox中触发中断 本程序的思路是 先编写0号中断子程序 在主程序中运用传送方法把中断子程序传送至内存段 1设置传送的起点2设置传送的终点3设置传送的代码段长度4设置传送的方向5rep 启动传送6修正中断
  • 函数调用约定(整理稿)

    函数调用约定 整理稿 Function calling convention 在C语言中 假设我们有这样的一个函数 int function int a int b 调用时只要用result function 1 2 这样的方式就可以使用这
  • ARM 64 协程切换上下文的汇编代码解读

    ARM 64协程切换上下文的汇编代码解读 贺志国 2023 8 11 在ARM 64位架构中 有一组通用寄存器 General Purpose Registers 一组浮点寄存器 Floating point Registers 和一组特殊
  • 2.9-2.12段寄存器和cs:ip

    段寄存器有四类 cs ds ss es 其中 cs是代码寄存器 它指向的代码段是一组地址连续 起始地址为16的倍数的内存单元 这个代码段可以存储长度为N N lt 64KB 的一组代码 而与之相关联的是IP 指令指针寄存器 步骤如下 1 c
  • 汇编笔记

    更新于20190929 1 Intel和AT T汇编 参数是反的 AT T寄存器前加 常量前加 Intel mov rax rcx rcx gt rax mov cl 2 对应AT T movq rcx rax rcx gt rax mov
  • win32汇编基础概念

    一 关于寄存器 寄存器有EAX EBX ECX EDX EDI ESI ESP EBP等 似乎IP也是寄存器 但只有在CALL RET在中会默认使用它 其它情况很少使用到 暂时可以不用理会 EAX是WIN32 API 默认的返回值存放处 E
  • 探讨STOS指令

    转载在http hi baidu com darks00n blog item 4c019ec42ad0cdcad00060b1 html 下面是一段win32 console程序 Debug版 的反汇编代码 很程式化的东西 本文不讨论这段
  • 【编译原理】课程一:编译原理入门

    目录 1 为什么要学习编译原理 2 什么是编译原理 3 编译与计算机程序设计语言的关系 3 1 程序设计语言的转换方式 3 2 编译的转换过程 3 3 编译器在语言处理系统中的位置 3 4 编译系统的结构 3 4 1 词法分析 扫描 3 4
  • 汇编符号语言

    CSDN话题挑战赛第1期 活动详情地址 第1期话题PK赛 参赛话题 汇编知识分享 话题描述 我们的计算机知识就像一座金字塔 底层是数学 上面是数字电路 然后是汇编 再往上是操作系统 网络 数据库 高级编程语言 框架等等 我们不可能精通这个金
  • C语言与汇编——宏定义,头文件重复包含,内存申请和释放

    c文件 gt 替换 gt 编译 gt 链接 gt exe文件 typedef 只能给变量类型起别名 而 define可以给任何东西起别名 头文件重复包含问题 pragma once也能避免同一个头文件被包含 include 多次 一般由编译
  • 汇编小作业(3) 十进制数的平方根

    用子程序结构编程 从键盘输入一个十进制数 对其开平方后分别将其平方根和余数以十进制数的形式显示 DATA SEGMENT SUM DW 2 DUP BUF DB 7 DUP DATA ENDS stack segment 定义栈段 保存di
  • ARM常用汇编指令

    目录 一 汇编基本语法 1 汇编指令的最典型书写模式 二 常用汇编指令 1 push压栈指令 2 pop出栈指令 3 sub指令 4 add指令 5 movs数据传输指令 6 str指令 7 ldr指令 8 bl指令 9 MOVW指令 10
  • 汇编语言+IDA安装问题解决汇总

    利用汇编语言计算机和人类链接更为便捷如下图所示 寄存器 简单讲就是CPU可以存储数据的器件 一个CPU可以有多个寄存器 AX BX是两个不同的寄存器 16位处理器有14个寄存器 AX BX CX DX SI DI SP BP IP CS S
  • IDM 6.4.1逆向分析笔记

    环境准备 安装过程不做说明 1 x64dbg 官网地址 https x64dbg com 2 火绒剑 官网地址 https www huorong cn SPY 下载地址 https github com westoncampbell Sp
  • asm:常用语法

    常用语法 1 循环 1 1 使用条件跳转指令实现循环 1 2 使用LOOP指令实现循环 2 字符串 2 1 指定字符串的长度 2 2 字符串指令 2 3 重复前缀 3 数组 4 递归 5 宏 6 文件操作 7 内存管理 1 循环 1 1 使
  • 北工大汇编——综合题(1)

    题目要求 统计字符数 从键盘输入一行字符 统计字母 空格 数字 其他宇符的个数 并显示 要求 提示输入一行宇符串 键盘输入宇符串 Enter 键结束输入 并换行显示结果 题目代码 DATAS SEGMENT 此处输入数据段代码 msg DB
  • 常见汇编指令整理

    本文会整理在逆向中常见的指令汇总 目录 汇编符号 汇编指令的组成 mov movzx lea xchg 加法指令 减法指令 带进位加法 带进位减法 自增自减 乘法运算 除法运算 and or xor not shl shr 逻辑指令 字符串
  • Windows游戏加速外挂-变速齿轮 学习笔记-【第一篇】

    找到两篇文章 是比较流行的方法 接下来记录一下收获 第一篇文章 变速齿轮 研究手记 转自 http www newasp net tech 58262 html 注意 如果你看了本文 对我们这个软件有兴趣 请到我们的主页www vrbrot
  • [原创]C++98升级到C++20的复习旅途-从汇编及逆向角度去分析“constexpr“关键字

    简介 常用网名 猪头三 出生日期 1981 XX XX QQ 643439947 个人网站 80x86汇编小站 https www x86asm org 编程生涯 2001年 至今 共22年 职业生涯 20年 开发语言 C C 80x86A
  • DOSBOX 快捷键及 MS-DOS 命令

    1 全屏 退出全屏 alt enter 2 释放鼠标 ctrl F10 3 exit 退出DOSBOX 4 dir 显示目录内容 可选参数 w 只显示文件名 P 显示部分内容 exe 筛选出可执行文件 5 cd 进入目录 cd 退回上一级目

随机推荐

  • 基于红外感应的远距离智能跟随小车,自动跟随小车

    跟随原理 下面介绍红外感应的跟随小车的自动跟随部分 基本原理 在小车上安装一个红外接收器 能测量红外入射角的感应器 人手持一个红外发射模块 根据不同的入射角 调整小车前进方向 若入射角在右边 就控制小车右转 若入射角在左边 就控制小车左转
  • QListWidget使用体验

    主窗口继承QWidget class CustomListWidgetDemo public QWidget 自定义CustomListWidget继承QListWidget class CustomListWidget public QL
  • linux sys pread64,pread()函数

    pread是一个函数 用于带偏移量地原子的从文件中读取数据 带偏移量地原子的从文件中读取数据 函数原型 ssize t pread intfd void buf size tcount off toffset 用法 返回值 成功 返回成功读
  • 新手 Java 编程思想应该如何提高?

    简化一下就是从理解抽象开始 最先要理解的就是 类 接口通常被理解为 全抽象 在Java中也有重要地位和作用 其次就是抽象类介于接口和类之间的概念 另外理解面向对象编程过程 逐渐掌握封装 继承 多态的应用从而形成一个完整的面相对象编程思想 理
  • script 脚本标签中 defer 和 async (延缓 和 异步)

    原文章 https segmentfault com q 1010000000640869 本文章讲解几个点
  • 运营新人也可以做的副业平台丨闲鱼运营(下)

    文章上半部分给大家深度分享了关于闲鱼的赚钱方法和店铺权重建设该如何提升 如果没有看上半部分内容 直接翻阅主页就可以查阅到 接下来我们分享关于闲鱼运营的下半部分 店铺运营 闲鱼何运营总共分为三个部分 第一个部分是闲鱼养号 第二部分是内容编辑
  • K8s二进制部署-flanneld报(Couldn‘t fetch network config)

    1 报错提示 将网络配置信息写入了ETCD中 启动flanneld测试时一直报错 具体报错如下 root master1 tail 100f var log messages Dec 15 23 39 22 localhost flanne
  • 多文件编辑作业(2023.1.10)

    第一题 main c include head h int main int argc const char argv char str hello my student int start 0 int end strlen str 1 M
  • 提供一个用于计算两个point之间的距离方法_汇总

    作者 Tom Hardy Date 2020 02 18 来源 汇总 基于3D点云的深度学习方法 前言 三维数据通常可以用不同的格式表示 包括深度图像 点云 网格和体积网格 点云表示作为一种常用的表示格式 在三维空间中保留了原始的几何信息
  • 已解决报错UnboundLocalError: local variable ‘title‘ referenced before assignment

    1 今天抓取某网站的数据时 显示报错UnboundLocalError local variable title referenced before assignment Traceback most recent call last Fi
  • 无法启动64位idea,无法启动idea64.exe的一种原因(意外删除破解文件导致无法打开idea)

    前言 突然有一天 我的IDEA出现了问题 点击桌面快捷方式的idea毫无反应 无奈之下重装了IDEA 但还是有相同的问题 无法打开64位的idea 网上找了一堆博客 花了两个多小时终于解决了 写篇博客记录下这个问题 1 首先打开idea b
  • 初识网络安全(黑客技术)

    目录 前言 一 安全事件案例 二 网络安全行业公司 三 网络安全岗位 四 网络安全网站 五 src漏洞平台 总结 前言 网络安全是指保护计算机网络和网络上的数据免受未经授权的访问 使用 泄露 破坏和干扰的一系列措施和技术 在当今数字化时代
  • JAVA web 获取系统时间

  • ROS---保存地图

    建立save map sh文件夹 bin bash rosrun map server map saver f catkin ws src hypharos minicar launch map mymap 保存地图时我们进入此文件所在文件
  • 从零实现一套属于自己的UI框架-发布到npm

    汤小梦 https juejin im post 5e200ee86fb9a02fdd38986d 不知不觉马上就要放假了 写一篇文章祝愿 2020 越来越好 如今前端工程师的要求越来越高了 需要掌握的技术点越来越多了 会一些基本的前端技能
  • 华为云 CentOS 8 下 Nginx 1.20 & PHP 8.2 安装

    Nginx 1 20 版本安装 使用 dnf module 选择 nginx 版本 如果不选择 默认安装 1 14 版 1 先 RESET 一下 xxx ecs 209716 sudo dnf module reset nginx Repo
  • 子网划分,子网掩码

    1 IP地址分类 有类编址 所谓的同一网段就是 网络位一模一样 才叫在同一网段 否则不是在同一网段 网络位 主机位 固定电话的区号 025 主机你的电话号码 85562264 同一区号 之间 漫游费 南京 徐州 苏州 漫游 借助路由器转发我
  • Qt多线程中的moveToThread()的简单用法

    之前在项目中用到了Qt的多线程 因为以前用的一直是用一个类直接继承QThread 然后再重写run 方法 需要注意的是 QThread只有run函数是在新线程里的 其他所有函数都在QThread生成的线程里 后来查阅了一些资料才知道 Qt有
  • 00_Ubuntu系统入门

    目录 前言 一 Ubuntu系统安装 1 1 VMware15安装虚拟机不兼容 无法打开 1 2 Ubuntu联网问题 二 Ubuntu系统入门 2 1 Ubuntu系统初体验 2 2 Ubuntu终端操作 2 3 shell操作 2 3
  • 关于汇编语言寄存器和指令操作的整理

    最近汇编学到后面的内容 越来越觉得前面的基础没有掌握好 弄得最后编写汇编程序的时候 寄存器瞎用 没有一点的规矩 中断操作也不知道是对哪个寄存器里的数进行操作 每次做一个小程序 都得翻书后面的INT中断查询表 感觉很不爽 今天花了大半天把几本