簡體   English   中英

狀態寄存器上實際使用了多少位 (8086)

[英]How many bits are actually used on the Status Register (8086)

在課堂上問這個,我想我明白了但不確定所以我想確認一下。

狀態寄存器有 16 位,每一位都有一個標志。 但是,我們的講座幻燈片中提供的圖片顯示的情況並非如此?

狀態寄存器

圖像顯示只有某些位實際上有標志。 這是否意味着實際上只使用了那些位? 其余的部分只是飼料?

如果我的問題不清楚,我很抱歉,如果有人問,我可以嘗試解釋更多。

目前,我在想實際上只使用了 9 位?

在文檔中,它顯示為“16 位寄存器”,因為它是寄存器的邏輯大小。

在實際實現中(處理器的創建方式),它們通常只有 9 位。 其他“位”是直接連接到接地引腳的線(或 +1.2V 或任何可能存在的電壓。)這​​是因為內存很昂貴,如果您可以節省一些位,硬件會更便宜(想想節省 5 位 x 1000 萬個處理器...)

在較新的實現中,我認為它們不會那么麻煩,盡管計算機會自動執行類似的操作,因此如果要將內存始終保持為 0,則再次沒有理由擁有真正的內存。

所以作為程序員,對你來說,就是16位。 對於硬件工程師來說,它可能只有9 位。 您只需要確保您仍然可以正確地將標志推送到堆棧上(其他 5 位將始終是已知值,在大多數情況下為零)。


更多細節:

要訪問標志寄存器,作為程序員,您可以使用PUSHFPOPF

; read to AX
PUSHF
POP AX

; write from AX
PUSH AX
POPF

(作為關於上面 FUZxxl 注釋的旁注,舊的 PUSHF 和 POPF 指令是 16 位,新版本是 32 或 64 位。這對於保持堆棧正確對齊很重要。)

正如 Ped7g 所提到的,雖然您可以在 AX 中放置任何隨機值並執行PUSH + POPF ,但這不是一個好習慣。 通常,當您想更改沒有指令的標志時,您可以這樣做:

PUSHF
POP AX
OR 10h       ; set flag A to 1
PUSH AX
POPF

更改標志的其他方法是使用某些指令。 這是在指令中直接定義的。 有一些指令如CLDSTC直接清除或設置標志。 還有其他的,比如SBB會調整借位和ADC調整進位(以及 N、Z、V 標志......)

最后,有一些方法可以使用分支指令檢查基本標志。 在許多情況下,這與CMP指令一起使用(在較新的處理器上,標志可能發生變化的原因有很多......)這允許您將寄存器與另一個值進行比較,如果它更小,更大,相等,小於或等於,大於或等於,會產生溢出。 所以像JC這樣的指令讀取 C 標志並在為真(設置為 1)時跳轉。

在較舊的處理器中,大多數標志與分支鏈接。 8086 添加了用於“算術”運算(以十進制進行加法和減法)的 A 標志和用於“方向”的 D 標志(參見LOOPCXMOVB )。

后來它為很多事情添加了許多其他標志,我不會在這里列出它們。 其中一些對於了解某條指令是否存在很有用,從那時起,我們就有了一個用於擴展的CPUID指令,您需要了解有關 CPU 的所有信息,甚至可以在運行時對其進行修補。

暫無
暫無

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

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