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

NEG指令说明

文章目录

      • 关键演示点说明:
      • NEG指令 - 二进制补码取反

; 设置处理器模式和内存模型
.586                ; 使用 586 指令集
.model flat, stdcall ; 平坦内存模型,stdcall 调用约定
option casemap:none  ; 区分大小写; 引入库文件
includelib kernel32.lib  ; Windows API 库
includelib msvcrt.lib    ; C 运行时库.data  ; 数据段定义; 测试数据byteVal   db  80h      ; -128(有符号最小值)wordVal   dw  0001h    ; 1dwordVal  dd  80000000h ; -2147483648(有符号最小值)zeroVal   db  00h      ; 0(测试CF标志); 结果存储byteResult  db  ?wordResult  dw  ?dwordResult dd  ?; 标志位检测CF_flag db ?        ; 进位/借位标志OF_flag db ?        ; 溢出标志SF_flag db ?        ; 符号标志ZF_flag db ?        ; 零标志.code  ; 代码段
main proc; ---------------------------; 1. 8位NEG指令演示(有符号溢出); ---------------------------mov al, byteVal      ; AL = 80h (-128)neg al               ; AL = -(-128) = -128(溢出)mov byteResult, al   ; 存储结果(仍为80h); 标志位变化:; CF=1(因为源操作数非零); OF=1(有符号溢出:-128无法用+128表示); SF=1(结果为负); ZF=0(结果非零); ---------------------------; 2. 16位NEG指令演示(正常取反); ---------------------------mov ax, wordVal      ; AX = 0001h (1)neg ax               ; AX = -1 (FFFFh)mov wordResult, ax   ; 存储结果; 标志位变化:; CF=1(因为源操作数非零); OF=0(无有符号溢出); SF=1(结果为负); ZF=0(结果非零); ---------------------------; 3. 32位NEG指令演示(最小值溢出); ---------------------------mov eax, dwordVal    ; EAX = 80000000h (-2147483648)neg eax              ; EAX = -(-2147483648) = -2147483648(溢出)mov dwordResult, eax ; 存储结果(仍为80000000h); 标志位变化:; CF=1(因为源操作数非零); OF=1(有符号溢出); SF=1(结果为负); ZF=0(结果非零); ---------------------------; 4. 内存操作数取反; ---------------------------neg byteVal          ; byteVal = -(-128) = -128(80h,溢出); 标志位与案例1相同; ---------------------------; 5. 零值测试(验证CF标志); ---------------------------mov bl, zeroVal      ; BL = 0neg bl               ; BL = -0 = 0; 标志位变化:; CF=0(因为源操作数为零); OF=0(无溢出); SF=0(结果非负); ZF=1(结果为零); ---------------------------; 标志位存储演示; ---------------------------setc CF_flag        ; 存储进位标志(最后操作后应为0)seto OF_flag        ; 存储溢出标志(最后操作后应为0)sets SF_flag        ; 存储符号标志(最后操作后应为0)setz ZF_flag        ; 存储零标志(最后操作后应为1); ---------------------------; 程序退出; ---------------------------xor eax, eax        ; 返回码 0ret
main endpend main

关键演示点说明:

  1. 边界值溢出(案例1和3):

    • 对8位-128(80h)和32位-2147483648(80000000h)取反时,由于无法表示对应的正数,会产生溢出(OF=1)
  2. 正常取反(案例2):

    • 对1取反得到-1(FFFFh),标志位正常变化
  3. 内存操作(案例4):

    • 演示直接对内存操作数使用NEG指令
  4. 零值测试(案例5):

    • 验证当操作数为0时,CF=0且ZF=1
  5. 标志位存储

    • 使用setc/seto等指令将标志位存入变量,便于调试观察

所有测试案例均展示了NEG指令的核心特性:对操作数进行二进制补码取反(等价于0-operand),并正确设置处理器标志位。

NEG指令 - 二进制补码取反

操作码指令格式说明
F6 /3NEG r/m8对8位寄存器/内存操作数取补码
F7 /3NEG r/m16对16位寄存器/内存操作数取补码
F7 /3NEG r/m32对32位寄存器/内存操作数取补码

操作语义:

IF DEST == 0 THEN CF ← 0 ELSE CF ← 1; 
FI;
DEST ← 0 - (DEST)

标志位影响:

  • CF(进位标志):源操作数为0时清零,否则置1
  • OF(溢出标志):根据结果设置
  • SF(符号标志):根据结果设置
  • ZF(零标志):根据结果设置
  • AF(辅助进位标志):根据结果设置

技术说明:

  1. 该操作等效于计算0 - operand
  2. 对内存操作数使用时需要显式指定操作数大小(byte/word/dword)
  3. 对-128(8位)、-32768(16位)或-2147483648(32位)取反时会产生溢出(OF=1)

示例:

NEG AL      ; 8位寄存器取反
NEG [BX]    ; 16位内存操作数取反(需类型声明)
NEG EAX     ; 32位寄存器取反
http://www.lryc.cn/news/605151.html

相关文章:

  • Android补全计划 TextView设置文字不同字体和颜色
  • 全视通智慧护理巡视:做护理人员的AI助手
  • 关于vue __VUE_HMR_RUNTIME__ is not defined报错处理
  • plex客户端升级以后显示的内容太多了怎么办?
  • 比特币挖矿的能源消耗和环保问题
  • 【图像处理】直方图均衡化c++实现
  • 个人如何做股指期货?
  • 以ros的docker镜像为例,探讨docker镜像的使用
  • Docker常用命令速查手册:容器运维七维指南
  • 深入剖析 Spark Shuffle 机制:从原理到实战优化
  • STL:序列式容器
  • 轻松打造Unity小游戏AR体验
  • PHP语法高级篇(七):MySQL数据库
  • OSS-服务端签名Web端直传+STS获取临时凭证+POST签名v4版本开发过程中的细节
  • Spring AOP详细解析
  • [硬件电路-106]:模拟电路 - 电路为什么会出现不同的频率特性?元件频率依赖性、信号传输路径、电路拓扑结构、外部因素
  • 【maven】仓库配置
  • Matrix Theory study notes[6]
  • USRP捕获手机/路由器数据传输信号波形(上)
  • ZKMall商城开源本地部署指南
  • Apache Ignite 集群标识(Cluster ID)和集群标签(Cluster Tag)
  • 【物联网】基于树莓派的物联网开发【18】——树莓派安装Mosquitto服务
  • anaconda和Miniconda安装包32位64位皆可,anaconda和Miniconda有什么区别?
  • 2419. 按位与最大的最长子数组
  • 【 建模分析回顾】[MultiOutputClassifier]MAP - Charting Student Math Misunderstandings
  • mac升级安装python3
  • LeetCode 53 - 最大子数组和
  • 【Unity3D实例-功能-移动】复杂移动(Blend Tree方式)
  • JeecgBoot(1):前后台环境搭建
  • 【Excel】制作双重饼图