8086指令系統---算術(shù)指令(一)
ADD 加法 SUB 減法
ADC 帶進(jìn)位加 DEC 減1
INC 加1 NEG 求補
CMP 比較
?、?乘法指令 ?、?除法指令
MUL 無(wú)符號數乘法 DIV 無(wú)符號數除法
IMUL 帶符號數乘法 IDIV 帶符號數除法
?、?符號擴展指令 ?、?十進(jìn)制調整指令
CBW 字節轉換為字 DAA 加法的十進(jìn)制調整
CWD 字轉換為雙字 DAS 減法的十進(jìn)制調整
AAA 加法的ASCII調整
AAS 減法的ASCII調整
AAM 乘法的ASCII調整
AAD 除法的ASCII調整
ADD dst,src加法指令(addition)
執行操作: (dst) ← (src)+(dst)
ADC dst,src帶進(jìn)位加指令(add with carry)
執行操作: (dst) ← (src)+(dst)+CF
INC opr加1指令(increment)
執行操作: (opr) ← (opr)+1
ADD和ADC指令是雙操作數指令,它們的兩個(gè)操作數不能同時(shí)為存儲器尋址方式,也就是說(shuō),除源操作數為立即數的情況外,源和目的操作數必須有一個(gè)是寄存器尋址方式。INC指令是單操作數指令,它可以使用除立即數方式外的任何尋址方式。
ADD和ADC指令影響條件標志位(也稱(chēng)條件碼),INC指令影響除CF外的其它條件碼。條件碼中最主要的是SF、ZF、CF和OF,加法運算對這四個(gè)條件碼的設置方法如下:
SF=1 加法結果為負數(符號位為1)
SF=0 加法結果為正數(符號位為0)
ZF=1 加法結果為零
ZF=0 加法結果不為零
CF=1 最高有效位向高位有進(jìn)位
CF=0 最高有效位向高位無(wú)進(jìn)位
OF=1 兩個(gè)同符號數相加(正數+正數,或負數加負數),結果符號與其相反
OF=0 不同符號數相加時(shí),或同符號數相加,結果符號與其相同
計算機在執行運算時(shí),并不區別操作數是帶符號數還是無(wú)符號數,一律按上述規則設置條件碼,因此,程序員要清楚當時(shí)處理的是什么類(lèi)型的數據。例如,當加法運算結果的最高有效位為1時(shí),機器將SF置1。如果參加運算的是兩個(gè)帶符號數,那么和的最高有效位是符號位,SF置1說(shuō)明結果是一個(gè)負數。如果參加運算的是兩個(gè)無(wú)符號數,那么和的最高有效位也是數值位,此時(shí)SF置0或置1都失去了表示正負數的意義。
對帶符號數和無(wú)符號數,它們表示結果溢出的條件標志位也是不同的。上述OF位的設置條件顯然只符合帶符號數的溢出情況,OF=1表示運算結果是錯誤的。而無(wú)符號數溢出(運算結果超出了有限位的表示范圍)時(shí),表現為最高有效位產(chǎn)生進(jìn)位,因此,CF=1是無(wú)符號數溢出的標志。另外,在雙字長(cháng)數運算時(shí),低位字相加設置的CF,說(shuō)明低位字向高位字有無(wú)進(jìn)位的情況。
例MOV BX,9B8CH ; (BX)=9B8CH
ADD BX,6478H ; now (BX)=0000H
9B8A 1001 1011 1000 1010
+ 6476 + 0110 0100 0111 0110
----------- --------------------------
1← 0000 1← 0000 0000 0000 0000
條件碼設置: SF=0 最高有效位(D15)為0
ZF=1 結果為0
CF=1 最高有效位向高位有進(jìn)位
OF=0 不同符號數相加,不產(chǎn)生溢出
例編寫(xiě)執行雙精度數(DX,CX)和(BX,AX)相加的指令序列,DX是目的操作數的高位字,BX是源操作數的高位字。指令執行前:
?。―X,CX)= A248 2AC0H,(BX,AX)= 088A E25BH。
指令序列: ADD CX, AX ;(CX)= 0D1BH
ADC DX, BX ; now,(DX)=0AAD3H
執行ADD指令:
2AC0 0010 1010 1100 0000
+ E25B + 1110 0010 0101 1011
--------- ------------------------
1← 0D1B 1← 0000 1101 0001 1011
條件碼設置: SF=0 最高有效位(D15)為0,無(wú)符號位意義
F=0 結果不為0
CF=1 最高有效位向高位有進(jìn)位
OF=0 加數最高位分別為0、1,溢出位置0,OF對低位字無(wú)溢出意義
執行ADC指令:
A248 1010 0010 0100 1000
088A 0000 1000 1000 1011
+ 1 + 1←CF
---------- ----------------------------
AAD3 1010 1010 1101 0011
條件碼設置: SF=1 最高有效位(D31)為1,對帶符號數運算表示結果為負
ZF=0 結果不為0
CF=0 最高有效位向高位無(wú)進(jìn)位
OF=0 結果符號與操作數相同,未產(chǎn)生溢出
2 減法指令
SUB dst,src減法指令(subtract)
執行操作: (dst) ← (dst)-(src)
SBB dst,src帶借位減法指令(subtract with borrow)
執行操作: (dst) ← (dst)-(src)-CF
DEC opr減1指令(decrement)
執行操作: (opr) ← (opr)-1
CMP opr1,opr2比較指令(compare)
執行操作: (opr1)-(opr2),根據相減結果設置條件碼,但不回送結果
以上指令除DEC指令不影響CF外,其他都影響條件碼。與加法類(lèi)似,SF和ZF分別表示減法結果的符號以及為零的情況;CF表明無(wú)符號數相減結果溢出與否;OF表明帶符號數相減結果溢出與否。但在對CF和OF位的設置方法上減法和加法有所不同,下面對此做進(jìn)一步說(shuō)明:
CF=1 二進(jìn)制減法運算中最高有效位向高位有借位(被減數<減數,不夠減的情況)
CF=0 二進(jìn)制減法運算中最高有效位向高位無(wú)借位(被減數≥減數,夠減的情況)
OF=1 兩數符號相反(正數-負數,或負數-正數),而結果符號與減數相同
OF=0 同符號數相減時(shí),或不同符號數相減,其結果符號與減數不同
NEG opr求補指令(negate)
執行操作: (opr) ← -(opr),
求補操作即把操作數變?yōu)榕c其符號相反的數:。
機器在執行求補指令時(shí),把操作數各位求反后末位加1,因此執行的操作也可表示為:
(opr) ← 0FFFFH-(opr)+1
NEG指令的條件碼設置方法為:
CF=1 不為0的操作數求補時(shí)
CF=0 為0的操作數求補時(shí)
OF=1 當求補運算的操作數為-128(字節)或-32768(字)時(shí)
OF=0 當求補運算的操作數不為-128(字節)或-32768(字)時(shí)
相關(guān)推薦
技術(shù)專(zhuān)區
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線(xiàn)
- 開(kāi)關(guān)電源
- 單片機
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開(kāi)發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機控制
- 藍牙
- PLC
- PWM
- 汽車(chē)電子
- 轉換器
- 電源管理
- 信號放大器
評論