📄 keyexpansion.s
字号:
KeyExpansion
ldr r0,=Key; 取Key的地址
ldr r1,=RoundKey; 取扩展后的Roundkey的地址
ldr r7,=Sbox
ldr r8,=Rcon;
mov r2,#0x00; r2用来对i循环计数
expan_i
ldr r3,[r0,r2]; 取Key的4个字节
str r3,[r1,r2]; 放入RoundKey
add r2,r2,#0x04;
cmp r2,#0x10;
bne expan_i; 完成将Key以4字节为单位存入RoundKey
add r1,r1,#0x10;更新r1的值
mov r2,#0x00; r2用来计数j循环
expan_j
mov r3,#0x00; k计数
expan_k
ldr r4,[r1,#-0x04]; 取出W[i-1]
cmp r3,#0x00; 比较r3与0x00的大小
bne LABEL; 不相等的话跳到LABEL,相等执行下面的程序
mov r4,r4,ror #0x08; 完成RotByte的功能,即左循环一个字节
mov r6,#24
mov r9,#0x00
expan_l;
mov r0,r4,lsr r6; 将r4右逻辑循环r6位,目的在于每次取出r4的1个字节放入r0中,先取出最高的8字节
and r0,r0,#0xff; 将r0的高24位取零
ldrb r5,[r7,r0];取出s盒对应的字节
mov r9,r9,lsl #0x08
add r9,r9,r5
sub r6,r6,#0x08
cmp r6,#-0x08
bne expan_l
ldr r5,[r8]
add r8,r8,#0x04
eor r4,r5,r9; 完成轮常数加
LABEL
ldr r5,[r1,#-0x10]; 取出W[i-4]
eor r5,r5,r4; 将W[i-1]与W[i-4]异或,结果存入r5
str r5,[r1]; 将r5写入RoundKey中
add r1,r1,#0x04
add r3,r3,#0x04;
cmp r3,#0x10;
bne expan_k; 当r3不等于0x10时跳转到expan_k
add r2,r2,#0x01;
cmp r2,#0x0a; 比较生成的轮密钥是否为10轮和最后轮所需
bne expan_j;
mov pc,lr; 返回主程序
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -