2011-11-07 69 views
6

我一直在閱讀和使用8086指令集,它說CMP(比較)可以設置進位標誌。我知道一個比較會減去兩個操作數,但我想知道是否有人可以在這種情況下提供示例。爲什麼CMP(compare)有時會在8086程序集中設置進位標誌?

我只是無法理解添加數字的想法,負數將設置進位標誌。我讀過借閱標誌,但我只是需要一個例子來闡明我對比較指令的理解。

另外,據我所知,如果3 - 5 = -2會設置負標誌...什麼時候進行設置?

+0

聲明「我需要做一個例子」使這聽起來像作業。如果你只是通過一些現有的代碼進行調試,並觀看CY標誌,我相信你會看到一些ADD指令後設置。 –

+0

嗯,我創建了我自己的指令集架構,我只是讀了8086指令,想知道如何比較(減去2個操作數並設置各個標誌)可以設置進位標誌。我知道ADD何時設置進位,但我對減/進位有些懷疑(不要與借位混淆)。在8086(以及許多其他)上的 – faul

+0

,進位標誌執行雙重任務並表示減法或比較操作中的借位。如果您比較比較的值大於寄存器中的值,則存在借位,例如設置了CY標誌。如果該值與寄存器相同或更小,則不會借用,並且CY被清除。 – JustJeff

回答

4
  • 進位標誌在導致下溢或溢出的操作之後置位。例如,從6中減去10會導致下溢並設置進位標誌。同樣,將1加到寄存器的最大值將導致溢出並設置進位標誌。
  • 進位標誌在移位操作期間也被修改,它被設置爲 到移出目標寄存器的最後一位的值。
  • 位測試會將測試位的值放入進位 標誌中。這樣做的操作碼:BT,BTC,BTR和BTS。
  • 直接影響進位標誌的指令:CLC,CMC和STC。
  • 在比較期間,進位標誌設置就好像兩個 操作數已被減去。
  • 在否定(NEG)期間,除非操作數爲 爲零,否則進位標誌置位,在這種情況下,該標誌被清零。
2

使用無符號算術時,通常設置進位標誌。例如,添加兩個無符號(其結果不適合寄存器)的數字不會引起溢出標誌,而只是進位標誌。但是,使用帶符號的算術時,在這種情況下會設置溢出標誌。

1

您可以在this answer的相關問題的加號或減號後加上或減去進位和溢出標誌,將其設置爲0和1。
您還可以在那裏找到示例C代碼,模擬帶有進位的加法和用8位數字的借用指令進行減法,您可以玩這個,也許可以得到更多的例子。

輸出格式有這樣的事情:
127(127) - 255( -1) - 1 = 127(127) CY=1 OV=0
數字,每個數字表示爲兩個無符號和括號內簽署(2的補數)旁邊。 =之前的數字是ADC/SBB之前的進位標誌。 CY=OV=顯示ADC/SBB後的進位和溢出標誌。

比較和減去沒有借位幾乎相同,除了它隻影響進位,溢出,符號和零標誌(以及奇偶校驗和輔助進位,但它們在這裏不重要),而不修改寄存器中的任何數字/記憶。

相關問題