当前位置: 首页 > ai >正文

x86汇编语言入门基础(三)汇编指令篇1 逻辑位运算

x86汇编指令介绍

x86指令格式:助记符 mnemonic + 操作数 operand

操作数:表示此次操作需使用的数据,x86指令的操作数可以是寄存器REG内存地址MEM、立即数IMM

*x86指令最多只能包含一个内存位置(处理器管线pipeline的设计,每条指令只能执行一次内存读取),

例如add [0x12345678], [0x87654321]是无效的指令(一次使用了两个内存地址)

汇编指令格式​​​​

用词说明:

  • 助记符, 即mnemonic
  • 目的操作数,即destination、operand1、op1
  • 源操作数,即source、operand2、op2

不同指令的操作数“取值范围”不同:寄存器reg/内存地址mem/立即数imm

逻辑位运算

AND, OR, XOR

指令格式:助记符 目的操作数, 源操作数

  • 与AND、或OR、异或XOR,这三个指令都需要两个操作数,按位进行逻辑运算;
  • 目标操作数op1:只能是寄存器reg或内存地址mem;
  • 源操作数op2:可以是寄存器reg、内存地址mem、立即数imm;

典型应用场景
  • AND 指令常用于清零特定位(用0掩码)或保留特定位(用1掩码);
  • OR 指令常用于设置特定位为1(用1掩码), 例如:
    • 将eax的值全设为1:or eax, 0xffffffff;
    • 将eax的最高位设为1:or eax, 0x80
  • XOR 指令常用于对某个寄存器进行清零,例如:xor eax, eax

AND “与”门真值表

OR “或”门真值表

XOR “异或”门真值表

TEST

指令格式:test op1, op2

对两个操作数按位进行“AND 与”操作,但不会保存运算结果,仅设置标志寄存器的flag状态。

  • 目标操作数op1:只能是寄存器reg或内存地址mem;
  • 源操作数op2:可以是寄存器reg、内存地址mem、立即数imm;

应用场景

  • 检查寄存器是否位0,例如:test eax, eax ; jnz;  
  • 检查AL最低位是否为1,例如:test AL, 0x01;

NOT

指令格式:not 目标操作数(REG/MEM)

计算补码(可以理解为把二进制表示下的所有0变为1,把所有1变为0,取反)

  • 操作数必须为寄存器REG或内存地址MEM

x86汇编指令文档阅读指引

coder32 edition | X86 Opcode and Instruction Reference 1.12

初阶阅读指引

  1. CTRL+F 查找指令
  2. 最右列description, notes:查看指令的功能描述和额外的备注信息
  3. 查看op1、op2:指令操作的数据

文档中的字段意义

  1. pf:预取标志(Prefetch Flag),指示指令是否支持预取操作。
  2. 0F:这是一个特定的操作码前缀,用于扩展指令集,允许更多的操作码组合。
  3. po操作码(Opcode),指令的编码,用于标识具体的指令。
  4. so:源操作数(Source Operand),指令操作的数据源。
  5. o:操作数(Operand),指令操作的数据。
  6. pr:前缀(Prefix),用于修改指令的行为,如操作数大小前缀、地址大小前缀等。
  7. oc:操作码扩展(Opcode Extension),用于进一步扩展指令集,允许更多的操作码组合。
  8. st:状态(Status),指示指令的状态,如是否已测试、是否修改等。
  9. m:修改(Modify),指示指令是否修改了某些状态或寄存器。
  10. rl:读取(Read),指示指令是否读取了某些状态或寄存器。
  11. x:执行(Execute),指示指令是否执行了某些操作。
  12. mnemonic助记符(Mnemonic),指令的名称,用于表示指令的功能。
  13. op1, op2, op3, op4:操作数(Operands),指令操作的数据,可以是寄存器、内存地址、立即数等。
  14. iext:指令扩展(Instruction Extension),用于进一步扩展指令集。
  15. tested:测试(Tested),指示指令是否已经过测试。
  16. f:标志(Flag),指示指令是否影响某些标志寄存器。
  17. modif:修改(Modify),指示指令是否修改了某些标志寄存器。
  18. def:定义(Define),指示指令是否定义了某些标志寄存器。
  19. undef:未定义(Undefined),指示指令是否未定义某些标志寄存器。
  20. f values:标志值(Flag Values),指示指令执行后标志寄存器的值。
  21. description, notes:描述和备注(Description, Notes),提供指令的功能描述和额外的备注信息。

“记住,没有人能记住所有的x86指令。无论你是在编写x86代码,还是在阅读x86程序,只要遇到不理解的地方,就要自己查找相关信息,因此快速查找的能力很关键。我们总是打开这个标签(tab)以便快速查找:http://ref.x86asm.net/coder32.html。” --摘自《x86 汇编与逆向工程:软件破解与防护的艺术》

http://www.xdnf.cn/news/14765.html

相关文章:

  • 6. 常见K线形态(楔形与旗形)
  • docker 介绍
  • redis缓存三大问题分析与解决方案
  • 在银河麒麟V10 SP1上手动安装与配置高版本Docker的完整指南
  • 归并排序详解
  • 【网工|知识升华版|实验】4 DHCP原理及应用
  • 数据结构20250620_数据结构考试
  • 南方大暴雨及洪水数据分析与可视化
  • 【Linux】不小心又创建了一个root权限账户,怎么将它删除?!
  • Rust实现FasterR-CNN目标检测全流程
  • 什么是端到端自动驾驶
  • [HDLBits] Cs450/timer
  • Spring MVC详解
  • windows系统下将Docker Desktop安装到除了C盘的其它盘中
  • 力扣 hot100 Day32
  • 毫米波雷达 – 深度学习
  • 腾讯 iOA 零信任产品:安全远程访问的革新者
  • 【仿muduo库实现并发服务器】Channel模块
  • Wireshark TS | 诡异的光猫网络问题
  • rocketmq 之 阿里云转本地部署实践总结
  • MySQL MVCC 详解
  • Linux基本命令篇 —— grep命令
  • jQuery UI 安装使用教程
  • 设置linux静态IP
  • 苹果AR/VR头显路线图曝光,微美全息推进AI/AR智能眼镜新品开启视觉体验篇章
  • 《UE5_C++多人TPS完整教程》学习笔记40 ——《P41 装备(武器)姿势(Equipped Pose)》
  • 为什么js是单线程?
  • 应用场景全解析:飞算 JavaAI 的实战舞台
  • 使用vue开发浏览器chrome插件教程,及之间的消息通信
  • Rust征服字节跳动:高并发服务器实战