汇编语言减法指令

文章目录

  • 减法指令
    • 1.减法指令SUB
    • 2.带借位减法指令 SBB
    • 3 减量指令DEC
    • 4.求补指令NEG
    • 5.比较指令CMP
    • [例] 大小写字母转换程序

减法指令

减法运算主要包括SUB,SBB,DEC,NEG和CMP指令,除DEC不影响CF标志外,其他照定义影响全部状态标志位。

1.减法指令SUB

减法指令SUB (Subtract) 使目的操作数减去源操作数, 差的结果送到目的操作数。 格式如下:
SUB reg,imm/reg/mem;减法:reg=reg-imm/reg/mem
SUB mem,imm/reg;减法:mem=mem-imm/reg
像 ADD 指令一样, SUB 指令支持寄存器与立即数、 寄存器、 存储单元, 以及存储单元与立即数、 寄存器间的减法运算, 按照定义影响6个状态标志位。 例如:
mov eax,Oaaff7348h;EAX=AAFF7348H
sub al,27h;EAX=AAFF7321H,OF=0,SF=0,ZF=0,PF=1,CF=0
sub ax,3fffh;EAX=AAFF3322H,OF=O,SF=0,ZF=0,PF=1,CF=0
sub eax,0bb000000h;EAX=EFFF3322H,OF=0,SF=1,ZF=0,PF=1,CF=1

2.带借位减法指令 SBB

带借位减法指令SBB (Subtract with Borrow) 除完成SUB 减法运算外, 还要减去借位CF,结果送到目的操作数, 按照定义影响6个状态标志位。格式如下:
SBB reg,imm/reg/mem;减法:reg=reg-imm/reg/mem-CF
SBB mem,imm/reg;减法:mem=mem-imm/reg-CF
SBB指令主要用于与SUB指令相结合实现高精度数的减法。 多于32位数据的减法需要先将两个操作数的低32位相减 (用SUB指令), 然后再减高位部分, 并从高位减去借位 (需要用SBB指令)。

3 减量指令DEC

减量指令 DEC (Decrement) 对操作数减1(减量) 再将结果返回原处。 格式如下:
DEC reg/mem;减l:reg/mem=reg/mem-1
DEC指令与INC指令相对应, 也主要用于对计数器和地址指针进行调整, 不影响进位 CF标志, 但影响其他状态标志位。 例如:
dec cx;字量数据减1:CX=CX-1
dec byte ptr[ebx];字节量数据减1:[EBX]=[EBX]-1

4.求补指令NEG

求补指令 NEG (Negative) 也是一个单操作数指令, 它对操作数执行求补运算, 即用零减去操作数,然后结果返回操作数。
NEG reg/mem;用o作减法:reg/mem=0-reg/mem
NEG指令对标志的影响与用零作减法的 SUB指令一样,例如:
mov ax,0ff64h
neg al;AX=FF9CH,OF-0,SF-1,ZF=0,PF-1,CF=1
sub al,9dh;AX=FFFFH,OF-O,SF=1,ZF=0,PF-1,CF=1
neg ax;AX=0001H,OF=0,SF-O,ZF=O,PF=O,CF-1
dec al :AX+0000H,OF=O,SF=O,ZF=1,PF=1,CF=1
neg ax;AX=0000H,OF=0,SF=0,ZF=1,PF=1,CF=0
求补指令 NEG 可用于对负数求补码或由负数的补码求其绝对值, 例如:
;已知100的8位编码,求-100的8位补码
mov al,64h;AL=64H =100
neg al;AL=0-64H =9CH= -100
;OF=0,SF=1,ZF=0,PF=1,CF=1
;已知-100的32位补码,求其绝对值(即100)
mov eax,Offffff9ch;EAX=FFFFFF9CH= -100
neg eax;EAX=0 -FFFFFF9CH =64H =100
;OF=O,SF=0,ZF=O,PF=0,CF=1
由于NEG指令隐含使用0作为被减数, 所以只有操作数 (减数) 是0才不借位, 即CF=0,
其他情况CF=1。同样, 只有操作数是80H (8位求补),8000H (16位求补) 或80000000H (32
位求补) 时溢出, 即标志OF=1, 否则OF=0

5.比较指令CMP

比较指关CMP(Compare)使目的操作数减去源操作数, 差值不回送到目的操作数, 但按照减法结果影响状态标悲。格式如下:
CMP reg,imm/reg/mem;减法:reg-imm/reg/mem
CMP mem,imm/reg;减法:mem-imm/reg
CMP指令通过减法运算影响状态标志, 根据标志状态可以获知两个操作数的大小关系。 它主要是为了给条件转移等指令使用其形成的状态标志。

[例] 大小写字母转换程序

;数据段
msg byte’welcome’,0;小写字母组成的字符串,最后一个0是结尾字符
;代码段
mov ecx,(lengthof msg)-1 ;ECX等于字符串长度(减1是剔除最后一个结尾字符)
mov ebx,0;EBX=0指向头一个字母
again: sub msg[ebx],‘a’-‘A’;小写字母减20H转换为大写
inc ebx;指向下一个字母
cmp ebx,ecx;比较EBX是否仍指向字符串中的字母
jbe again;是,循环,继续处理
mov eax,offset msg;不是,结束处理
call dispmsg ;显示

本示例程序将小写字母组成的字符串改为大字母, 然后显示。 小写字母和对应的大写字母相差20H(=‘a’- ‘A’ =61H-41H), 所以小写母减20H成为大写字母,反过来大写字母加20H就成为小写字母。 给定的字符串全部由小写母组成, 所以程序没有判断是否是小写字母
本例程序的减法指令用 MSG [EBX] 指向字符串中的字母, 是寄存器相对寻址的目的操效,MSG表示字符串首位置, EBX指向字符串中的字母。 执行过程中先取出小写字母减20H成为大写字母, 又保存到原来的位置。
通过CMP指令比较EBX 与ECX (保存字符串长度), 在EBX小于等于ECX时 (JBE指令的条件),说明还没有完成所有字母的处理, 需要跳转到标号 AGAIN 处继续处理; 否则结束处理。

你可能感兴趣的:(汇编语言)