通用数据处理指令

本文详细介绍了汇编语言中的数据处理指令,包括数据传送类的MOV和XCHG,堆栈操作的push和pop,算数运算类如ADD、SUB、MUL和DIV,以及位操作指令。这些指令在程序设计中起到关键作用,涉及寻址方式、状态标志影响、堆栈应用和无符号/有符号运算等概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



数据传送类指令

通用数据传输

  1. MOV

    • 要注意的一点就是传送时的寻址方式的组合
      寻址组合
  2. XCHG

    • 可以在通用寄存器之间,或者寄存器、存储器之间,使其内容交换
    • 值得注意的是 XCHG eax,eax 相当于 NOP
    • NOP 即空指令,但处理器处理它的时候会花费时间,而且在主存中也会占用一字节
    • 有时会利用NOP来实现短时间延时,或临时占用代码空间以便以后填入需要的指令代码

堆栈操作

  1. push

    • 寄存器内存16位的数据,或者 段寄存器 的数据压入栈,
    • 或者将 寄存器内存立即数32位的数据压入栈
    • push eax 相当于 sub ip,4 \ mov [esp],eax
  2. pop

    • 参数方面同上
    • pop eax 相当于 add ip,4 \ mov eax,[esp]
  3. 堆栈的应用
    存数据、函数传参、中断保存寄存器数据等

  4. 注意:
    堆栈操作提供了16位和32位的堆栈操作,但在32位平台还是应该尽量使用32位的堆栈操作


算数运算类指令

  • 关于状态标志
    在算数运算类指令中很多指令将会影响状态标志,或者读取状态标志。
    主要的状态标志有CF、OF、ZF、SF、PF
  • ADD

    • 将目的操作数加上源操作数,结果送入目的操作数
    • 它支持寄存器与寄存器、立即数、存储单元之间的加法运算
    • 可进行8、16、32位运算
  • ADC

    • 在ADD的基础上,再加上当前CF(进位标志)
    • 可以实现较大数据的加法
  • INC

    • 只有一个操作数,将操作数增1
    • 不会改变cf标志位
  • SUB

    • 将目的操作数减去源操作数,差送入目的操作数
    • 支持的寄存器同ADD
  • SBB

    • 在完成SUB的基础上,减去CF标志位
    • 可以实现位数较大数的减法
  • DEC

    • 只有一个操作数,将其减1
    • 不会改变cf
  • NEG

    • 求补指令,只有一个操作数,对它进行求补,即,用零减去操作数
    • 可以用于对负数求补码,或者由附属的补码求其绝对值
  • CMP

    • 进行差值不送入目的操作数的减法操作
    • CMP会影响ZF、SF、CF、OF,通过这些标志位可以判断两个操作数的大小关系
    • 利用CMP可以实现跳转
  • MUL

    • 可以进行8、16、32位操作数与累加寄存器(AX)的无符号乘法
    • 8位乘法用操作数乘al,将积放入ax
    • 16位乘法用操作数乘ax,将积的高16位放入dx,低16位放入ax
    • 32位乘法,乘eax,将积高32位放入edx,低32位放入eax
  • IMUL

    • 与MUL两点不同,一方面它是有符号乘法
    • 同时它除了可以单操作数(与ax),还可以双操作数,三操作数(必有一个立即数)
    • 积溢出则丢掉高位,并设置CF=OF=1,否则CF=OF=0
  • DIV
    • 进行16,32,64位无符号数的除法
    • 16位除法:ax除以操作数,商放入al,余数放入 ah
    • 32位除法:被除数高16位放入DX,低16位放入AX,除以操作数,商放入AX,余数放入DX
    • 64位除法:被除数高32位放入EDX,低32位放入EAX,除以操作数,商放入EAX,余数放入EDX
    • 除法指令对状态标志没有定义,但可能引起0号中断,即除数位零
    • 这个问题应由实际应用处理,操作系用只提示错误
  • IDIV
    • 进行有符号数的DIV
  • MOZX
    • 将寄存器、内存中的8位或16位无符号数转化为16位或32位数
  • MDSX
    • 将寄存器、内存中的8位或16位有符号数转化为16位或32位
  • CBW
    • 进行符号数的扩展,将al扩展为AX
  • CWD
    • 进行符号数扩展,将AX扩展为DX、AX
  • CWDE
    • 进行符号数扩展,将AX扩展为EAX
  • CDQ
    • 进行符号数扩展,将EAX扩展为EDX、EAX
  • 十进制调整命令
    • 让BCD码的二进制运算跳过6个舍弃的编码,正确反映BCD码运算结果
    • 包括AAAAASAAMAAD对应加减乘除

位操作指令

  • 逻辑运算指令
    • 包括AND、OR、NOT、XOR,即按位与、或、非、亦或(比较简单)
    • TEST 进行不返回结果(只影响状态标志的AND)
  • 移位命令
    • 分为逻辑移位算数移位
    • SHL、SHR分别是逻辑左、右移位,空位补零,移出位进入CF
    • SAL、SAR分别是算数左、右移位,SAL与SHL相同,SAR**高位不变、低位进入CF**
  • 循环位移
    • rol、ror不带进位循环位移,移出位给cf
    • rcl、rcr带进位循环位移,用cf补位,移出位给cf
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值