1,指令汇集?(个人总结)
?典型示例代码:
//*************************************************************
//名称:两位双字节进制数相乘
// (R7)(R6)=(R7)*2^8+(R6)
//(R5)(R4)=(R5)*2^8+(R4)
//(R7)(R6)*(R5)(R4)=(R7)*(R5)*2^16+(R7)*(R4)*2^8+(R6)*(R5)*2^8+(R6)*(R4)
//***************************************************************
DATA1 EQU 35H //用于暂存可能进位
DATA2 EQU 36H
TEST EQU 37H
ORG 0000H
AJMP MAIN
ORG 0030H
MOV 30H,#00H ;0-7
MOV 31H,#00H ;8-15
MOV 32H,#00H ;16-23
MOV 33H,#00H ;24-31
MAIN:
.............
MULTIPLY:
CLR C
MOV R1,30H //用于间接寻址
MOV A, R6
MOV A, R4
MUL AB
MOV @R1, A //7-0已存好 ????MOV 30H, A
MOV DATA1, B //(R4)*(R6)暂存计算的15-8位
MOV A, R7
MOV B, R4
MUL AB
ADD A ,DATA1 //此时15-8位相加可能有溢出进位
MOV DATA1, A //加完在暂存
MOV DATA2, B //暂存23-16位
MOV A, DATA2
ADDC A, #00H
MOV DATA2, A //一系列的步骤就是回应在15-8中有相加的进位端,暂存23-16
MOV A, R6
MOV B, R5
MUL AB
ADD A, DATA1 //仍然是15-8的加法
INC R1
MOV @R1, A //15-8已存放?????MOV 31H, A
MOV A, DATA2 //23-16位上个
ADDC A, B
MOV DATA2, A // 再暂存23-16
MOV TEST,00H
PICK: JNC NEXT //因为CY也就是C的值是根据ADD或ADDC变化而变化,只要没进位就清零
MOV TEST,01H //这也导致了不能出现两个情况的数相加,而下面又有个相加的
NEXT:
MOV A, R7
MOV B, R5
MUL AB //(R7)(R5)
ADD A, DATA2 //上个加法可能进位,现判断是否进位23-16
INC R1
MOV @R1, A //已存放23-16????MOV 32H, A
MOV A ,B
ADDC A, #00H //先进位,后面相加的
ADDC A, TEST
INC R1
MOV @R1, A // 已存放31-24位?????MOV 33H, A
RET
//*************************************************************
//名称:8位2进制数转换BCD码
//何为BCD码:就是把一个数转换成@#¥
//其中@为0-9但是要用4位二进制数表示(在51情况)这里BCD1存放百位
//其中#为0-9但是要用4位二进制数表示(在51情况)这里BCD0 高四位存放十位
//其中¥为0-9但是要用4位二进制数表示(在51情况)这里BCD0低四位存放个位
//转换思想:把8位二进制数看成一个十进制处理
//***************************************************************
8BIT EQU 40H
BCD0 EQU 41H
BCD1 EQU 42H
BCD2 EQU 43H
TRANSFORM:
MOV A, 40H
MOV B, #100
DIV AB
MOV BCD2, A
MOV A, B
MOV B, #10
DIV AB ///计算完了之后,A为0000 xxxx B为 0000 xxxx
SWAP A ;因为A为十位,所以要移到高四位
ADD A, B
MOV BCD0 ,A
RET
?
|