<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 8086指令系統---算術(shù)指令(二)

8086指令系統---算術(shù)指令(二)

作者: 時(shí)間:2016-11-27 來(lái)源:網(wǎng)絡(luò ) 收藏
 4 除法指令


 DIV  src無(wú)符號數除法(unsigned divide)
 IDIV src帶符號數除法(signed divide)
 字節操作: (AL) ← (AX) / src 的商
      (AH) ← (AX) / src 的余數
 字操作: (AX) ← (DX, AX) / src 的商
     (DX) ← (DX, AX) / src 的余數

本文引用地址:http://dyxdggzs.com/article/201611/322191.htm

 參加運算的除數和被除數是無(wú)符號數時(shí),使用DIV指令,其商和余數也均為無(wú)符號數。IDIV指令執行的操作與DIV相同,但操作數必須是帶符號數,商和余數也均為帶符號數,而且余數的符號與被除數的符號相同。

  這兩條除法指令的被除數必須存放在A(yíng)X或DX,AX中,源操作數src作為除數,可用除立即數以外的任一種尋址方式來(lái)取得。

  除法指令對所有條件碼均無(wú)定義,因此對除法指令產(chǎn)生的錯誤,如除數為0或商溢出等錯誤,程序員都不能用條件碼進(jìn)行判斷,而是由系統直接轉入0型中斷來(lái)處理。所謂商溢出,是指被除數高一半的絕對值大于除數的絕對值時(shí),商超出了16位的表示范圍(字操作)或8位的表示范圍(字節操作)。

  由于使用除法指令的需要,經(jīng)常要將字節數據擴展為字數據,或者將字數據擴展為雙字數據,所以我們先介紹下面的符號擴展指令,然后再對除法指令舉例。

 3.3.2.5 符號擴展指令

 CBW字節擴展為字(convert byte to word)
 
 執行操作:
?。ˋH)= 00H 當(AL)的最高有效位為0時(shí)
?。ˋH)= FFH 當(AL)的最高有效位為1時(shí)

 CWD字擴展為雙字(convert word to double word)
 
 執行操作:
?。―X)=0000H當(AX)的最高有效位為0時(shí)
?。ˋH)=FFFFH當(AX)的最高有效位為1時(shí)

 這是兩條無(wú)操作數指令,進(jìn)行符號擴展的操作數必須存放在A(yíng)L寄存器或AX寄存器中。這兩條符號擴展指令都不影響條件碼。

 注意:
 除法指令要求字操作時(shí),被除數必須為32位,除數是16位,商和余數是16位的;
 字節操作時(shí),被除數必須為16位,除數是8位,得到的商和余數是8位的。

 例假設(AX)= 0BA45H,下列指令分別執行后的結果是什么?
          CBW   ; 執行后,(AH)=00, (AL)=45H, 或 (AX)=0045H
          CWD   ; 執行后,(DX)=0FFFFH, (AX)=0BA45H

 例編寫(xiě)程序,分別實(shí)現下列數據的無(wú)符號除法和帶符號除法。
       DATA7  DW 9400H  ; numerator
       DATA8  DW 0060H  ; denominator
       QUOT   DW ?    ; quotient
       REMAIN DW ?    ; remainder
       ; unsigned divide
        MOV  AX,DATA7  ; AX holds numerator
        MOV  DX,0    ; (DX,AX)= 0000 9400H
        DIV  DATA8    ; unsigned divide
        MOV  QUOT,AX   ; quotient is in AX,(AX)=018AH
        MOV  REMAIN,DX ; remainder is in DX,(DX)=0040H
       ; signed divide
        MOV  AX,DATA7  ; (AX)=9400H
        CWD        ; (DX,AX)=0FFFF, 9400H
        IDIV DATA8   ; signed divide
        MOV  QUOT,AX  ; quotient is in AX,(AX)=0FEE0HH
        MOV  REMAIN,DX ; remainder is in DX,(DX)=0

 3.3.2.6 十進(jìn)制調整指令

  80x86微型機提供了一組十進(jìn)制調整指令,用來(lái)處理ASCII碼和BCD碼表示的數。
 
  BCD碼:
  BCD(Binary Coded Decimal)是用二進(jìn)制編碼表示的十進(jìn)制數(見(jiàn)表3.3),十進(jìn)制數采用0~9十個(gè)數字,是人們最常用的。在計算機中,同一個(gè)數可以用兩種BCD格式來(lái)表示:①壓縮的BCD碼 ②非壓縮的BCD碼

  壓縮的BCD碼:
  壓縮的BCD碼用4位二進(jìn)制數表示一個(gè)十進(jìn)制數位,整個(gè)十進(jìn)制數用一串BCD碼來(lái)表示。例如,十進(jìn)制數59表示成壓縮的BCD碼為0101 1001,十進(jìn)制數1946表示成壓縮的BCD碼為0001 1001 0100 0110。

  非壓縮的BCD碼:
  非壓縮的BCD碼用8位二進(jìn)制數表示一個(gè)十進(jìn)制數位,其中低4位是BCD碼,高4位是0。例如,十進(jìn)制數78表示成壓縮的BCD碼為0000 0111 0000 1000。

 從鍵盤(pán)輸入數據時(shí),計算機接收的是ASCII碼,要將ASCII碼表示的數轉換成BCD碼是很簡(jiǎn)單的,只要把ASCII碼的高4位清零即可。

  壓縮的BCD碼調整指令
  DAA和DAS指令完成加法和減法的調整功能。

  DAA加法的十進(jìn)制調整(decimal adjust for addition)
  執行操作:(AL)← 把AL中的和調整為壓縮的BCD格式

  DAS減法的十進(jìn)制調整(decimal adjust for subtraction)
  執行操作:(AL)← 把AL中的差調整為壓縮的BCD格式

  DAA和DAS指令的調整方法如下:
  執行加法指令(ADD、ADC)或減法指令(SUB、SBB)后,
  1.如果結果的低4位 (AL)0~3>9或AF=1,則(AL)←(AL)±06H,且AF置1;
  2.如果結果的高4位 (AL)4~7>9或CF=1,則(AL)←(AL)±60H,且CF置1。

  對上述方法,加法調整作+06H和+60H,減法調整作-06H和-60H。這兩個(gè)調整的條件,如果滿(mǎn)足其一,則±06H或±60H;如果同時(shí)滿(mǎn)足,則±06H后,再±60H。

  非壓縮的BCD碼調整指令
  AAA加法的ASCII調整(ASCII adjust for add)
  執行操作:
 ?。ˋL)← 把AL中的和調整為非壓縮的BCD格式
 ?。ˋH)←(AH)+ 調整產(chǎn)生的進(jìn)位值

  AAS減法的ASCII調整(ASCII adjust for sub)
  執行操作:
 ?。ˋL)← 把AL中的差調整為非壓縮的BCD格式
 ?。ˋH)←(AH)- 調整產(chǎn)生的借位值

  加法和減法的操作數可以直接使用ASCII碼,而不必把高位0011清為0000,AAA和AAS指令就是專(zhuān)門(mén)為ASCII碼操作數或非壓縮BCD碼操作數的加減法而設計的。

  AAA和AAS的調整方法如下:
  執行加法指令(ADD、ADC)或減法指令(SUB、SBB)后,結果存放在A(yíng)L寄存器中:
 ?。?)如果(AL)0~3= 0~9,且AF=0,則(AL)4~7= 0,AF的值送CF;
 ?。?)如果(AL)0~3=A~F,或AF=1,則(AL)←(AL)±06H,(AL)4~7= 0,(AH)←(AH)±1,AF的值送CF。
  AAA和AAS指令除影響AF和CF標志外,其余標志位均無(wú)定義。

  AAM乘法的ASCII調整(ASCII adjust for mul)
  執行操作:(AX)← 把AX中的積調整為非壓縮的BCD格式

  AAD除法的ASCII調整(ASCII adjust for div)
  執行操作:(AX)← AX中的被除數(非壓縮的BCD格式)轉化為二進(jìn)制數

  以上兩條指令是專(zhuān)為非壓縮的BCD碼的乘除法而設計的,它們將乘法和除法的結果轉換為非壓縮的BCD碼。
  
  注意:AAM和AAD都只對AX寄存器中的數進(jìn)行調整,它們只影響SF、ZF和PF標志位,其它標志位無(wú)定義。

  AAM的調整方法為:
  執行乘法指令(MUL)后,調整存放在A(yíng)L寄存器中的乘積:
  ?。ˋH)←(AL)/ 0AH的商
  ?。ˋL)←(AL)/ 0AH的余數

  AAM實(shí)際上是將兩個(gè)一位數的非壓縮BCD碼相乘后得到的乘積進(jìn)行二化十的轉換,十位數放在A(yíng)H中,個(gè)位數放在A(yíng)L中,那么AX中就是乘積的非壓縮BCD碼。


上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: 8086指令系統算術(shù)指

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>