博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
汇编语言减法指令
阅读量:2431 次
发布时间:2019-05-10

本文共 2587 字,大约阅读时间需要 8 分钟。

文章目录

减法指令

减法运算主要包括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 处继续处理; 否则结束处理。

转载地址:http://eitmb.baihongyu.com/

你可能感兴趣的文章
IE下的图片空隙间距BUG和解决办法
查看>>
[pb]从excel导入数据到datawindow
查看>>
CSS Padding in Outlook 2007 and 2010
查看>>
有关内存的思考题
查看>>
What is the difference between gross sales and revenue?
查看>>
Dreamweaver默认打开后缀名为ftl的文件时
查看>>
LNMP一键安装
查看>>
几个分析函数的比较
查看>>
主流算法:
查看>>
RMI
查看>>
J.U.C之Future
查看>>
缓存思想分析
查看>>
一致性hash
查看>>
J.U.C之ConcurrentHashMap分析
查看>>
J.U.C之CopyOnWriteArrayList
查看>>
J.U.C之Atomic&CAS
查看>>
类的生命周期
查看>>
Joda-Time学习
查看>>
Guava扩展工具包
查看>>
Jedis分片策略-一致性Hash
查看>>