簡體   English   中英

我們不能用 ADD 指令在 8086 中將兩個 16 位數字相加嗎?

[英]Can't we use the ADD instruction to add two 16-bit numbers in 8086?

由於 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 位數字的唯一可接受的方法嗎?

您的第一個代碼塊在 BX 中產生與您的第二個代碼塊相同的結果。 (在 CF 和 SF 中,我認為是 OF。不是 ZF、PF 或 AF,但原因很明顯。)

16 位add不是兩個單獨字節加法的 SIMD 加法。 如果需要,請使用movd xmm0, ebx / movd movd xmm1, ecx / paddb xmm0, xmm1 MMX / SSE2 paddb是帶有單獨字節元素的 SIMD 加法。 標量 integer add是對整個操作數大小的單個 integer 加法運算,CF 和 OF 根據寄存器的頂部確定,無論是什么。

您可以通過構建一個進位跨 8 位邊界傳播的測試用例來簡單地證明這一點。 在調試器中單步執行,並在添加后查看寄存器。

   mov  ax, 0x80
   add  ax, ax          ; ax = 0x0100  = 0x0080 << 1

Or look at compiler output, like https://godbolt.org/z/xKfK6h4d5 where GCC uses add eax, edx to implement addition of two short variables, or any existing examples of code using add to do pointer math, for example.

也許您的教授必須自己學習匯編才能教授一門課程,並且沒有太多經驗。 add和其他整數寄存器操作是對整數的單個操作這一事實非常基本,並且在所有(?)ISA中都是如此。 (盡管 8086 是為數不多的具有部分寄存器別名為低/高半部分的寄存器之一)。 希望她能糾正她的誤解,讓 class 知道組裝是如何工作的。

但是我的教授說8086做這個操作是分兩步而不是一步...

她錯了:

根據 8086 數據手冊(第 2-52 頁),添加兩個 16 位數字與添加兩個 8 位數字所用的時間完全相同:3 個時鍾周期。

有些 CPU(如 8085)分兩步執行 16 位加法; 但8086不這樣做。

她說如果我們直接使用ADD指令,小和產生的進位不會被結轉。

這意味着添加12FFh0001hADD BX, CX操作會導致1200h

這完全是胡說八道

即使是 Z80 CPU(它只有一個 4 位 ALU)也會在這個加法中計算出1300h的結果; 帶有 16 位 ALU 的 8086(或 8088)無論如何都會計算出正確的結果!

也許她對 808 5感到困惑:

8085 不會在 16 位加法后設置所有標志(例如零標志); 但是,即使是 8085 也會計算出正確的結果並正確設置進位標志。

她的解決方案是添加兩個 16 位數字的唯一可接受的方法嗎?

在這種情況下,每個編譯器都會使用ADD BX, CX指令。

您的教授想看看您是否了解如何使用ADC指令。

為此,使用ADD BX, CX不是她想看到的。

但是,如果她沒有告訴您應該只使用 8 位加法,那么您的解決方案是正確的!

暫無
暫無

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

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