<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 匯編入門學(xué)習(xí)筆記 (十)—— 標(biāo)志寄存器、串傳送指令

          匯編入門學(xué)習(xí)筆記 (十)—— 標(biāo)志寄存器、串傳送指令

          作者: 時(shí)間:2016-11-09 來源:網(wǎng)絡(luò) 收藏
          瘋狂的暑假學(xué)習(xí)之 匯編入門學(xué)習(xí)筆記 (十)—— 標(biāo)志寄存器

          本文引用地址:http://www.ex-cimer.com/article/201611/317784.htm

          參考: 《匯編語言》 王爽 第11章

          CPU內(nèi)部有一種特殊的寄存器叫標(biāo)志寄存器(flag),它與ax,bx,cx等其他寄存器不同,它不是用來存放數(shù)據(jù)的,而是用來存放狀態(tài)的。flag寄存器是按位器作用的,即只有0和1。

          flag寄存器的結(jié)構(gòu):

          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中標(biāo)志位的表示:

          標(biāo)志 1 0

          of OV NV

          sf NG PL

          zf ZR NZ

          pf PE PO

          cf CY NC

          df DN UP

          1. ZF標(biāo)志

          零標(biāo)志位。如果上條相關(guān)指令結(jié)果為0,那門ZF=1,不為0那門ZF=0

          例子:

          1. movax,1
          2. subax,1

          1. movax,1
          2. andax,0

          執(zhí)行后zf為1

          add,sub,mul,div,inc,or,and等這些運(yùn)算指令會(huì)影響標(biāo)志寄存器

          mov,push,pop等轉(zhuǎn)移指令對標(biāo)志寄存器沒有影響

          2. PF 標(biāo)志

          奇偶標(biāo)志位。是0是1的規(guī)則 ,類似于奇校驗(yàn)。

          如果上條相關(guān)指令結(jié)果二進(jìn)制中1的個(gè)數(shù)為偶數(shù),則PF=1,為奇數(shù)則PF=0 。

          例子:

          1. moval,1
          2. addal,10

          al = 00001011b

          pf = 0

          1. moval,1
          2. oral,2

          al = 00000011b

          pf = 1


          3. SF標(biāo)志

          符號(hào)標(biāo)志位。

          如果上條相關(guān)指令結(jié)果為負(fù)數(shù),則SF=1,正數(shù)則SF=0

          本質(zhì)就是看第一位是否為1

          1. moval,10000001b
          2. addal,1

          SF = 1

          4. CF標(biāo)志

          表示無符號(hào)計(jì)算中的進(jìn)位(注意:inc和dec指令是不影響CF的,但會(huì)影響ZF與OF)

          例子:

          1. moval,98H
          2. addal,al

          CF = 1

          相減為負(fù)數(shù),也會(huì)使得CF = 1

          1. movax,1
          2. subax,2

          5. OF標(biāo)志

          表示有符號(hào)計(jì)算的溢出(注意:inc和dec指令是會(huì)影響OF的)

          例如8位補(bǔ)碼 表示的數(shù)的范圍 -128~127

          例子:

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

          -16+(-120) = -136

          超過了范圍,所以O(shè)F = 1

          6. abc 指令

          帶進(jìn)位的加法指令

          abc ax,bx

          相當(dāng)于(ax)=(ax)+(bx)+CF

          例子:實(shí)現(xiàn)兩個(gè)128位數(shù)據(jù)相加

          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設(shè)置為0
          18. s:movax,[si]
          19. adcax,[di]
          20. mov[si],ax
          21. incsi;不用add是因?yàn)閍dd會(huì)改變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 相當(dāng)于(ax)=(ax)-(bx)-CF

          8. cmp指令

          cmp是比較指令,相當(dāng)于減法,但不保存結(jié)果只改變flag

          cmp ax,bx

          對于無符號(hào)數(shù)來說

          如果(ax)=(bx) 則(ax)-(bx)=0, 所以:zf = 1;

          如果(ax)!=(bx) 則(ax)-(bx)!=0,所以:zf = 0;

          如果(ax)< (bx) 則(ax)-(bx)會(huì)產(chǎn)生錯(cuò)位,所以:cf = 1;

          如果(ax)>(bx) 則(ax)-(bx)不會(huì)產(chǎn)生錯(cuò)位,結(jié)果也不可能為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)

          對于有符號(hào)數(shù)來說

          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. 檢測比較結(jié)果的條件轉(zhuǎn)移指令

          對于無符號(hào)數(shù):

          je 等于則轉(zhuǎn)移 zf=1

          jne 不等于則轉(zhuǎn)移 zf=0

          jb 低于則轉(zhuǎn)移 cf=1

          jnb 不低于則轉(zhuǎn)移 cf=0

          ja 高于則轉(zhuǎn)移 cf=0且cf = 0

          jna 不高于則轉(zhuǎn)移 cf=1或zf=1

          各個(gè)字母的意思:

          j:jmp

          e:equal

          ne:not equal

          b:below

          nb:not below

          a:above

          na:not above

          例如實(shí)現(xiàn):如果(ah)=(bh)則(ah)=(ah)+(ah),否則(ah)=(ah)+(bh)

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

          例子:計(jì)算data段中為8的數(shù)的個(gè)數(shù),記錄在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 標(biāo)志位和串傳送指令

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

          df=1 每次操作后si、di遞減;

          movsb

          功能:將ds:si 指向的內(nèi)存單元中的字節(jié)送入es:di中,然后根據(jù)標(biāo)志寄存器df位的值,將si和di遞增或遞減1

          相當(dāng)于:

          (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相同,只是是傳送一個(gè)字,然后就是si和di是遞增或遞減2

          指令cld,std

          cld:將df設(shè)置為0

          std:將df設(shè)置為1

          rep指令

          功能:根據(jù)cx的值重復(fù)執(zhí)行,后面的串指令。

          格式:rep movsb

          例子:復(fù)制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的功能是將標(biāo)志寄存器的值壓棧,而popf是從棧中彈出數(shù)據(jù),送入標(biāo)志寄存器中



          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();