您的位置 首页 IC

汇编入门学习笔记 (十)—— 标志寄存器、串传送指令

疯狂的暑假学习之汇编入门学习笔记(十)——标志寄存器参考:《汇编语言》王爽第11章CPU内部有一种特殊的寄存器叫标志寄存器…

张狂的暑假学习之 汇编入门学习笔记 (十)—— 标志寄存器

参阅: 《汇编语言》 王爽 第11章

CPU内部有一种特别的寄存器叫标志寄存器(flag),它与ax,bx,cx等其他寄存器不同,它不是用来寄存数据的,而是用来寄存状况的。flag寄存器是按位器效果的,即只要0和1。

flag寄存器的结构:

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

OF DF IF SF ZF AF PF CF

在debug中标志位的表明:

标志 1 0

of OV NV

sf NG PL

zf ZR NZ

pf PE PO

cf CY NC

df DN UP

1. ZF标志

零标志位。假如上条相关指令成果为0,那门ZF=1,不为0那门ZF=0

比如:

  1. movax,1
  2. subax,1
  1. movax,1
  2. andax,0

履行后zf为1

add,sub,mul,div,inc,or,and等这些运算指令会影响标志寄存器

mov,push,pop等搬运指令对标志寄存器没有影响

2. PF 标志

奇偶标志位。是0是1的规矩 ,类似于奇校验。

假如上条相关指令成果二进制中1的个数为偶数,则PF=1,为奇数则PF=0 。

比如:

  1. moval,1
  2. addal,10

al = 00001011b

pf = 0

  1. moval,1
  2. oral,2

al = 00000011b

pf = 1

3. SF标志

符号标志位。

假如上条相关指令成果为负数,则SF=1,正数则SF=0

实质便是看第一位是否为1

  1. moval,10000001b
  2. addal,1

SF = 1

4. CF标志

表明无符号核算中的进位(留意:inc和dec指令是不影响CF的,但会影响ZF与OF)

比如:

  1. moval,98H
  2. addal,al

CF = 1

相减为负数,也会使得CF = 1

  1. movax,1
  2. subax,2

5. OF标志

表明有符号核算的溢出(留意:inc和dec指令是会影响OF的)

例如8位补码 表明的数的规模 -128~127

比如:

  1. moval,0F0H
  2. addal,88H

-16+(-120) = -136

超过了规模,所以OF = 1

6. abc 指令

带进位的加法指令

abc ax,bx

相当于(ax)=(ax)+(bx)+CF

比如:完成两个128位数据相加

  1. assumecs:code,ds:data
  2. datasegment
  3. db88h,88h,88h,88h,88h,88h,88h,88h,88h,88h,88h,88h,88h,88h,88h,88h
  4. db11h,11h,11h,11h,11h,11h,11h,11h,11h,11h,11h,11h,11h,11h,11h,11h
  5. dataends
  6. codesegment
  7. start:movax,data
  8. movds,ax
  9. movsi,0
  10. movdi,16
  11. movcx,8
  12. calladd128
  13. add128:pushax
  14. pushcx
  15. pushsi
  16. pushdi
  17. subax,ax;将CF设置为0
  18. s:movax,[si]
  19. adcax,[di]
  20. mov[si],ax
  21. incsi;不必add是因为add会改动CF的值
  22. incsi
  23. incdi
  24. incdi
  25. loops
  26. popdi
  27. popsi
  28. popcx
  29. popax
  30. codeends
  31. endstart

7. sbb指令

sbb是带借位的减法指令

sbb ax,bx 相当于(ax)=(ax)-(bx)-CF

8. cmp指令

cmp是比较指令,相当于减法,但不保存成果只改动flag

cmp ax,bx

关于无符号数来说

假如(ax)=(bx) 则(ax)-(bx)=0, 所以:zf = 1;

假如(ax)!=(bx) 则(ax)-(bx)!=0,所以:zf = 0;

假如(ax)< (bx) 则(ax)-(bx)会发生错位,所以:cf = 1;

假如(ax)>(bx) 则(ax)-(bx)不会发生错位,成果也不行能为0, 所以:cf = 0 而且zf = 0;

能够这么说:

zf = 1 阐明(ax)=(bx)

zf = 0 阐明(ax)!=(bx)

cf = 1 阐明(ax)< (bx)

cf = 0 阐明 (ax)>= (bx)

cf = 0 而且zf = 0 ,阐明(ax)>(bx)

cf = 1 或许zf=1, 阐明 (ax)<=(bx)

关于有符号数来说

zf = 1 阐明(ax)=(bx)

zf = 0 阐明(ax)!=(bx)

sf=1 而且 of=0,阐明(ax)<(bx)

sf=0 而且 of=1,阐明(ax)<(bx)

sf=1 而且 of=1,阐明(ax)>(bx)

sf=0 而且 of=0,阐明(ax)>=(bx)

9. 检测比较成果的条件搬运指令

关于无符号数:

je 等于则搬运 zf=1

jne 不等于则搬运 zf=0

jb 低于则搬运 cf=1

jnb 不低于则搬运 cf=0

ja 高于则搬运 cf=0且cf = 0

jna 不高于则搬运 cf=1或zf=1

各个字母的意思:

j:jmp

e:equal

ne:not equal

b:below

nb:not below

a:above

na:not above

例如完成:假如(ah)=(bh)则(ah)=(ah)+(ah),不然(ah)=(ah)+(bh)

  1. cmpah,bh
  2. jes
  3. addah,bh
  4. ddah,ah

比如:核算data段中为8的数的个数,记录在ax中

  1. assumecs:code,ds:data
  2. datasegment
  3. db8,11,23,8,2,3,8,8
  4. dataends
  5. codesegment
  6. start:movax,data
  7. movds,ax
  8. movsi,0
  9. movax,0
  10. movcx,8
  11. s:cmpbyteptrds:[si],8
  12. jnenext
  13. incax
  14. next:incsi
  15. loops
  16. movax,4c00H
  17. int21H
  18. codeends
  19. endstart

10. DF 标志位和串传送指令

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

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

movsb

功用:将ds:si 指向的内存单元中的字节送入es:di中,然后依据标志寄存器df位的值,将si和di递加或递减1

相当于:

(1)((es)*16+(di))=((ds)*16+(si))

(2)df=0则:(si)=(si)+1

(di)=(di)+1

df=1则:(si)=(si)-1

(di)=(di)-1

movsw

功用:于movsb相同,仅仅是传送一个字,然后便是si和di是递加或递减2

指令cld,std

cld:将df设置为0

std:将df设置为1

rep指令

功用:依据cx的值重复履行,后边的串指令。

格局:rep movsb

比如:仿制data中的Welcome to masm!

  1. assumecs:code,ds:data
  2. datasegment
  3. dbWelcometomasm!
  4. db16dup(0)
  5. dataends
  6. codesegment
  7. start:movax,data
  8. movds,ax
  9. moves,ax
  10. movdi,16
  11. movsi,0
  12. movcx,16
  13. cld
  14. repmovsb
  15. movax,4c00h
  16. int21h
  17. codeends
  18. endstart

11. pushf和popf

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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/bandaoti/276846.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部