簡體   English   中英

SUB指令在匯編AVR中如何工作

[英]how does the SUB instruction work in assembly AVR

SUB 指令在 AVR 匯編中是如何工作的? 是否需要兩個恭維並添加它,還是 function 不同? 如果我減去兩個 8 位數字,比如 1 - 2 並且答案是 -1,我應該期望 1 的二進制補碼還是其他值?

編輯:我不知道在考慮高於 128 的數字時如何考慮這個問題,我對雙恭的理解是你可以數到的數字的一半,但是如果我給出 SUB 指令來做:

2 - 255

位操作是什么樣的? 我的理解是 255 的二進制補碼需要 9 位(100000001),它只是在 8 位系統中溢出嗎? 數學看起來像:

00000010 + 00000001 = 00000011

匯編語言不做減法,機器代碼也不做減法,處理器中的邏輯做。 是的,它確實使用加法來做減法。

2 - 255

從小學

2 - 255 = 2 + (-255)

我們從第一學期的編程中知道 class,反轉並加一個

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)向您顯示了一個條件表以及哪些標志是什么。 如果進位是借位而不是借位進行減法,則處理器之間的處理器將不同,因為減法用於比較指令...

只要您減去兩個相等類型的數據,減法運算就可以工作。 這意味着您可以減去signed - signedunsigned - 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM