1.1 草案2(2024/4/1)1.1.1 相关的特殊功能寄存器 DPU32状态寄存器 Z:零状态。 0:计算结果不为0 1:计算结果为0 DBZ:除数为0状态 0:除数不为0 1:除数为0 SC[5:0]:规格化时移动的位数。 DPU32配置寄存器 CDRS[2:0]:ECX和EDX寄存器组选择(详情参见:DPU32操作寄存器说明)
1.1.2 DPU32操作寄存器说明 1.1.3 运算执行时间表
1.1.4 DPU32介绍 配置DPU(FILL_DPUCFG) FILL_DPUCFG 指令操作: | DPUCFG[7:0] = ACC[7:0] | 指令说明: | | 影响标志位: | | [指令码] | 80H | 时钟数: | 2 |
BIN转BCD(BIN2BCD_EABX) BIN2BCD_EABX 指令操作: | { EAX, EBX } <= BCD( EBX ) | 指令说明: | 将EBX中的BIN码转换为BCD码后写入{ EAX, EBX } | 影响标志位: | | [指令码] | 81H | 时钟数: | 34+ |
BCD转BIN(BCD2BIN) BCD2BIN 指令操作: | EBX <= BIN( EBX ) | 指令说明: | 将EBX中的BCD码转换为BIN码后写入EBX | 影响标志位: | | [指令码] | 82H | 时钟数: | 12+ |
16位AX规格化(NRM_AX) NRM_AX 指令操作: | AX=NRM(AX); SC[5:0] <= Shifted# | 指令说明: | 规格化过程中移动的位数存放在SC[5:0]中 | 影响标志位: | | [指令码] | 83H | 时钟数: | 6 |
32位EAX规格化(NRM_EAX) NRM_EAX 指令操作: | EAX=NRM(EAX); SC[5:0] <= Shifted# | 指令说明: | 规格化过程中移动的位数存放在SC[5:0]中 | 影响标志位: | | [指令码] | 84H | 时钟数: | 7 |
64位{EAX, EBX}规格化(NRM_EABX) NRM_EABX 指令操作: | {EAX,EBX}=NRM({EAX,EBX}); SC[5:0] <= Shifted# | 指令说明: | 规格化过程中移动的位数存放在SC[5:0]中 | 影响标志位: | | [指令码] | 85H | 时钟数: | 8 |
EAX与EBX内容互换(SWAP_EAB) SWAP_EAB 指令操作: | (EAX) ↔(EBX) | 指令说明: | | 影响标志位: | | [指令码] | 86H | 时钟数: | 3 |
ECX与EDX内容互换(SWAP_ECD) SWAP_ECD 指令操作: | (ECX) ↔(EDX) | 指令说明: | | 影响标志位: | | [指令码] | 87H | 时钟数: | 3 |
EAX与ECX内容互换(SWAP_EAC) SWAP_EAC 指令操作: | (EAX) ↔(ECX) | 指令说明: | | 影响标志位: | | [指令码] | 88H | 时钟数: | 3 |
EBX与EDX内容互换(SWAP_EBD) SWAP_EBD 指令操作: | (EBX) ↔(EDX) | 指令说明: | | 影响标志位: | | [指令码] | 89H | 时钟数: | 3 |
32位带进位加法(ADDC_EABX) ADDC_EABX 指令操作: | EBX=EBX + EAX+CY | 指令说明: | | 影响标志位: | | [指令码] | 90H | 时钟数: | 3 |
16位带进位加法(ADDC_ABX) ADDC_ABX 指令操作: | BX= BX+ AX + CY | 指令说明: | | 影响标志位: | | [指令码] | 91H | 时钟数: | 3 |
32位加法(ADD_EABX) ADD_EABX 指令操作: | EBX=EBX + EAX | 指令说明: | | 影响标志位: | | [指令码] | 92H | 时钟数: | 3 |
16位加法(ADD_ABX) ADD_ABX 指令操作: | BX=BX + AX | 指令说明: | | 影响标志位: | | [指令码] | 93H | 时钟数: | 3 |
32位带借位减法(SUBB_EABX) SUBB_EABX 指令操作: | EBX=EBX – EAX - CY | 指令说明: | | 影响标志位: | | [指令码] | 94H | 时钟数: | 3 |
16位带借位减法(SUBB_ABX) SUBB_ABX 指令操作: | BX=BX – AX - CY | 指令说明: | | 影响标志位: | | [指令码] | 95H | 时钟数: | 3 |
32位减法(SUB_EABX) SUB_EABX 指令操作: | EBX=EBX – EAX | 指令说明: | | 影响标志位: | | [指令码] | 96H | 时钟数: | 3 |
16位减法(SUB_ABX) SUB_ABX 指令操作: | BX=BX – AX | 指令说明: | | 影响标志位: | | [指令码] | 97H | 时钟数: | 3 |
32位比较(CMP_EABX) CMP_EABX 指令操作: | EBX – EAX | 指令说明: | | 影响标志位: | | [指令码] | 98H | 时钟数: | 3 |
16位比较(CMP_ABX) CMP_ABX 指令操作: | BX – AX | 指令说明: | | 影响标志位: | | [指令码] | 99H | 时钟数: | 3 |
32位无符号数乘法(MULU_EABX) MULU_EABX 指令操作: | { ECX, EBX } = EBX * EAX | 指令说明: | 结果64位,高32位在ECX,低32位在EBX | 影响标志位: | | [指令码] | 9AH | 时钟数: | 8 |
32位有符号数乘法(MULS_EABX) MULS_EABX 指令操作: | { ECX, EBX } = EBX * EAX | 指令说明: | 结果64位,高32位在ECX,低32位在EBX | 影响标志位: | | [指令码] | 9BH | 时钟数: | 10 |
16位无符号数乘法(MULU_ABX) MULU_ABX 指令操作: | EBX = BX * AX | 指令说明: | 结果32位,乘积低16位在BX,高16位在BX2 | 影响标志位: | | [指令码] | 9CH | 时钟数: | 3 |
16位有符号数乘法(MULS_ABX) MULS_ABX 指令操作: | EBX = BX * AX | 指令说明: | 结果32位,乘积低16位在BX,高16位在BX2 | 影响标志位: | | [指令码] | 9DH | 时钟数: | 4 |
兼容KEIL编译器的16位无符号数乘法(MULX_KEIL16) MULX_KEIL16 指令操作: | BX=BX2 * BX | 指令说明: | 结果16位在BX | 影响标志位: | | [指令码] | 9EH | 时钟数: | 3 |
32位无符号除法(DIVU_EABX) DIVU_EABX 指令操作: | EBX=EBX / EAX ; EAX=EBX%EAX | 指令说明: | 结果32位商在EBX,32位余数在EAX | 影响标志位: | | [指令码] | 9FH | 时钟数: | 19 |
32位有符号除法(DIVS_EABX) DIVS_EABX 指令操作: | EBX=EAX / EBX ; EAX=EAX%EBX | 指令说明: | 结果32位商在EBX,32位余数在EAX | 影响标志位: | | [指令码] | A0H | 时钟数: | 21 |
16位无符号除法(DIVU_ABX) DIVU_ABX 指令操作: | BX=AX / BX ; AX=AX%BX | 指令说明: | 结果16位商在BX,16位余数在AX | 影响标志位: | | [指令码] | A1H | 时钟数: | 11 |
兼容KEIL编译器的16位无符号除法(DIVU_KEIL16) DIVU_KEIL16 指令操作: | BX=BX / BX2 ; BX2=BX%BX2 | 指令说明: | 结果16位商在BX,16位余数在BX2 | 影响标志位: | | [指令码] | A2H | 时钟数: | 10 |
16位有符号除法(DIVS_ABX) DIVS_ABX 指令操作: | BX=BX / AX ; AX=BX%AX | 指令说明: | 结果16位商在BX,16位余数在AX | 影响标志位: | | [指令码] | A3H | 时钟数: | 13 |
兼容KEIL编译器的16位有符号除法(DIVS_KEIL16) DIVS_KEIL16 指令操作: | BX=BX / BX2 ; BX2=BX%BX2 | 指令说明: | 结果16位商在BX,16位余数在BX2 | 影响标志位: | | [指令码] | A4H | 时钟数: | 12 |
64位无符号除法(DIVU_EABXC)(64位除以32位) DIVU_EABXC 指令操作: | {EAX, EBX} = ( {EAX, EBX} / ECX ) ECX = ( {EAX, EBX} % ECX ) | 指令说明: | 结果64位商在{EAX, EBX,32位余数在ECX | 影响标志位: | | [指令码] | A5H | 时钟数: | 34+ |
32位无符号除法(DIVU_EBXA)(32位除以16位) DIVU_EBXA 指令操作: | EBX = (EBX / AX) AX = ( EBX % AX ) | 指令说明: | 结果32位商在EBX,16位余数在AX | 影响标志位: | | [指令码] | A6H | 时钟数: | 18+ |
清零32位EAX(SET0_EAX) SET0_EAX 指令操作: | EAX=0 | 指令说明: | | 影响标志位: | | [指令码] | B0H | 时钟数: | 2 |
置位32位EAX(SET1_EAX) SET1_EAX 指令操作: | EAX=-1 | 指令说明: | | 影响标志位: | | [指令码] | B1H | 时钟数: | 2 |
清零32位EBX(SET0_EBX) SET0_EBX 指令操作: | EBX=0 | 指令说明: | | 影响标志位: | | [指令码] | B2H | 时钟数: | 2 |
置位32位EBX(SET1_EBX) SET1_EBX 指令操作: | EBX=-1 | 指令说明: | | 影响标志位: | | [指令码] | B3H | 时钟数: | 2 |
清零32位ECX(SET0_ECX) SET0_ECX 指令操作: | ECX=0 | 指令说明: | | 影响标志位: | | [指令码] | B4H | 时钟数: | 2 |
置位32位ECX(SET1_ECX) SET1_ECX 指令操作: | ECX=-1 | 指令说明: | | 影响标志位: | | [指令码] | B5H | 时钟数: | 2 |
清零32位EDX(SET0_EDX) SET0_EDX 指令操作: | EDX=0 | 指令说明: | | 影响标志位: | | [指令码] | B6H | 时钟数: | 2 |
置位32位EDX(SET1_EDX) SET1_EDX 指令操作: | EDX=-1 | 指令说明: | | 影响标志位: | | [指令码] | B7H | 时钟数: | 2 |
32位EAX取负数(NEGS_EAX) NEGS_EAX 指令操作: | EAX=-EAX | 指令说明: | | 影响标志位: | | [指令码] | B8H | 时钟数: | 2 |
32位EBX取负数(NEGS_EBX) NEGS_EBX 指令操作: | EBX=-EBX | 指令说明: | | 影响标志位: | | [指令码] | B9H | 时钟数: | 2 |
16位AX取负数(NEGS_AX) NEGS_AX 指令操作: | AX=-AX | 指令说明: | | 影响标志位: | | [指令码] | BAH | 时钟数: | 2 |
16位BX取负数(NEGS_BX) NEGS_BX 指令操作: | BX=-BX | 指令说明: | | 影响标志位: | | [指令码] | BBH | 时钟数: | 2 |
32位EAX加1运算(INC1_EAX) INC1_EAX 指令操作: | EAX=EAX+1 | 指令说明: | | 影响标志位: | | [指令码] | C0H | 时钟数: | 3 |
32位EBX加1运算(INC1_EBX) INC1_EBX 指令操作: | EBX=EBX+1 | 指令说明: | | 影响标志位: | | [指令码] | C1H | 时钟数: | 3 |
32位EAX加4运算(INC4_EAX) INC4_EAX 指令操作: | EAX=EAX+4 | 指令说明: | | 影响标志位: | | [指令码] | C2H | 时钟数: | 3 |
32位EBX加4运算(INC4_EBX) INC4_EBX 指令操作: | EBX=EBX+4 | 指令说明: | | 影响标志位: | | [指令码] | C3H | 时钟数: | 3 |
16位AX加1运算(INC1_AX) INC1_AX 指令操作: | AX=AX+1 | 指令说明: | | 影响标志位: | | [指令码] | C4H | 时钟数: | 3 |
16位BX加1运算(INC1_BX) INC1_BX 指令操作: | BX=BX+1 | 指令说明: | | 影响标志位: | | [指令码] | C5H | 时钟数: | 3 |
16位AX加2运算(INC2_AX) INC2_AX 指令操作: | AX=AX+2 | 指令说明: | | 影响标志位: | | [指令码] | C6H | 时钟数: | 3 |
16位BX加2运算(INC2_BX) INC2_BX 指令操作: | BX=BX+2 | 指令说明: | | 影响标志位: | | [指令码] | C7H | 时钟数: | 3 |
32位EAX减1运算(DEC1_EAX) DEC1_EAX 指令操作: | EAX=EAX-1 | 指令说明: | | 影响标志位: | | [指令码] | C8H | 时钟数: | 3 |
32位EBX减1运算(DEC1_EBX) DEC1_EBX 指令操作: | EBX=EBX-1 | 指令说明: | | 影响标志位: | | [指令码] | C9H | 时钟数: | 3 |
32位EAX减4运算(DEC4_EAX) DEC4_EAX 指令操作: | EAX=EAX-4 | 指令说明: | | 影响标志位: | | [指令码] | CAH | 时钟数: | 3 |
32位EBX减4运算(DEC4_EBX) DEC4_EBX 指令操作: | EBX=EBX-4 | 指令说明: | | 影响标志位: | | [指令码] | CBH | 时钟数: | 3 |
16位AX减1运算(DEC1_AX) DEC1_AX 指令操作: | AX=AX-1 | 指令说明: | | 影响标志位: | | [指令码] | CCH | 时钟数: | 3 |
16位BX减1运算(DEC1_BX) DEC1_BX 指令操作: | BX=BX-1 | 指令说明: | | 影响标志位: | | [指令码] | CDH | 时钟数: | 3 |
16位AX减2运算(DEC2_AX) DEC2_AX 指令操作: | AX=AX-2 | 指令说明: | | 影响标志位: | | [指令码] | CEH | 时钟数: | 3 |
16位BX减2运算(DEC2_BX) DEC2_BX 指令操作: | BX=BX-2 | 指令说明: | | 影响标志位: | | [指令码] | CFH | 时钟数: | 3 |
32位与运算(BAND_EABX) BAND_EABX 指令操作: | EBX=EBX & EAX | 指令说明: | | 影响标志位: | | [指令码] | D0H | 时钟数: | 3 |
16位与运算(BAND_ABX) BAND_ABX 指令操作: | BX=BX & AX | 指令说明: | | 影响标志位: | | [指令码] | D1H | 时钟数: | 3 |
32位或运算(BOR_EABX) BOR_EABX 指令操作: | EBX=EBX | EAX | 指令说明: | | 影响标志位: | | [指令码] | D2H | 时钟数: | 3 |
16位或运算(BOR_ABX) BOR_ABX 指令操作: | BX=BX | AX | 指令说明: | | 影响标志位: | | [指令码] | D3H | 时钟数: | 3 |
32位异或运算(BXOR_EABX) BXOR_EABX 指令操作: | EBX=EBX ^ EAX | 指令说明: | | 影响标志位: | | [指令码] | D4H | 时钟数: | 3 |
16位异或运算(BXOR_ABX) BXOR_ABX 指令操作: | BX=BX ^ AX | 指令说明: | | 影响标志位: | | [指令码] | D5H | 时钟数: | 3 |
32位取反运算(BCPL_EAX) BCPL_EAX 指令操作: | EAX=~EAX | 指令说明: | | 影响标志位: | | [指令码] | D6H | 时钟数: | 2 |
32位取反运算(BCPL_EBX) BCPL_EBX 指令操作: | EBX=~EBX | 指令说明: | | 影响标志位: | | [指令码] | D7H | 时钟数: | 2 |
32位EAX逻辑左移n位(SHLX_EAX_CL) SHLX_EAX_CL 指令操作: | {CY, EAX}=EAX << ACC[4:0] | 指令说明: | 需要移动位数存放在ACC[4:0]中 | 影响标志位: | | [指令码] | E0H | 时钟数: | 7 |
32位EBX逻辑左移n位(SHLX_EBX_CL) SHLX_EBX_CL 指令操作: | (CY, EBX)=EBX << ACC[4:0] | 指令说明: | 需要移动位数存放在ACC[4:0]中 | 影响标志位: | | [指令码] | E1H | 时钟数: | 7 |
16位AX逻辑左移n位(SHLX_AX_CL) SHLX_AX_CL 指令操作: | {CY, AX}=AX << ACC[3:0] | 指令说明: | 需要移动位数存放在ACC[3:0]中 | 影响标志位: | | [指令码] | E2H | 时钟数: | 7 |
16位BX逻辑左移n位(SHLX_BX_CL) SHLX_BX_CL 指令操作: | {CY, BX}=BX << ACC[3:0] | 指令说明: | 需要移动位数存放在ACC[3:0]中 | 影响标志位: | | [指令码] | E3H | 时钟数: | 7 |
32位EAX逻辑右移n位(SHRU_EAX_CL) SHRU_EAX_CL 指令操作: | {EAX, CY}=EAX >> ACC[4:0] | 指令说明: | 无符号整数右移,需要移动位数存放在ACC[4:0]中 | 影响标志位: | | [指令码] | E4H | 时钟数: | 7 |
32位EBX逻辑右移n位(SHRU_EBX_CL) SHRU_EBX_CL 指令操作: | {EBX, CY}=EBX >> ACC[4:0] | 指令说明: | 无符号整数右移,需要移动位数存放在ACC[4:0]中 | 影响标志位: | | [指令码] | E5H | 时钟数: | 7 |
16位AX逻辑右移n位(SHRU_AX_CL) SHRU_AX_CL 指令操作: | {AX, CY}=AX >> ACC[3:0] | 指令说明: | 无符号整数右移,需要移动位数存放在ACC[3:0]中 | 影响标志位: | | [指令码] | E6H | 时钟数: | 7 |
16位BX逻辑右移n位(SHRU_BX_CL) SHRU_BX_CL 指令操作: | {BX, CY}=BX >> ACC[3:0] | 指令说明: | 无符号整数右移,需要移动位数存放在ACC[3:0]中 | 影响标志位: | | [指令码] | E7H | 时钟数: | 7 |
32位EAX算术右移n位(SHRS_EAX_CL) SHRS_EAX_CL 指令操作: | {EAX, CY}=EAX >> ACC[4:0] | 指令说明: | 有符号整数右移,需要移动位数存放在ACC[4:0]中 | 影响标志位: | | [指令码] | E8H | 时钟数: | 7 |
32位EBX算术右移n位(SHRS_EBX_CL) SHRS_EBX_CL 指令操作: | {EBX, CY}=EBX >> ACC[4:0] | 指令说明: | 有符号整数右移,需要移动位数存放在ACC[4:0]中 | 影响标志位: | | [指令码] | E9H | 时钟数: | 7 |
16位AX算术右移n位(SHRS_AX_CL) SHRS_AX_CL 指令操作: | {AX, CY}=AX >> ACC[3:0] | 指令说明: | 有符号整数右移,需要移动位数存放在ACC[3:0]中 | 影响标志位: | | [指令码] | EAH | 时钟数: | 7 |
16位BX算术右移n位(SHRS_BX_CL) SHRS_BX_CL 指令操作: | {BX, CY}=BX >> ACC[3:0] | 指令说明: | 有符号整数右移,需要移动位数存放在ACC[3:0]中 | 影响标志位: | | [指令码] | EBH | 时钟数: | 7 |
32位乘除运算(MMD32_EABX) MMD32_EABX 指令操作: | {EDX,EBX}=EBX*EAX/ECX | 指令说明: | EAX、EBX、ECX均为有符号数 先乘为64位中间结果,再除为32位结果在EBX | 影响标志位: | | [指令码] | F0H | 时钟数: | 43 |
16位乘除运算(MMD16_ABX) MMD16_ABX 指令操作: | EBX=BX*AX/CX | 指令说明: | AX、BX、CX均为有符号数 先乘为32位中间结果,再除为16位结果在BX | 影响标志位: | | [指令码] | F1H | 时钟数: | 21 |
32位线性标定(LTC32_EAX) LTC32_EAX 指令操作: | {EDX, EBX}=(EBX-EAX)*EDX/ECX | 指令说明: | | 影响标志位: | | [指令码] | F2H | 时钟数: | 44 |
16位线性标定(LTC16_AX) LTC16_AX 指令操作: | EBX=(BX-AX)*DX/CX | 指令说明: | | 影响标志位: | | [指令码] | F3H | 时钟数: | 22 |
32位乘加运算(MA32_EDX) MA32_EDX 指令操作: | ECX=ECX+BX*AX | 指令说明: | | 影响标志位: | | [指令码] | F4H | 时钟数: | 5 |
64位乘加运算(MA64_EDX) MA64_EDX 指令操作: | { EDX, ECX }={EDX, ECX}+EBX*EAX | 指令说明: | | 影响标志位: | | [指令码] | F5H | 时钟数: | 12 |
|