![](/img/trans.png)
[英]How can I add two 16 bit numbers in assembly language in microprocessor 8086
[英]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指令,小和產生的進位不會被結轉。
這意味着添加12FFh
和0001h
時ADD 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.