本文共 2587 字,大约阅读时间需要 8 分钟。
减法运算主要包括SUB,SBB,DEC,NEG和CMP指令,除DEC不影响CF标志外,其他照定义影响全部状态标志位。
减法指令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带借位减法指令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指令)。减量指令 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求补指令 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比较指关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/