Re: 關於CORCON暫存器的SATA位元問題?(dsPIC33FJ128MC802晶片)
|
||||
---|---|---|---|---|
版主
|
最簡單的解釋是以一般使用 16 位元無符號加法為例:
非飽和演算法:0x8002 + 0x8001 = 0x0003 (發生溢位,只取後 16-bit 資料) 飽和演算法:0x8002 + 0x8001 = 0xFFFF (取最大值出來,沒有考慮溢位問題) 飽和演算法定義:當發生計算結果大於可表示的最大值或者小於可表示的最小值的時候,結果為這個最大值或者最小值 非飽和演算法:如果結果溢出 則直接去掉溢出位,剩下的就是結果。
發表於: 2021/4/27 10:39
|
|||
|
Re: 關於CORCON暫存器的SATA位元問題?(dsPIC33FJ128MC802晶片)
|
||||
---|---|---|---|---|
版主
|
在 dsPIC 系列的運算是以 ACCA & ACCB 為主,可以查到的說明是以 dsPIC30F/33F 的組合語言裡的說明。你可以參考一下 : dsPIC30F/33F Programmer’s Reference Manual 裡的說明。請用搜尋 " saturation" 查詢書裡的說明。
https://ww1.microchip.com/downloads/en/devicedoc/70157c.pdf 如貼圖所示: 沒使用及有使用 saturation 的設定時,對 ACCA & ACCB 的數值操作是不一樣的。
發表於: 2021/4/27 10:45
|
|||
|
Re: 關於CORCON暫存器的SATA位元問題?(dsPIC33FJ128MC802晶片)
|
||||
---|---|---|---|---|
資深會員
|
程式測試如下:
register int regA asm("A"); register int regB asm("B"); int value1; int value2; int output; _SATA=0; value1=-32766; value2=-32767; regA = __builtin_lac(value1,0); regB = __builtin_lac(value2,0); regA = __builtin_addab(regA,regB); output = __builtin_sac(regA,0); _SATA=1; value1=-32766; value2=-32767; regA = __builtin_lac(value1,0); regB = __builtin_lac(value2,0); regA = __builtin_addab(regA,regB); output = __builtin_sac(regA,0); 從watch觀查ACCA,其值確實不同,但是為何最後output值卻是相同?
發表於: 2021/4/27 19:06
|
|||
|