8086指令(II)
算術運算指令
①加法類指令
②減法類指令
③乘法指令
④除法指令
⑤BCD嗎指令
一、加法類指令
首先我么們先看加法類指令三個(add,adc,inc)
1)不帶進位位的加法指令ADD
add用來執行2個字節或2個字的相加操作,運算時不考慮CF位
ADD DST,SRC?? ;DST<--(DST)+(SRC)
ADD影響OF,SF,ZF,AF,PF,CF標志
2)帶進位位的加法指令ADC
ADC在功能上和ADD類似,只是有一點區別,即執行ADC指令時,將進位標志CF的值加進和中。
ADC DST,SRC???????? ;DST<--(DST)+(SRC)+CF
ADC指令多用于多字節相加運算,如進行兩個8字節(64位)數據相加,應先用ADD指令將低32位相加,再用ADC指令將高32位相加,此時會把低位字節產生的進位傳遞到高位字節運算中。
ADC影響OF,SF,ZF,AF,PF,CF.標志位
3)增量指令INC
INC指令只有一個操作數,指令執行時,將操作數內容加1,
INC指令影響AF,OF,PF,SF,ZF.
注意:INC指令不影響進位標志CF
二、減法類指令(SUB,SBB,CMP,DEC,NEG)
1)比考慮借位的減法指令SUB
SUB和上面的加法類似,也是不帶借位的減
SUB [BP+2],CL?????????????? ;將ss段中的BP+2所指的單元中的值減去CL中的值,結果在BP+2所指堆棧單元中
SUB影響的標志位OF,ZF,AF,SF,PF,CF
2)考慮借位的減法指令SBB
和上面的ADC類似,就是SBB在執行減法運算時還要減去CF的值。
SBB AX,2530H?????? ;將AX中的內容減去2530H,并減去進位位CF的值
和上面類似,這里不在重復
3)減量指令DEC
這又和上面的INC類似,就是將操作數減一,同樣不會影響CF,只是執行減一而已。
和上面都一樣,這里不在重復。
4)求補指令NEC
其實我更喜歡叫它求負指令,它就是對給出的操作數求一個負,然后回送,可是機器內部是以補碼的形式存儲的,所以就是求補指令啦。
NEG影響的標志位AF,CF,ZF,PF,SF,OF'
注意:①如果操作數的值為80H、8000H、80000000H,那么執行求補指令會溢出,結果沒有變化,但溢出標志OF置1
②此指令執行時,通常使CF為1,只有當操作數為0時,CF才為0,因為此指令是用0減去某個操作數,所以除非為0,通常都會產生借位。
5)比較指令CMP
cmp也是執行兩個數相減操作,但不送回相減結果,會影響標志位
此指令會影響標志位AF,CF,OF,PF,SF,ZF
那么如果判斷比較結果呢?
答:如果比較的兩個操作數相等的話,ZF = 1,根據ZF就可判斷兩數是否相等
①兩個無符號比較
無符號相減時CF,就是借位標志,如果CF為0,表示無借位,則被減數大,若果,CF為1,則表示有借位,則減數大
②兩個有符號數比較
看符號標志SF,而符號標志SF總是和結果的最高位相同,如果SF為0,表示被減數大,如果SF為1,則表示減數大
一、乘法指令
乘法指令就兩個MUL,IMUL
①無符號乘法指令MUL
無符號字節乘法:AX <-- (AL) * (SRC)
無符號字乘法:? DX.AX <-- (AX) * (SRC)
例如:
MUL CX??????? ;ax 和 cx 中連個16位相乘,結果在dx 和 ax中,dx放高位,ax放低位
對標志位的影響:若乘積的高一半(AH/DX)為0,則OF = CF = 0,否則 OF=CF=1;
②有符號的乘法指令IMUL
有符號字節乘法:AX <-- (AL) * (SRC)
有符號字乘法 : DX.AX <-- (AX) * (SRC)
例如:
IMUL CL ???????? ;AL中與CL中的兩個8位有符號數相乘,結果在AX中
對標志位的影響:若乘積的高一半是低一半的符號擴展,則OF=CF=0;否則均為1.
乘法指令對其它標志位沒有定義,不知到到底什么值。
二、除法指令DIV,IDIV
①無符號除法DIV
無符號字節除法(AX)/(SRC) ?? AL←商,AH←余數
無符號字除法(DX.AX)/(SRC) ?? AX←商,DX←余數
例如:
DIV CL??????? ;AX中的數據除以CL中的數據,商在AL中,余數在AH中
②有符號除法IDIV
有符號字節除法(AX)/(SRC)?????????? AL←商,AH←余數
有符號字除法(DX.AX)/(SRC)???????? AX←商,DX←余數
說明:除法運算時,要求被除數的數位是除數的2倍,否則就必須將被除數進行擴展
除法運算對AF,CF,OF,PF,SF,ZF都是不確定的。
三、類型轉換指令CBW/CWD
C:convert(轉換)? B:byte(字節)?? W:word(字)????? D:double(雙字)???? 自己理解的哈!如果不對,謝謝指出
功能:就是符號擴展,將字節擴展為字,將字擴展為雙字,以適應除法運算的要求
四、BCD碼指令
實際應該叫BCD嗎調整指令,它其實就是對數據的一種調整。
可用四位2進制碼表示1個十進制碼,這個就叫做BCD碼。
BCD碼有兩類:1.組合的BCD碼(一個字節表示2位BCD碼,就是通常的8421碼),2.非組合BCD碼(1個字節只用低4位來表示BCD碼,高四位為0)。
①組合BCD加法調整指令DAA
比如:8+7 = 15
?? 0000 1000
+ 0000 0111
——————
??? 0000 1111
顯然不對,所以進行調整 ,+6,(即加上110)
9+9 = 18
?? 0000 1001
+ 0000 1001
——————
?? 0001 0010
不對,低四位向高四位進位時,內部機器是逢16進1,而BCD碼要求是逢十進一,就必須調整加上011,這是輔助進位標志AF就有用了,它如果為1,就表示有進位,這是加011,就可以調整過來了
調整:4位二進制碼對應的BCD碼大于9時,則加6調整,低四位往高四位進位時,加6調整
②組合BCD碼減法指令DAS
總結
以上是生活随笔為你收集整理的8086指令(II)的全部內容,希望文章能夠幫你解決所遇到的問題。