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
第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
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
8H系列/8G系列, MDU16 V3.0 LIB 库使用说明
MDU16 V3.0 LIB 库使用说明
页:
1
[2]