《汇编语言》– 标志寄存器 和 内中断,int指令

标志寄存器

①:标志寄存器(flag)和其他寄存器不一样,其他寄存器是用来存放数据的,都是整个寄存器具有一个含义。而flag寄存器是按位起作用的,也就是说,它的每一位都有专门的意义,记录特定的信息。

image

 

②:ZF标志,它记录相关指令执行后,其结果是否为0,如果结果为0,那么zf=1;如果结果不为0,那么zf=0.

       PF标志,它记录相关指令执行后,其结果的所有bit位中1的个数是否为偶数。如果1的个数为偶数,pf=1,如果为奇数,那么pf=0.

       SF标志,它记录相关指令执行后,其结果是否为负。如果结果为负,sf=1;如果非负,sf=0。

       CF标志,一般情况下,在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的进位制,或从更高位的借位值。

       OF标志,一般情况下,OF记录了有符号数运算的结果是否发生了溢出,如果发生溢出,of=1;如果没有,of=0。

 

③:adc是带位加法指令,它利用了CF位上记录的进位值。

adc ax,bx                         (ax) = (ax)+(bx)+CF

add ax,bx                        add al,bl                   adc ah,bh

 

sbb是带借位减法指令,它利用了CF位上记录的借位值。

sbb ax,bx                         (ax) = (ax)-(bx)-CF

 

cmp 是比较指令,cmp的功能相当于减法指令。

cmp ax,ax     做(ax)-(ax)的运算,结果为0,但并不在ax中保存,仅影响flag的相关各位。指令执行后:zf=1,pf=1,sf=0,cf=0,of=0.

 

cmp ah,bh:     of:有没有溢出          sf:结果正负

sf=1,of=0     (ah)<(bh)

sf=1,of=1     (ah)>(bh)

sf=0,of=1     (ah)<(bh)

sf=0,of=0     (ah)>=(bh)

 

④:DF标志位,在串处理指令中,控制每次操作后si、di的增减。

df=0,每次操作后si、di递增;

df=1,每次操作后si、di递减;

 

movsb的功能是将ds:si指向的内存单元中的字节送入es:di中,然后根据标志寄存器df位的值,将si和di递增或递减。

movsw的功能是将ds:si指向的内存单元中的字节送入es:di中,然后根据标志寄存器df位的值,将si和di递增2或递减2。

 

rep movsb 循环实现(cx)个字符的传送
s:movsb

   loop s

rep movsw 一样。

 

cld指令:将标志寄存器的df位置0

std指令:将标志寄存器的df位置1

 

⑤:pushf的功能是将标志寄存器的值压栈,而popf是从栈中弹出数据,送入标志寄存器中。

 

内中断

 

①:中断过程

1.取得中断类型码N

2.pushf

3.TF=0,IF=0

4.push CS

5.push IP

6.(IP) = (N*4), (CS)=(N*4+2)

 

int指令

 

①:int指令的格式为:int n,   n为中断类型码,它的功能是引发中断过程。

 

端口

 

①:在PC系统中,CPU最多可以定位64KB个不同的端口。0~65535

端口的读写指令:

in和out,分别用于从端口读取数据和往端口写入数据。

in al,60h

out 60h,al

对256~65535的端口进行读写时,端口在dx中:

mov dx,3f8h

in al,dx

out dx,al

 

②:shl和shr是逻辑移位指令

shl是逻辑左移指令:

1.将一个寄存器或内存单元中的数据向左移位。

2.将最后移出的一位写入CF中。

3.最低位用0补充。

shr是逻辑右移指令:

1.将一个寄存器或内存单元中的数据向右移位。

2.将最后移出的一位写入CF中。

3.最高位用0补充。

可屏蔽中断:

CPU是否响应可屏蔽中断,要看标志寄存器的IF位的设置。当CPU检测到可屏蔽信息时,如果IF=1,则CPU在执行完当前指令后响应中断,引发中断过程;如果IF=0,则不响应可屏蔽中断。

键盘产生的扫描码被送入60h端口中,引发9号中断。

本文链接:http://www.alonemonkey.com/masm-chapter10-14.html