从今天起开始学习intel汇编(四) 整数算术指令

一 移位和循环移位指令
  1.逻辑移位和算术移位
    逻辑移位是以0填充移出的位
    算术移位是以符号位填充移出的位
  2.SHL指令
    对目的操作数做逻辑左移操作,最低位以0填充,并将最后移出的位放入CF标志中
    mov al, 10001111b
    shl al, 2        ;cf = 0    
  3.SHR指令
    对目的操作数做逻辑右移运算,移出的数据位以0代替, 最后移出的位被放进CF标志中
    mov al, 00000010b
    shr al, 2       ;cf = 1
  4.SAL和SAR指令
    SAL与SHL等价, SAR执行算术右移
    mov al, 11110000b
    sar al, 1    ; al = 11111000, cf = 0
  5.ROL指令
    ROL指令在想左移移位后,把移出的位同时复制到进位标志和最低位中。
    mov al, 01000000b
    rol al, 1    ;al = 10000000b, cf = 0
    rol al, 1    ;al = 00000001b, cf = 1
  6.ROR指令
    向右移位, 把移出的位复制到进位标志和最高位中。
    mov al, 00000001b
    ror al, 1    ;al = 10000000b, cf = 1
  7.RCL和RCR指令
    RCL指令在每位左移后, 把进位标志复制到最低有效位中,把最高有效位复制到进位标志
    这个指令可以用来从进位标志中恢复一个位:
    .data
    testval BYTE 01101010b
    .code
    shr testval, 1     ;右移移位
    jc exit            ;如果最低位是1, 跳转
    rcl testval, 1     ;否则恢复该位
    RCR指令把每位右移, 把进位标志复制到最高有效位中,并把最低有效位复制到进位标志中
  8.SHLD/SHRD指令
    SHLD把目的操作数左移指定位数,左移空出来的位用源操作数的高位填充,指令对源操作数没影响
    寄存器标志位受影响
    SHLD 目的操作数,源操作数,移位位数
    SHRD把目的操作数向右移动指定位数,空出来的位由源操作数的低位填充。
    SHRD 目的操作数, 源操作数, 移位位数
二 乘法和除法指令
  1.MUL指令
    无符号MUL有三种格式  
    将8位操作数和AL相乘 MUL r/m8  结果存放到 AX中
    将16位操作数和ax相乘 MUL r/m16 结果存放到 DX:AX中
    将32位操作数和eax相乘 NUL r/m32 结果存放到 EDX:EAX中
    如果积的高半部分不为0, 就设置进位和溢出标志。由于是无符号,只关心进位标志
    mov al, 5h
    mov bl, 10h
    mul bl     ;ax = 50h, cf = 0
    mov ax, 2000h
    mov bx, 0100h
    mul bx        ; DX:AX= 00200000h, cf=1
  2.IMUL指令
    IMUL执行有符号整数的乘法, 保留乘积的符号位,IMUL指令由三种格式,单操作数, 双操作数,三操作数。
    单操作数把乘积存储在累加器中
    IMUL r/m8   存放到AX
    IMUL, r/m16 存放到DX:AX中
    IMUL, r/m32 存放到ESX:EAX中
    如果乘积的高半部分不是低半部分的符号扩展, 进位标志和溢出标志置位
    双操作数格式把乘积存储在第一个操作数中,第一个操作数必须是寄存器,第二个操作数可以是寄存器,内存或者立即数:
    IMUL r16, r/m16
    IMUL r16, imm8
    IMUL r16, imm16
    IMUL r32, r/m32
    IMUL r32, imm8
    IMUL r32, imm32
    双操作数格式会根据操作数的大小进行裁剪, 如果有效位丢失, 则溢出标志和进位标志置位。
    三操作数格式吧乘积存储在第一个操作数中, 一个16位的寄存器可被一个8位或16位的立即数乘
    IMUL r16, r/m16, imm8
    IMUL r16, r/m16, imm16
    一个32位寄存器可被一个8位或者32位的立即数相乘:
    IMUL r32, r/m32, imm8
    IMUL r32, r/m32, imm32
    如果有效位丢失,则进位和溢出标志置位。
  3.DIV指令无符号整数除法
    执行8位, 16位, 32位无符号整数除法运算指令中唯一的一个寄存器或者内存操作数是除数
    DIV r/m8  被除数AX 商 AL 余数AH
    DIV R/M16 被除数DX:AX 商AX 余数DX
    DIV R/M32 被除数EDX:EAX 商EAX 余数EDX
  4. IDIV 有符号整数除法
    在进行除法之前,隐含的被除数必须进行符号扩展
    符号扩展指令CBW 扩展AL的符号位到AH中。
    CWD指令扩展AX符号至DX中
    CDQ扩展EAX的符号位至EDX中
    下面是-48除以5
    mov al, -48
    cbw
    mov bl, 5
    idiv bl
三 扩展加法
  1.ADC指令
    把源操作数,目的操作数以及进位标志相加, 指令格式与MOV指令是一样的
    mov dl, 0
    mov al, 0ffh
    add al, 0ffh
    adc dl, 0     ;dl = 1
  2.SBB指令
    从目的操作数中减去源操作数和进位标志的值,指令允许操作数与ADC指令相同
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值