AREA RESET, DATA, READONLY
EXPORT __Vectors
__Vectors
DCD 0x20005000 ; Top of Stack
DCD Reset_Handler ; Reset Vector
AREA DATA_SEG, DATA, READWRITE
ALIGN 2
; 固定密钥(8字节)
Key DCB 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88
Hash_Init DCD 0x12345678
; 测试用例1:空字符串
TestStr1 DCB 0
Str1Len EQU 0
; 测试用例2:"HelloWorld"
TestStr2 DCB "HelloWorld", 0
Str2Len EQU 10
; 测试用例3:"ArmAsm123!"
TestStr3 DCB "ArmAsm123!", 0
Str3Len EQU 10
; 加密缓冲区
EncBuf1 SPACE 11
EncBuf2 SPACE 11
EncBuf3 SPACE 11
; 凯撒加密缓冲区
CaesarBuf1 SPACE 11
CaesarBuf2 SPACE 11
CaesarBuf3 SPACE 11
; 整型数组用于校验和测试(示例数据)
DataArray DCD 0x12345678, 0xABCDEF01, 0x98765432, 0xFEDCBA98
ArrayLen EQU 4
CheckSum1 DCD 0 ; 发送方校验和
CheckSum2 DCD 0 ; 接收方校验和
AREA CODE_SEG, CODE, READONLY
THUMB
REQUIRE8
PRESERVE8
EXPORT Reset_Handler
Reset_Handler
BL main
B .
; -------------------------- XOR 加密/解密 --------------------------
; R0=数据地址, R1=长度, R2=密钥地址 → 返回 R0=结果地址
XOR_Crypto
PUSH {R4-R7, LR}
MOV R4, R0 ; 数据基址
MOV R5, R1 ; 长度
MOV R6, R2 ; 密钥地址
MOV R7, #0 ; 索引 i = 0
XOR_Loop
CMP R7, R5
BGE XOR_End
LDRB R3, [R4, R7] ; byte = data[i]
AND R1, R7, #7 ; key_index = i % 8
LDRB R2, [R6, R1] ; key_byte
EOR R3, R3, R2 ; encrypted = byte ^ key_byte
STRB R3, [R4, R7] ; 存回
ADD R7, R7, #1
B XOR_Loop
XOR_End
MOV R0, R4
POP {R4-R7, PC}
; -------------------------- 哈希函数 --------------------------
; R0=字符串地址 → 返回 R0=哈希值
Hash_Function
PUSH {R4-R6, LR}
LDR R4, =Hash_Init
LDR R4, [R4] ; hash = 0x12345678
MOV R5, R0 ; 字符串地址
MOV R6, #0 ; i = 0
Hash_Loop
LDRB R1, [R5, R6] ; char = str[i]
CMP R1, #0
BEQ Hash_End
; hash = (hash * 31 + char) & 0xFFFFFFFF
MOV R2, R4, LSL #5 ; hash << 5 = hash * 32
SUB R2, R2, R4 ; R2 = hash * 31
ADD R4, R2, R1 ; hash = hash*31 + char
ADD R6, R6, #1
B Hash_Loop
Hash_End
MOV R0, R4 ; 返回哈希值
POP {R4-R6, PC}
; -------------------------- 字符串复制 --------------------------
; R0=源, R1=目标, R2=长度
CopyString
PUSH {R3-R5, LR}
MOV R5, #0
Copy_Loop
CMP R5, R2
BGE Copy_End
LDRB R3, [R0, R5]
STRB R3, [R1, R5]
ADD R5, R5, #1
B Copy_Loop
Copy_End
MOV R3, #0
STRB R3, [R1, R2] ; 添加 '\0'
POP {R3-R5, PC}
; -------------------------- 凯撒密码(增强版)--------------------------
; R0=字符串地址, R1=长度, R2=偏移量 → 修改原地
CaesarCipher
PUSH {R4-R6, LR}
MOV R4, R0 ; 字符串地址
MOV R5, R1 ; 长度
MOV R6, R2 ; 偏移量 offset
AND R6, R6, #25 ; 确保 offset ∈ [0,25]
Caesar_Loop
CMP R1, #0
BEQ Caesar_Done
LDRB R0, [R4] ; 当前字符
; 判断是否大写字母 A-Z (65-90)
CMP R0, #'A'
BLT Check_Lower
CMP R0, #'Z'
BGT Check_Lower
; 大写处理: (c - 'A' + offset) % 26 + 'A'
SUB R0, R0, #'A'
ADD R0, R0, R6
AND R0, R0, #25 ; mod 26
ADD R0, R0, #'A'
STRB R0, [R4]
B Next_Char
Check_Lower
CMP R0, #'a'
BLT Next_Char
CMP R0, #'z'
BGT Next_Char
; 小写处理: (c - 'a' + offset) % 26 + 'a'
SUB R0, R0, #'a'
ADD R0, R0, R6
AND R0, R0, #25
ADD R0, R0, #'a'
STRB R0, [R4]
Next_Char
ADD R4, R4, #1 ; 移动到下一字符
SUB R1, R1, #1
B Caesar_Loop
Caesar_Done
POP {R4-R6, PC}
; -------------------------- 校验和计算 --------------------------
; R0=数组地址, R1=元素个数 → R0=校验和(低32位)
Checksum
PUSH {R2, R3, LR}
MOV R2, #0 ; sum = 0
Chk_Loop
CMP R1, #0
BEQ Chk_Done
LDR R3, [R0], #4 ; 读取32位并后移指针
ADD R2, R2, R3 ; 累加
SUB R1, R1, #1
B Chk_Loop
Chk_Done
MOV R0, R2 ; 返回校验和
POP {R2, R3, PC}
; -------------------------- 校验和比较 --------------------------
; R0=chk1, R1=chk2 → 相等返回1,否则0
VerifyChecksum
CMP R0, R1
MOVEQ R0, #1
MOVNE R0, #0
BX LR
; -------------------------- 主函数 ------------------
main
; === 测试 XOR 与 Hash ===
; (同前略)...
; === 测试用例1:空字符串 ===
LDR R0, =TestStr1
LDR R1, =EncBuf1
LDR R2, =Str1Len
BL CopyString
LDR R0, =EncBuf1
LDR R1, =Str1Len
LDR R2, =Key
BL XOR_Crypto ; 加密
BL XOR_Crypto ; 解密
LDR R0, =TestStr1
BL Hash_Function ; R0 返回哈希值
; === 测试用例2:"HelloWorld" ===
LDR R0, =TestStr2
LDR R1, =EncBuf2
MOV R2, #Str2Len
BL CopyString
LDR R0, =EncBuf2
MOV R1, #Str2Len
LDR R2, =Key
BL XOR_Crypto
BL XOR_Crypto
LDR R0, =TestStr2
BL Hash_Function
; === 测试用例3:"ArmAsm123!" ===
LDR R0, =TestStr3
LDR R1, =EncBuf3
MOV R2, #Str3Len
BL CopyString
LDR R0, =EncBuf3
MOV R1, #Str3Len
LDR R2, =Key
BL XOR_Crypto
BL XOR_Crypto
LDR R0, =TestStr3
BL Hash_Function
; === 测试凯撒密码 ===
; 测试1:空字符串
LDR R0, =TestStr1
LDR R1, =CaesarBuf1
LDR R2, =Str1Len
BL CopyString
LDR R0, =CaesarBuf1
LDR R1, =Str1Len
MOV R2, #3 ; 偏移量=3
BL CaesarCipher ; 加密
MOV R2, #23 ; 解密(-3 ≡ 23 mod 26)
BL CaesarCipher ; 应恢复原文
; 测试2:"HelloWorld" → "KhoorZruog"
LDR R0, =TestStr2
LDR R1, =CaesarBuf2
MOV R2, #Str2Len
BL CopyString
LDR R0, =CaesarBuf2
MOV R1, #Str2Len
MOV R2, #3
BL CaesarCipher ; 加密
MOV R2, #23
BL CaesarCipher ; 解密验证
; 测试3:"ArmAsm123!" → "DupDvp123!"
LDR R0, =TestStr3
LDR R1, =CaesarBuf3
MOV R2, #Str3Len
BL CopyString
LDR R0, =CaesarBuf3
MOV R1, #Str3Len
MOV R2, #3
BL CaesarCipher
MOV R2, #23
BL CaesarCipher
; === 测试校验和 ===
LDR R0, =DataArray
LDR R1, =ArrayLen
LDR R1, [R1]
BL Checksum
STR R0, [sp, #-4]! ; 临时保存发送方校验和
LDR R1, =CheckSum1
STR R0, [R1] ; 保存
; 模拟接收端重新计算
LDR R0, =DataArray
LDR R1, =ArrayLen
LDR R1, [R1]
BL Checksum
LDR R1, =CheckSum2
STR R0, [R1]
; 比较校验和
LDR R0, =CheckSum1
LDR R1, =CheckSum2
LDR R0, [R0]
LDR R1, [R1]
BL VerifyChecksum ; R0 = 1 表示一致
Loop
B Loop ; 死循环
END
结合这段代码说明一下如何体现实验结果的