由于 8086 有一個 16 位 ALU 和 16 位暫存器,這就是我想象添加兩個 16 位數字的方式:
MOV BX,12FFh
MOV CX,0001h
ADD BX,CX
但是我的教授說 8086 是分兩步完成此操作的,而不是通過將數字相加成對的 8 位數字來完成此操作。她說如果我們直接使用ADD指令,小和產生的進位不會被結轉。她是這樣解決的:
MOV BX,12FFh
MOV CX,0001h
ADD BL,CL
ADC BH,CH
她的解決方案是添加兩個 16 位數字的唯一可接受的方法嗎?
uj5u.com熱心網友回復:
您的第一個代碼塊在 BX 中產生與您的第二個代碼塊相同的結果。(在 CF 和 SF 中,我認為是 OF。不是 ZF、PF 或 AF,但原因很明顯。)
16 位add不是兩個單獨位元組相加的 SIMD 相加。如果需要,請使用movd xmm0, ebx/ movd xmm1, ecx/ paddb xmm0, xmm1。 MMX / SSE2paddb是帶有單獨位元組元素的 SIMD 加法。 標量整數add是對整個運算元大小的單個整數加法運算,CF 和 OF 根據暫存器的頂部確定,無論是什么。
您可以通過構建一個進位跨 8 位邊界傳播的測驗用例來簡單地證明這一點。在除錯器中單步執行,并在添加后查看暫存器。
mov ax, 0x80
add ax, ax ; ax = 0x0100 = 0x0080 << 1
或者查看編譯器輸出,例如https://godbolt.org/z/xKfK6h4d5,其中 GCC 用于add eax, edx實作兩個short變數的加法,或者任何現有的add用于執行指標數學運算的代碼示例。
也許您的教授必須自己學習匯編才能教授一門課程,并且沒有太多經驗。add整數暫存器操作和其他整數暫存器操作是對整數的單一操作這一事實非常基本,并且在所有(?)ISA中都是如此。(盡管 8086 是為數不多的具有部分暫存器別名為低/高半部分的暫存器之一)。希望她能糾正她的誤解,讓全班知道組裝是如何進行的。
uj5u.com熱心網友回復:
但是我的教授說8086做這個操作是兩步而不是一步...
她錯了:
根據 8086 資料手冊(第 2-52 頁),添加兩個 16 位數字與添加兩個 8 位數字所用的時間完全相同:3 個時鐘周期。
有些 CPU(如 8085)分兩步執行 16 位加法;但8086不這樣做。
她說如果我們直接使用ADD指令,小和產生的進位不會被結轉。
這意味著在添加和時ADD BX, CX操作會導致結果。1200h12FFh0001h
這完全是胡說八道:
即使是 Z80 CPU(它只有一個 4 位 ALU)也會計算1300h這個加法的結果;帶有 16 位 ALU 的 8086(或 8088)無論如何都會計算出正確的結果!
也許她對 808 5感到困惑:
8085 不會在 16 位加法后設定所有標志(例如零標志);但是,即使是 8085 也會計算出正確的結果并正確設定進位標志。
她的解決方案是添加兩個 16 位數字的唯一可接受的方法嗎?
在這種情況下,每個編譯器都會使用該ADD BX, CX指令。
你的教授想看看你是否了解如何使用該ADC指令。
正因如此,使用ADD BX, CX并不是她想看到的。
但是,如果她沒有告訴您應該只使用 8 位加法,那么您的解決方案是正確的!
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/411258.html
標籤:
上一篇:有沒有辦法將整數轉換為位元組,知道整數在位元組范圍內。使用SSE?
下一篇:浮點運算式的匯編時求值
