汇编语言算数指令笔记

1.加法指令ADD

add 指令将源与目的操作数相加,结果送到目的操作数。源操作数为立即数时,源操作数带扩展为和目的操作数相同长度类型

ADD  reg ,imm/reg/mem ;reg<--reg+imm/reg/mem

ADD  mem,imm/reg ;mem<--mem+imm/reg

注意:

源操作数和目标操作数类型匹配

目标不能是立即数和CS段寄存器

两个操作数不能同时为存储器操作数(格式特点:带有[])

对于ADD mem,imm的形式,要指明mem的长度类型(如:BYTE PTR [100H])

示例:

ADD  AL, 2050H                     ;错误,AL寄存器为8位,而立即数为16位

ADD  AX,50H                       ;正确

ADD  AX,BL                        ;错误,前后两个寄存器位数不同

ADD  2050,AX                       ;错误,目标操作数不能为立即数

ADD  CS,2050H                      ;错误,目标操作数不能为立即数CS段寄存器

ADD  [200H],05H                    ;错误,未指定内存单元的长度类型

ADD  BYTE PTR [200H],BYTE PTR [100H] ;错误,不允许源操作数和目的操作数都为mem

ADD指令按状态标志的定义相应设置:

CF  OF  SF  ZF  AF  PF ----重点理解对CF与OF的影响

af79897133e548cb9f508fe27bffd025.png

ff778d4a7395483ea7f7f5d863d63f0b.png

2.带进位加法指令ADC

ADC指令将源与目的的操作数相加,再加上进位CF标志,结果送到目的的操作数

ADC指令主要与ADD配合,实现多精度加法运算

ADC  reg,imm/reg/mem         ;reg<--reg+imm/reg/mem+CF

ADC  mem,imm/reg             ;mem+imm/reg+CF

计算双字加法:0234 4652H+F0F0 F0F0H:

mov  ax,4652h                  ;ax=4652h

add  ax,0f0f0h                  ;ax=3742h,CF=1

mov  dx,0234h                  ;dx=0234h

adc  dx,0f0f0h                  ;dx=f325h,CF=0

;DX.AX=0234  4652H

      +F0F0  F0F0H

      =F325  3742H

注:用汇编处理时最多只能处理16位的,在处理高16位加法的时候使用adc 

3. 增量指令INC

INC 指令对操作数加1(增量),主要用于对计数器和地址指针的调整

INC 指令不影响进位CF标志,按定义设置其他状态标志

 

INC  reg/mem              ;reg/mem<--reg/mem+1

inc  bx

inc  byte ptr [bx]

4.减法指令SUB

SUB指令将目的操作数减去源操作数,结果送到目的操作数

 

SUB  reg,imm/reg/mem       ;reg<--reg-imm/reg/mem

SUB  mem,imm/reg          ;mem<--mem-imm/reg

注意:

源操作数和目标操作数类型匹配

目标不能是立即数和CS段寄存器

两个操作数不能同时为mem

对于SUB  mem,imm的形式,要指明mem的长度类型

 8221d63cda384599b203399987bfa786.png

 5.带借位减法指令SBB

SBB指令将目的操作数减去源操作数,再减去借位CF(进位),结果送到目的操作数

SBB指令主要与SUB配合,实现多精度减法运算

 

SBB  reg,imm/reg/mem              ;reg<--reg-imm/reg/mem-CF

SBB  mem,imm/reg                  ;mem<--mem-imm/reg-CF

 

计算双字减法:0234 4652H-F0F0 F0F0H:

mov  ax,4652h                  ;ax=4652h

sub  ax,0f0f0h                  ;ax=5562h,CF=1

mov  dx,0234h                  ;dx=0234h

sbb  dx,0f0f0h                  ;dx=1143h,CF=1

;DX.AX=0234  4652H

      -F0F0  F0F0H

      =1143  5562H

6.减量指令DEC

DEC 指令对操作数减1(减量),主要用于对计数器和地址指针的调整

DEC指令不影响进位CF标志,按定义设置其他状态标志

 

DEC  reg/mem              ;reg/mem<--reg/mem-1

dec  bx

dec  byte ptr [bx]

7. 求补指令NEG

 

NEG 指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数。求补运算也可以表达成:将操作数按位取反后加1

ENG 指令对标志的影响与零做减法SUB指令一样

 

ENG  reg/mem          ;reg/mem<--0-reg/mem  例如:求0110 0100 的补码就相当于计算100000000-01100100

mov   ax,0ff64h

neg  a1        ;ax=ff9h,OF=0、SF=1、ZF=0、CF=1、AF=1

sub  al,9dh     ;ax=ffffh,OF=0、SF=1、ZF=0、CF=1、AF=1

neg  ax     ;ax=0001h,OF=0、SF=0、ZF=0、CF=0、AF=1

dec  a1         ;ax=0000h,OF=0、SF=0、ZF=1、CF=1、AF=0

neg  ax         ;ax=0000h,OF=0、SF=0、ZF=1、CF=1、AF=0

8.符号扩展指令(MOVSX):

符号扩展是指用一个操作数的符号位(即最高位)形成另一个操作数,后一个操作数的各位全是0(正数)或全是1(负数)。符号扩展不改变数据大小(符号扩展指高一半是符号位,没有实际的数值)

  1. 对于数据64H(表示数据100),其最高位D7为0,符号扩展后高8位都是0,成    为0064H(仍表示数据100)
  2. 对于数据FF00H(表示有符号数-256),其最高位D15为1,符号扩展后高16位都是1,成为ffffff00H(仍表示有符号数-256)

符号扩展指令常用于获得倍长的数据

 

不影响标志位

CBW  ;AL的符号扩展至AH          byte to word

  ;如AL的最高有效位是0,则AH=00

      ;AL的最高有效位为1,则AH=FFH。AL不变

 

CWD  ;AX的符号扩展至DX         word to double word

      ;如AX的最高有效位是0,则DX=00

      ;AX的最高有效位为1,则DX=FFFFH。AX不变

9.乘法指令(MUL/IMUL)

MUL r8/m8  ;无符号字节乘法

            ;AX←AL×r8/m8

MUL r16/m16  ;无符号字乘法

             ;DX.AX←AX×r16/m16 高字节放入DX,低字节放入AX

IMUL r8/m8  ;有符号字节乘法

            ;AX←AL×r8/m8

IMUL r16/m16 ;有符号字乘法

             ;DX.AX←AX×r16/m16

 

乘法指令如下影响OF和CF标志:

MUL指令——若乘积的高一半(AH或DX)为0,则OF=CF=0;否则OF=CF=1

IMUL指令——若乘积的高一半是低一半的符号扩展,则OF=CF=0;否则均为1

乘法指令对其他状态标志没有定义

对标志没有定义:指令执行后这些标志是任意的、不可预测的

对标志没有影响:指令执行不改变标志状态

 

mov al,0b4h   ;al=b4h=180

mov bl,11h    ;bl=11h=17

mul bl        ;ax=al*bl=Obf4h=3060

       ;ax高8位不为0,所以OF=CF=1

     

mov al,0b4h   ;al=b4h=-76

mov bl,11h    ;bl=11h=17

imul bl      ;ax=faf4h=-1292

      ; AX高8位含有效数字,所以OF=CF=1

10.除法指令(DIV/IDIV)

DIV r8/m8   ;无符号字节除法

            ;AL←AX÷r8/m8的商,Ah←AX÷r8/m8的余数

DIV r16/m16   ;无符号字除法

      ;AX←DX.AX÷r16/m16的商,DX←DX.AX÷r16/m16的余数

     

IDIV r8/m8   ;有符号字节除法:

      ;AL←AX÷r8/m8的商,Ah←AX÷r8/m8的余数

IDIV r16/m16  ;有符号字除法:

      ;AX←DX.AX÷r16/m16的商,DX←DX.AX÷r16/m16的余数

注意:商和余数分开

mov ax,0400h  ;ax=400h=1024

mov bl,b4h    ;bl=b4h=180

div bl     ;商al=05h=5

       ;余数ah=7ch=124

 

mov ax,0400h  ;ax=400h=1024

mov bl,b4h     ;bl=b4h=-76

idiv bl        ;商al=f3h=-13

       ;余数ah=24h=36

11.零扩展(MOVZE):

无符号整数,进行零位扩展(前面加0实现位数扩展)

MOVZX  r16,r8/m8 movzx  di,bvar

MOVZX  r32,r8/m8/r16/m16        movzx  eax,ax

mov  al,82h      ;AL=82H

movzx  bx,al     ;AL=82H,BX=0082H

movzx  ebx,al    ;AL=82H,EBX=00000082H

注:位数加长,大小不变

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啊hii

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值