道清 发表于 2025-8-25 14:31:08

AI帮我写80C51单片机双字节汇编程序有很多错误,请高手帮我看看

AI帮我写80C51单片机双字节汇编程序:总数12345,先把个位存入10H。十位除10,商存入11H。百位除100,商存入12H。千位除1000,商存入13H。万位除10000,商存入14H。


MAIN:
    MOV DPTR, #12345   ; 加载总数12345到DPTR
    MOV R0, #10H       ; 设置存储起始地址

    ; 提取个位(直接取最低字节的低4位)
    MOV A, DPL
    ANL A, #0FH
    MOV @R0, A
    INC R0

    ; 提取十位(除以10)
    MOV A, DPL
    MOV B, #10
    DIV AB
    MOV @R0, B
    INC R0

    ; 提取百位(除以100)
    MOV A, DPH
    MOV B, #100
    DIV AB
    MOV @R0, A
    INC R0

    ; 提取千位(除以1000)
    MOV A, DPH
    MOV B, #10
    DIV AB
    MOV @R0, A
    INC R0

    ; 提取万位(除以10000)
    MOV A, DPH
    MOV B, #1
    DIV AB
    MOV @R0, A

    SJMP $             ; 程序结束循环
END

道清 发表于 2025-8-25 14:36:01

第2个程序,程序输入单片机后就显示   90000

帮我写80C51单片机双字节汇编程序:总数12345。先把个位存入10H。十位除10,商存入11H。百位除100,商存入12H。千位除1000,商存入13H。万位除10000,商存入14H。


ORG   0000H
      LJMP    MAIN

      ORG   0030H
MAIN:   MOV   DPTR, #12345   ; 加载双字节数12345
      MOV   R0, #10H       ; 设置存储起始地址

      ; 提取个位(12345 MOD 10)
      MOV   A, DPL
      MOV   B, #10
      DIV   AB
      MOV   @R0, B         ; 个位存入10H
      INC   R0

      ; 提取十位(12345/10 MOD 10)
      MOV   A, DPL
      MOV   B, #10
      DIV   AB
      MOV   A, B
      MOV   B, #10
      DIV   AB
      MOV   @R0, B         ; 十位存入11H
      INC   R0

      ; 提取百位(12345/100 MOD 10)
      MOV   A, DPH
      MOV   B, #100
      DIV   AB
      MOV   @R0, A         ; 百位存入12H
      INC   R0

      ; 提取千位(12345/1000 MOD 10)
      MOV   A, DPH
      MOV   B, #10
      DIV   AB
      MOV   @R0, A         ; 千位存入13H
      INC   R0

      ; 提取万位(12345/10000)
      MOV   A, DPH
      MOV   B, #1
      DIV   AB
      MOV   @R0, A         ; 万位存入14H

      SJMP    $            ; 程序结束
      END

angmall 发表于 2025-8-25 23:03:48

MDU16硬件乘/除移位指令
$NOMOD51

NAME   UIDIV

/**********************************************************************************************
* intR6R7 uidiv(int R6R7, int R4R5);   出口:余数int R4R5
* result = value1 / value2
*16位/16位-->16位(无符号二进制除法)
* R6R7 = R6R7 / R4R5(出口:余数R4R5)
* note: if value2 ==0 , result = value1;

*用   途:STC8系列MCU
*作   者:许意义
*版   本:2.00
*日   期:2022-12-12

**********************************************************************************************/

CLR_EA                   MACRO   
                        MOV         C, EA
                        CLR                EA
                        PUSH    P_SW2
                        ORL   P_SW2,#0x80
                               ENDM

SETB_EA                   MACRO
                        POP   P_SW2
                        MOV         EA, C
                               ENDM

LD_MD                    MACRO      BYTE_X, INC_DPTR
                        MOV      A,BYTE_X
                        MOVX   @DPTR,A
                IFINC_DPTR
                        INC      DPTR
                ENDIF
                               ENDM

ST_MD                    MACRO      BYTE_X, INC_DPTR
                        MOVX   A,@DPTR
                        MOV      BYTE_X,A
                IFINC_DPTR
                        INC      DPTR
                ENDIF
                               ENDM

WAIT                    MACRO
                        MOV      A,#0x01
                        MOVX   @DPTR,A
                        MOVX   A,@DPTR
                        JB       ACC.0,$-1
                               ENDM

//NOMOD51 SET (SMALL) DEBUG EP
//SET (SMALL) DEBUG EP
; 特殊功能寄存器和位
P_SW2        DATA        0BAH                   ; Bit7: EAXFR
ACC                DATA    0E0H
B                DATA    0F0H
PSW                DATA    0D0H
SP                DATA    81H
DPL                DATA    82H
DPH                DATA    83H
IE                DATA    0A8H
OV        BIT           0D0H.2
P                BIT           0D0H.0
F0                BIT        0D0H.5
F1                BIT           0D0H.1
RS1        BIT           0D0H.4
RS0        BIT           0D0H.3
AC        BIT           0D0H.6
CY        BIT           0D0H.7
EA        BIT           0A8H.7
; MODE= 1, 右移(clock:3-18);MODE= 2, 左移(clock:3-18);MODE= 3, 数据规格化(clock:3-20)
; MODE= 4, 16位乘法(clock:10);MODE= 5, 16位除法(clock:9);MODE= 6, 32位/16位(clock:17)
ARCON   DATA        0FCF6H                   ; Bit: MODE,   Bit: SC
OPCON        DATA        0FCF7H                   ; Bit6: MDOV,Bit1: RST,Bit0: ENOP
MD3   DATA        0FCF0H
MD2                DATA        0FCF1H
MD1   DATA        0FCF2H
MD0                DATA        0FCF3H
MD5   DATA        0FCF4H
MD4                DATA        0FCF5H


?PR?_UIDIV?UIDIV SEGMENT CODE         
PUBLIC ?C?UIDIV
RSEG?PR?_UIDIV?UIDIV

?C?UIDIV:
                        CLR_EA
                        MOV      DPTR, #MD1
                        LD_MD    R6, +1
                        LD_MD    R7, +1
                        LD_MD    R4, +1
                        LD_MD    R5, +1
//                        MOV      DPTR,#ARCON
                        LD_MD       #0xA0, +1                           // 16位/16位除法(clock:9)
                        WAIT
                        MOV       DPTR, #MD1
                        ST_MD    R6, +1
                        ST_MD    R7, +1
                        ST_MD    R4, +1
                        ST_MD    R5,0
                        SETB_EA
                        RET
               
                        END

angmall 发表于 2025-8-25 23:06:26

8H系列/8G系列, MDU16 V3.0 LIB 库使用说明
MDU16 V3.0 LIB 库使用说明

页: 1 [2]
查看完整版本: 16位乘除法器,是什么