📄 des11.s43
字号:
#include <msp430x13x.h> // Standard Equations
NAME getsptr
PUBLIC getsptr
PUBLIC E_kuozh
PUBLIC L_shift
PUBLIC S_Box_A
EXTERN sptr ;Stack pointer variable declared in C file
EXTERN ls1
EXTERN ls2
EXTERN R_jicun
EXTERN lun
EXTERN Rotable_A
EXTERN C_jicun
EXTERN D_jicun
EXTERN S
RSEG CODE
getsptr:
mov SP,&sptr ;Copy the current stack pointer.
ret
//E扩张运算,已知数据存R_jicun内,结果存于ls2,8个字节
E_kuozh:
MOV #06,R13 ;占用8个字节
E_kuozh_1
CLR ls2(R13)
DECD R13
JC E_kuozh_1 ;对缓冲区清另
MOV.B #03,R13
E_kuozh_2
MOV R13,R15
RLA.B R15 ;目标地址为序号*2
MOV R15,R14
MOV.B R_jicun(R13),R12 ;取得Ri的数据
RRA.B R12 ;右移后赋值
RRA.B R12 ;右移后赋值
RRA.B R12 ;右移后赋值
AND.B #01EH,R12 ;先取高4位
BIS.B R12,ls2(R15) ;完成低位字节,
BIT.B #010H,R12 ;查原位0为1否
JNC E_kuozh_3
DEC.B R14
AND.B #007H,R14 ;防止溢出
BIS.B #001H,ls2(R14) ;置位低位重复位
E_kuozh_3
INC.B R15 ;指向高位字节
BIT.B #002H,R12 ;查原位3为1否
JNC E_kuozh_4
BIS.B #020H,ls2(R15) ;置位高位重复位
E_kuozh_4 ;完成低位字节,再进行高位字节
MOV R15,R14
MOV.B R_jicun(R13),R12 ;取得Ri的数据
RLA.B R12 ;左移一位后取值
AND.B #01EH,R12 ;取低位作为高4位
BIS.B R12,ls2(R15) ;完成高位字节,
BIT.B #010H,R12 ;查原位0为1否
JNC E_kuozh_5
DEC.B R14
BIS.B #001H,ls2(R14) ;置位低位重复位
E_kuozh_5
INC.B R15 ;指向高位字节
AND.B #007H,R15 ;防止溢出
BIT.B #002H,R12 ;查原位3为1否
JNC E_kuozh_6
BIS.B #020H,ls2(R15) ;置位高位重复位
E_kuozh_6 ;完成高位字节
DEC.B R13
JC E_kuozh_2 ;总计4个字节,完成后返回
RET
L_shift: ;移动操作,根据lun的标志,左移相应的位数
;占用ls1
PUSH R10
MOV.B lun,R12 ;取得轮次
MOV.B Rotable_A(R12),R13 ;得到相应的移动次数
MOV &C_jicun,R10
MOV &C_jicun+2,R12
MOV &D_jicun,R14
MOV &D_jicun+2,R15 ;先放到缓冲区
SWPB R10
SWPB R12
SWPB R14
SWPB R15
L_shift_1: ;R13=0--移动次数
RLA R15
RLC R14
JNC L_shift_2
BIS #BIT4,R15
L_shift_2
RLA R12
RLC R10
JNC L_shift_3
BIS #BIT4,R12
L_shift_3
DEC.B R13
JNZ L_shift_1 ;完成所需的移动
SWPB R10
SWPB R12
MOV R10,ls1
MOV R12,ls1+2
MOV.B #03H,R13
L_shift_4
CLRC
RRC R14
RRC R15 ;将最低4位空出
DEC.B R13
JC L_shift_4 ;完成所需的移动
MOV R14,R10
MOV R15,R12
SWPB R14
SWPB R15
BIS.B R14,ls1+3 ;将C\D2个寄存器的数据合并
MOV.B R10,ls1+4
MOV.B R15,ls1+5
MOV.B R12,ls1+6 ;这样就占用7个字节
POP R10
RET
S_Box_A: ;将ls2数据经S盒置换函数
MOV.B #07H,R14
S_Box_A_1:
MOV.B R14,R13 ;首先得到所在的字节序
SWPB R13 ;计算地址,序号*40H
RRA R13
RRA R13 ;得到S盒的相对地址
MOV.B ls2(R14),R15
AND.B #01EH,R15 ;R15的高6位地址作为低位
RRA.B R15
BIT.B #BIT0,ls2(R14) ;开始计算高位地址
JNC S_Box_A_2
BIS.B #BIT4,R15 ;右端为1,置位
S_Box_A_2
BIT.B #BIT5,ls2(R14) ;开始计算高位地址
JNC S_Box_A_3
BIS.B #BIT5,R15 ;左端为1,置位
S_Box_A_3: ;已经获得地址,进行S盒置换
ADD R13,R15
MOV.B S(R15),ls2(R14) ;获得S盒数据置换
DEC.B R14
JC S_Box_A_1 ;完成8个字节
CLR.B R14 ;开始合并数据
S_Box_A_4:
MOV.B R14,R15
RLA.B R15 ;偶数地址为低位
MOV.B ls2(R15),R13 ;低位地址到高位
RLA.B R13
RLA.B R13
RLA.B R13
RLA.B R13
INC.B R15 ;奇数地址为高位
BIS.B ls2(R15),R13 ;合并为一个字节
MOV.B R13,ls2(R14) ;送到相应的地址0--3
INC.B R14
CMP.B #04H,R14
JNC S_Box_A_4 ;完成4个字节
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -