LDR STR B H S

本文详细解释了在计算机科学中如何通过不同后缀(B, H, S)来表示字节、半字和有符号数的传输过程,深入浅出地介绍了其在编程实践中的应用。

加上后缀  B 表示传送一个字节

加上后缀 H表示传送一个半字 即两个字节

加上后缀 S表示传送有符号数

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 结合这段代码说明一下如何体现实验结果的
11-05
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值