標題:

徵會組合語言的高手請解釋指令和執行結果

發問:

MOV AX,7FFFMOV BX,0001ADD AX,BX→AX=Flag→CF= OF= SF= ZF=MOV AL,81MOV AH,12ADD AL,FE→AL=Flags→CF= OF= SF= ZF=ADC AH,56→AX=Flags→CF= OF= SF= ZF=MOV AH,10MOV BH,11SUB AH,BH→AH=Flags→CF= OF= SF= ZF=INC... 顯示更多 MOV AX,7FFF MOV BX,0001 ADD AX,BX →AX= Flag→CF= OF= SF= ZF= MOV AL,81 MOV AH,12 ADD AL,FE →AL= Flags→CF= OF= SF= ZF= ADC AH,56 →AX= Flags→CF= OF= SF= ZF= MOV AH,10 MOV BH,11 SUB AH,BH →AH= Flags→CF= OF= SF= ZF= INC AH →AH= Flags→CF= OF= SF= ZF= →DEC AH AH= Flags→CF= OF= SF= ZF= 更新: 請解釋DAS和DEC的指令 更新 2: 現在我的問題就是出在我不會計算也就是所謂的紙上作業

最佳解答:

關於 CF, OF 的區別,請參考《組合語言flag register的問題》 您若聽聞同學有『X86 CPU在處理本題所列之指令時,不會考慮資料是否帶號,因此用帶號與否來解釋旗號,不但顛倒因果的,而且不符CPU設置旗號的「規律行為」』的說法 ─ Ummm...... 也沒錯,只是他的因是 CPU,果是 Human。 在下於該篇問答的解釋角度是以人為出發點解釋 CF, OF,實際上 CPU 設置 CF, OF 的方式是經數位邏輯演算(或簡化)出的,舉一 8 bit 加法運算例來說: C6 表、C7 分別表 bit6、bit7 產生進位的結果,進位為 1,否則為 0 則 OF=C6 xor C7 →您會問:這是啥意義 ? 從這結果無法得知其真正意義,因它是經邏輯計算、歸納的結果,用以跟 CPU 說:你給我這樣算 OF!是故,以這種 CPU 的觀點解釋 OF, CF 的值,您應承受不住 ......而以上只是設置 OF 的其中一種方式而已;『科技始終來自人性』,CPU 的運行,是人設計出的,因此在下的解釋以 Human 為因,CPU 為果。回歸您的提問 (務必事先參考該篇問答),簡單解釋 CF, OF: CF : 視運算元為無號數 OF : 視運算元為有號數 如運算結果超出該運算元可表示範圍,則為 1, 否則為 0;例如: AH 之無號數可表示範圍 : 0~255(0~FF),有號數可表示範圍 : -128~127(80~7F) 若 AH=127(7F),進行 AH=AH+1 運算後(128): 視 AH 為無號數,因 AH 值域為 0~255,128 仍在範圍內,故 CF = 0 視 AH 為有號數,因 AH 值域為 -128~127,128 不在範圍內,故 OF = 1SF : 運算元經運算後結果為負值,則為 SF=1, 否則為 0。 ZF : 運算元經運算後結果為零,則為 ZF=1, 否則為 0。MOV AX,7FFF MOV BX,0001 ADD AX,BX AX=7FFF + 1=8000 CF=0 (AX 仍足以表示一正確之 unsigned 值) OF=1 (AX 不足以表示一正確之 signed 值) SF=1 (AX 之 Most Significant Bit = 1) ZF=0 (AX 值非 0) MOV AL,81 MOV AH,12 ADD AL,FE AL=81 + FE=7F CF=1 (AX 不足以表示一正確之 unsigned 值) OF=1 (AX 不足以表示一正確之 signed 值) SF=0 (AX 之 Most Significant Bit = 0) ZF=0 (AX 值非 0) ADC AH,56 AH=12 + 56 + CarryFlag=69, AX=697F CF=0 (AH 仍足以表示一正確之 unsigned 值) OF=0 (AH 仍足以表示一正確之 signed 值) SF=0 (AH 之 Most Significant Bit = 0) ZF=0 (AH 值非 0) MOV AH,10 MOV BH,11 SUB AH,BH AH=10 - 11=FF CF=1 (AH 不足以表示一正確之 unsigned 值) OF=0 (AH 仍足以表示一正確之 signed 值) SF=1 (AH 之 Most Significant Bit = 1) ZF=0 (AH 值非 0) INC AH AH=FF + 1=0 CF=1 (AH 不足以表示一正確之 unsigned 值) OF=0 (AH 仍足以表示一正確之 signed 值) SF=0 (AH 之 Most Significant Bit = 0) ZF=1 (AH 值為 0) DEC AH AH=0 - 1 = FF CF=1 (AH 不足以表示一正確之 unsigned 值) OF=0 (AH 仍足以表示一正確之 signed 值) SF=1 (AH 之 Most Significant Bit = 1) ZF=0 (AH 值非 0)DAS (Decimal Adjust AL after Subtraction) 將 AL 的減法運算結果調整為 Packed BCD 之減法運算結果 例如: mov AL,32 ;32 為 16 進位值 sub AL,14 ;14 為 16 進位值 das ;未執行前 AL=1E ;執行後 AL=18 (Packed BCD = 32-14)DEC (Decrement by 1) 將運算元值減去 1 例如: mov AL,32 dec AL ;執行後 AL=31

免費註冊體驗

 

此文章來自奇摩知識+如有不便請留言告知

其他解答:

教科書上都有介紹這些暫存器的基礎指令的功能解釋,感覺的出您都沒去看過似的,且這也不是特殊功能指令,先去了解書中範例並修改功能來讓自已了解吧,用debug操作執行見結果就知 想法正不正確了!|||||建議你用debug把這些實際操作一遍,便可邊做邊寫完這些題目。 若你不會debug,那是老師的責任,還是你自己疏忽掉了? 這種題目固然也可紙上作業,但若透過操作,可獲更紮實的驗證, 唯有如此,組合語言你才有辦法繼續學下去。 2010-10-09 14:49:33 補充: 旗號,乍看不起眼,但卻是組語不可搞混的要件。 這方面若混淆了, 會有:計算誤差、正負不分、流程控制偏誤......等後遺症。 本題的這些題目只是旗號的冰山一角, 就算給你答案,甚至略做註解, 對你還是毫無助益的。 意見001已給你指引迷津,就看你肯不肯下苦功了! 補充一點,先把書本的旗號章節,「用心」的理解一遍,再輔以debug操作驗證,必有宏效。
arrow
arrow
    全站熱搜

    reyesb28mi45 發表在 痞客邦 留言(0) 人氣()