SUB 指令在 AVR 匯編中是如何作業的?它需要兩個恭維并添加它還是它的功能不同?如果我減去兩個 8 位數字,比如 1 - 2 并且答案是 -1,我應該期望 1 的二進制補碼還是其他值?
編輯:我不知道在考慮高于 128 的數字時如何考慮這個問題,我對雙恭維的理解是你可以數到的數字的一半,但是如果我給出 SUB 指令來做:
2 - 255
位操作是什么樣的?我的理解是 255 的二進制補碼需要 9 位(100000001),它只是在 8 位系統中溢位嗎?數學看起來像:
00000010 00000001 = 00000011
uj5u.com熱心網友回復:
匯編語言不做減法,機器代碼也不做減法,處理器中的邏輯做。是的,它確實使用加法來做減法。
2 - 255
從小學
2 - 255 = 2 (-255)
我們從第一學期的編程課上知道,倒相加一個
2 - 255 = 2 (-255) = 2 ~255 1
現在用加法器很容易做到
1
00000010
00000000
===========
000000001
00000010
00000000
===========
00000011
現在這看起來很奇怪,但是如果您正在考慮帶有 255 之類的數字的 8 位,那就是 -1 符號。所以 2 - (-1) = 2 1 = 3。這是有道理的。二進制補碼的美妙之處在于我們可以使用相同的邏輯而不關心無符號或有符號,對于相同的位模式,您會得到相同的答案。
正如評論 255 中指出的那樣,8 位數字只能是無符號的。但相同的位是-1。
你的例子很難形象化。因為它都作業相同的 4 位比 8 更容易在這里描述。所以 0 到 15 或 -8 到 7 用于無符號或有符號。
所以如果我們做 12 5 我們會得到 17 但這是一個無符號溢位,讓我們試試
0
1100
0101
======
11000
1100
0101
======
0101
設定了執行,所以我們有一個無符號溢位。
-7 - 4 = -11 怎么樣
10011
1001
1100
=======
0110
這是6,但是。查看 msbit 的進位和進位。它們不一樣,所以這是一個有符號溢位。另一種說法是查看運算元的 msbits 和結果,如果運算元 msbits 相同但結果不同,則它是有符號溢位。
如果我們有另一個位 10110 是 1001 1 = 1011 所以 -11。
它適用于 8 位或 32 位或 64 位或 128 位。乘法和除法可以有有符號和無符號,但是由于二進制補碼的性質,加法和減法,位模式使用加法器,對于有符號或無符號沒有什么特別的。關心的是程式員,而不是邏輯。
現在,當涉及到級聯時,這確實很重要,尤其是減法。上面沒有顯示,你可以自己試試,但是當做無符號時,msbit 的進位當然是無符號溢位,但如果處理器使用標志,那就變成進位標志。但是對于減法,1(并且沒有符號溢位)意味著不借。數學不需要借用(如果你用手寫而不是倒置并添加一件事)。這很好,但一些處理器將其反轉并使進位標志成為減法的借用標志。其他人不反轉并使其成為不借用標志進行減法。如果有借位減法,那么它們是否反轉與如何處理 lsbit 進位有關。現在這被隱藏在邏輯中并且“正常作業”,但是既然你問這些事情是如何作業的。
此外,更好的處理器檔案(閱讀:ARM)向您顯示了一個條件表以及哪些標志是什么。如果進位是借位而不是借位進行減法,則處理器之間的處理器將不同,因為減法用于比較指令...
uj5u.com熱心網友回復:
只要您減去兩個相等型別的資料,減法運算就可以作業。這意味著您可以減去signed-signed或unsigned- unsigned。您不能混合有符號和無符號型別。
第一種情況:
; xl, yl is considered as signed
ldi xl, 2 ;first op = 2
ldi yl, 255 ;second op = -1
sub xl, yl ;result = 3 because (2-(-1))
brvs overflow ;test if overflow occurred (no it's false now)
第二種情況:
; xl, yl is considered as unsigned
ldi xl, 2 ;first op = 2
ldi yl, 255 ;second op = 255
sub xl, yl ;result = invalid because 2-255 is negative
brlo overflow ;test if first operand is lower as second (yes it's true now)
如果你真的想減去 2 - 255,你必須為兩個數字使用兩個位元組。因為結果是 -253 而一個位元組的有效范圍只有 -128 到 127
; xh:xl, yh:yl is considered as signed
ldi xh, 0
ldi xl, 2 ;first op = 2
ldi yh, 0
ldi yl, 255 ;second op = 255
sub xl, yl
sbc xh, yh ;result is -235 (0xFF03)
brvs overflow ;test if overflow occurred (no it's false now)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/495931.html
