4.2 加法和减法
1.INC 和 DEC指令
INC reg/mem ;+1
DEC reg/mem ;-1
2.add 指令
将同尺寸的操作数相加
add 目的操作数,源操作数
相加的结果保存在目的操作数,其指令格式和MOV相同。
3.SUB指令
将源操作数从目的操作数减掉,结果保存在目的操作数,指令格式同MOV
4.NEG指令
(negate)通过将数字转换为对应的二进制补码求其相反数,
NEG reg
NEG mem
5.实现算术表达式
Rval = -Xval + ( Yval - Zval)
mov eax,Xval
neg eax
mov ebx,Yval
sub ebx ,Zval
add eax,ebx
mov Rval,eax
6.算术运算影响的标志
1.零标志和符号标志
目的操作数=0,ZF = 1
mov cx,1
sub cx,1 ;cx = 0,ZF = 1
mov ax,0ffffh
inc ax ;ax = 0,ZF = 1
inc ax ;ax = 1,ZF = 0
算术结果为负,符号标志位被设置
mov cx,0
sub cx,1 ;cx = -1,SF = 1
add cx,2 ;cx = 1,SF = 0
2.进位标志位
只有无符号算术运算时,这个标志位才有意义。
如果无符号加法运算的结果对目的操作数太大而无法容纳时,进位标志将被设置。
mov al,0ffh
add al,1 ;cf =1,al = 00
如果将一个较大的无符号数整数从一个较小的无符号整数中减掉,进位标志也会被设置。
mov al,1
sub al,2 ;CF=1,AL=FF?
INC,DEC 不影响进位标志
3.溢出标志
针对有符号算术运算的时候,溢出标志才是有效的。
当算术运算产生的有符号的结果无法容纳于目的操作数中时,溢出标志就被设置。
mov al,+127
add al,1 ; OF =1
mov al,-128
sub al,1 ; OF=1
正+正= 负
负+负= 整
说明溢出
NEG 指令: mov al,-128
neg al
al 装不下 +128,所以 OF = 1
7.例子程序
TITLE eflags test {addsub.asm) ;TITLE 是个伪指令,相当于注释
; Description: test eflags value
; Author: ukyohy
; Create Date: 2009-10-15
; Version:1.0
; Data: Modify by:
include Irvine32.inc
.data
Rval sdword ?
Xval sdword 26
Yval sdword 30
Zval sdword 40
.code ;.code 伪指令标示代码段的开始,所有的可执行语句都放在此
main PROC ; PROC 伪指令标示子程序的开始,子程序的名字是main
;inc and dec
mov ax,1000h
inc ax
dec ax
;expression: Rval = -Xval + (Yval - Zval)
mov eax,Xval
neg eax
mov ebx,Yval
sub ebx,Zval
add eax,ebx
mov Rval,eax
;zero flag
mov cx,1
sub cx,1 ;ZF=1
mov ax,0FFFFh ;
inc ax
;sign flag
mov cx,0
sub cx,1 ;SF = 1
mov ax,7FFFh
add ax,2 ;SF = 1
;Carry flag
mov al,0FFh
add al,1 ; CF = 1
;overflow flag
mov al,+127 ;
add al,1 ;OF = 1
mov al,-128
sub al,1 ;OF = 1,SF = 1
exit
main ENDP ;ENDP伪指令标示子程序结束
;插入其他程序
END main ;END伪指令表明该行是程序最后一行,编译器将忽略后面的内容,main 表示该程序的入口点
各个标志位总结:
CF :进位标志,最高有效位发生进位或者借尾,该标志设置为1.
AF :辅助进位标志,bit 3发生进位或者借位,该标志设置为1
PF : 奇偶位,最低有效字节值等于1的位数总数如果是偶数,该标志设置为1
SF : 符号位,取的最高有效位的值
ZF :结果为0,设置为1
OF : CF 标志和次高位进位的异或值
01000000
01000000 ;OF = 1
01000000
11000000 ;OF = 0
11000000
11000000 ;OF = 0
10000000
10000000 ; OF = 1
------------------------------------------------------------------
下面几个问题使用以下数据
.data
val1 byte 10h
val2 word 8000h
val3 dword 0ffffh
val4 word 7fffh
1.写一条val2加1的指令
inc val2
2.写一条从val3中减掉eax的指令
sub val3,eax
3.写一条或多条指令从val2中减去val4
mov ax,val4
sub val2,ax
4.如果使用add指令对val2加1,那么进位标志和符号标志的值分别是什么?
CF = 0,SF = 1 ;SF 的值是最高有效位的结果。
5.如果使用add指令对val4加1,那么进位标志和符号标志的值分别是什么?
CF = 0,SF = 1.
OF = 1
6.在每条指令执行后,在提示出写下进位,符号,零,溢出标志
mov ax,7ff0h
add al,10h CF= 1 SF = 0 ZF= 1 OF= 0
add ah,1 CF= 0 SF = 1 ZF= 0 OF= 1
add ax,2 CF= 0 SF = 1 ZF= 0 OF= 0
7.用汇编语言实现下面的表达式:AX=(-VAL2+BX) -VAL4
mov ax,val2
neg ax
add ax,bx
sub ax,val4
8.正整数和负整数相加的时候是否有可能设置溢出标志位?
不会,整数最高有效位是0,负数时1,如果次高位进位必然导致最高位进位,如果次高位不进位,最高位也不会进位。
所以OF始终等于0.
9.负整数和负整数相加产生正整数时是否会设置溢出标志位?
会,负数最高位是1,次高位如果进位,那么结果会变成负数,所以只有次高位不进位才会产生整数。
这样OF必定等于1
10.NEG指令是否可能设置溢出标志位
可能
11.符号标志和零标志是否可能同时被设置?
不可能。
12.挑战:写两条连续的指令来同时设置进位标志和溢出标志位的值。
mov al,80h
add al,80h
