汇编语言 加减法和进位标志位
Posted ʚVVcatɞ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编语言 加减法和进位标志位相关的知识,希望对你有一定的参考价值。
加法和进位标志位
两个无符号整数相加时,进位标志位是目的操作数最高有效位进位的副本。如果和数超过了目的操作数的存储大小,就可以认为CF=1。
mov al, 0FFH
add al , 1 ; AL = 00 , CF = 1
在上面的加法运算中,AL最高有效位的进位复制到进位标志位。
如果AX的值为00FFH,则对其进位加1操作后,和数不会超过16位,那么进位标志位清0.
mov ax, 00FFH
add ax, 1 ; AX = 0100H, CF = 0
但是,如果AX的值为FFFFH,则对其进行加1操作后,AX的高位就会产生进位
mov ax, 0FFFFH
add ax, 1 ; AX = 0000, CF = 1
减法和进位标志位
从较小的无符号整数中减去较大的无符号整数时,减法操作就会将进位标志位置1.
mov al, 1
sub al, 2 ; AL = FFH , CF = 1
注:
- INC和DEC指令不会影响进位标志位。在非零操作数上应用NEG指令总是会将进位标志位置1。
- 移动指令 mov、push、pop这些指令不会影响标志位。
零标志位
当算术运算结果等于0时,零标志位置1。
例1:
mov cx, 1
sub cx, 1 ; ECX = 0, ZF = 1
mov ax, 0FFFFFFFFH
inc ax ; ECX = 0, ZF = 1
inc ax ; ECX = 1, ZF = 0
dec ax ; ECX = 0, ZF = 1
例2:
mov ax, 100
and ax, 0
mov ax, 4C00H
int 21
注:mul 和 div 运算不影响零标志位。
奇偶标志位
目的操作数最低有效字节中1的个数为偶数时,奇偶(PF)标志位置1。
mov al, 10001100B
add al, 00000010B ; AL = 10001110, PF = 1
sub al, 10000000B ; AL = 00001110, PF = 0
执行了ADD指令后,AL的值为1000 1110(4个0, 4个1),PF = 1。执行了SUB指令后,AL的值包含了奇数个1,因此奇偶标志位等于0。
符号标志位
有符号数算术操作结果为负数,则符号标志位置1。
mov ax, 4
sub ax, 5 ; EAX = -1 , SF =1
从机器的角度来看,符号标志位是目的操作数高位的副本。
mov bl ,1 ; BL = 01H
sub bl ,2 ; BL = FFH(-1), SF = 1
注:SF把计算的结果看作是正数或负数。
例如:
下面每条指令执行后,ZF PF SF标志位的值
assume cs:code
code segment
start:
; ZF PF SF
mov ax, 0
sub al, al ;1 1 0 al = 0000 0000B
mov al, 1 ;1 1 0 al = 0000 0001B
push ax ;1 1 0
pop bx ;1 1 0 bl = 0000 0001B
add al, bl ;0 0 0 al = 0000 0010B
add al, 10 ;0 1 0 al = 0000 1100B
mul al ;0 1 0 AX = 0000 0000 1001 0000B
; mul 不影响 SF 标志位
mov ax, 4C00H
int 21
code ends
end start
溢出标志位
有符号数算术操作结果与目的操作数相比,如果发生上溢或下溢,则溢出标志位置1.
mov al, +127
add al, 1 ; 0F = 1
同样,最小的负数为-128,再减1就发生下溢。如果目的操作数不能容纳一个有效算术运算结果,那么溢出标志位置1。
mov al, -128
sub al, 1 ; OF = 1
assume cs:code, ds:data, ss:stack
data segment
db 256 dup(0)
data ends
stack segment stack
db 128 dup(0)
stack ends
code segment
start: mov ax, stack
mov ss, ax
mov sp, 128
mov al, 80H ; - 128 - 1 = -129
sub al, 1
mov ax, 4C00H
int 21H
code ends
end start
assume cs:code, ds:data, ss:stack
data segment
db 256 dup(0)
data ends
stack segment stack
db 128 dup(0)
stack ends
code segment
start: mov ax, stack
mov ss, ax
mov sp, 128
mov al, 99
add al, 98
mov ax, 4C00H
int 21H
code ends
end start
注:
- AL字节型数据表示的范围:-128~127
- AX字型数据表示的范围:-32768~32767
- 超过以上范围就会溢出,溢出标志位置1。
以上是关于汇编语言 加减法和进位标志位的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向x86 汇编 ( cmp 比较指令 | test 比较指令 )