neg al ; AL = +1
neg valW ; valW = -32767
5.标志位的影响
?The MOV instruction never affects the flags. ?加法减法影响的几个标志位:
Zero flag – set when destination equals zero (零标志) ?A flag is set when it equals 1. ?A flag is clear when it equals 0. 例子: 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
Sign flag – set when destination is negative (符号标志) The sign flag is a copy of the destination's highest bit: 例子:
sub al,1 ; AL = 11111111b, SF = 1 add al,2 ; AL = 00000001b, SF = 0
Carry flag – set when unsigned value is out of range (进位标志)
用于表示无符号整数运算是否发生溢出。 例子:
mov al,0FFh
add al,1 ; CF = 1, AL = 00 ; Try to go below zero: mov al,0
sub al,1 ; CF = 1, AL = FF
Overflow flag – set when signed value is out of range (溢出标志)
用于表示有符号数运算是否发生了溢出 例子:
mov al,7Fh
add al,1 ; OF = 1, AL = 80h
**判断溢出标志的几个重要结论:
9
*1.符号相同的两个数相加后,和的符号和原数符号相反,则一定发生了溢出。
*2.异号的俩数相减,结果的符号和减数相同,则一定发生了溢出。
(正-负=负 or 负-正=正 一定发生了溢出) 3.两个加数的符号不同的时候,永远不会发生溢出。
练习:
1.show the values of the destination operand and the Sign, Zero, and Carry flags
mov ax,00FFh
add ax,1 ; AX= 0100h SF= 0 ZF=0 CF=0 sub ax,1 ; AX= 00FFh SF= 0 ZF=0 CF=0 add al,1 ; AL= 00h SF= 0 ZF=1 CF=1 mov bh,6Ch
add bh,95h ; BH= 01h SF= 0 ZF= 0 CF=1 mov al,2
sub al,3 ; AL= FFh SF= 0 ZF= 0 CF=1 2.
mov al,80h add al,92h ; OF =1
mov al,-2
add al,+127 ; OF =0 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= 1 4. mov al,-128 neg al ; CF = 1 OF = 1
mov ax,8000h
add ax,2 ; CF =0 OF =0
mov ax,0
10
sub ax,2 ; CF =1 OF =0
mov al,-5
sub al,+125 ; OF =1
14. 数据相关的操作符和伪指令
1.OFFSET操作符:返回数据标号的偏移地址
用例: .data
bVal BYTE ? wVal WORD ? dVal DWORD ? dVal2 DWORD ?
.code
mov esi,OFFSET bVal ; ESI = 00404000 mov esi,OFFSET wVal ; ESI = 00404001 mov esi,OFFSET dVal ; ESI = 00404003 mov esi,OFFSET dVal2 ; ESI = 00404007
2.PTR量声明时
操作符:可以重载操作数声明的默认尺寸,在试图以不同于变
所使用的尺寸属性来访问变量时非常有用。
*PTR必须和汇编器的标准数据类型联合使用:BYTE, SBYTE, WORD,
SWORD, DWORD, SDWORD, FWORD, QWORD,TBYTE
练习:写出目的操作数的值 .data
varB BYTE 65h,31h,02h,05h varW WORD 6543h,1202h varD DWORD 12345678h
.code
mov ax,WORD PTR [varB+2] ; a.0502h mov bl,BYTE PTR varD ; b.78h mov bl,BYTE PTR [varW+2] ; c.02h
11
mov ax,WORD PTR [varD+2] ; d.1234h mov eax,DWORD PTR varW ; e.12026543h
3.TYPE操作符:返回按字节计算的变量的单个元素的大小。
.data
var1 BYTE ? var2 WORD ? var3 DWORD ? var4 QWORD ?
对应的每个TYPE表达式的值
表达式 TYPE var1 TYPE var2 TYPE var3 TYPE var4 值 1 2 3 4
4、 LENGTHOF操作符:计算数组中元素的数目
.data ;LENGTHOF表达式的返回值 byte1 BYTE 10,20,30 ; 3 array1 WORD 30 DUP(?),0,0 ; 30+2 array2 WORD 5 DUP(3 DUP(?)) ; 5*3 array3 DWORD 1,2,3,4 ; 4 digitStr BYTE \ ; 9
*注意:数组的定义中使用嵌套DUP定义时,LENGTHOF将返回两个计数器的乘积
5、 SIZEOF操作符:返回值等于LENGTHOF和TYPE返回值的乘积 例子
.data SIZEOF byte1 BYTE 10,20,30 ; 3 array1 WORD 30 DUP(?),0,0 ; 64 array2 WORD 5 DUP(3 DUP(?)) ; 30 array3 DWORD 1,2,3,4 ; 16
12
相关推荐: