8086汇编(TASM)实现TEA算法:如何拆分字节变量
解决8086 TASM中TEA算法的初始拆分问题
先纠正两个核心问题,再给出具体的拆分实现代码:
1. 修正数据段变量定义
问题点
- 你用
int 21h 0ah读取字符串时,缓冲区必须遵循固定格式:第一个字节是允许输入的最大字符数(不含回车),第二个字节是系统返回的实际输入长度,从第三个字节开始才是输入的字符串内容。原定义的plainText和key不符合该格式,会导致输入异常。 - TEA算法基于32位(4字节)字运算,
p1、p2、k0-k3应定义为双字(dd)而非单字节(db),才能直接参与后续32位运算。
修正后的变量定义
data segment plainTextPrompt db "Enter 8-byte plaintext: $" keyPrompt db "Enter 16-byte key: $" ; 明文输入缓冲区(符合int 21h 0ah格式:最大8字节输入) plainTextBuf db 9, ?, 8 dup('$') ; TEA运算用的两个32位明文块 p1 dd ? p2 dd ? ; 密钥输入缓冲区(符合int 21h 0ah格式:最大16字节输入) keyBuf db 17, ?, 16 dup('$') ; TEA运算用的四个32位密钥块 k0 dd ? k1 dd ? k2 dd ? k3 dd ? data ends
2. 拆分明文与密钥的代码实现
拆分8字节明文到p1、p2
从缓冲区第三个字节(plainTextBuf+2)开始,将前4字节复制到p1,后4字节复制到p2:
; 拆分明文:plainTextBuf+2的8字节 → p1(前4字节)、p2(后4字节) mov si, offset plainTextBuf + 2 ; 指向输入的明文内容 mov di, offset p1 mov cx, 4 ; 复制4字节到p1 rep movsb mov si, offset plainTextBuf + 6 ; 指向明文第5-8字节 mov di, offset p2 mov cx, 4 ; 复制4字节到p2 rep movsb
拆分16字节密钥到k0、k1、k2、k3
从密钥缓冲区第三个字节开始,每4字节一组复制到对应密钥变量:
; 拆分密钥:keyBuf+2的16字节 → k0-k3(各4字节) mov si, offset keyBuf + 2 mov di, offset k0 mov cx,4 rep movsb mov si, offset keyBuf + 6 mov di, offset k1 mov cx,4 rep movsb mov si, offset keyBuf + 10 mov di, offset k2 mov cx,4 rep movsb mov si, offset keyBuf + 14 mov di, offset k3 mov cx,4 rep movsb
3. 整合到加密过程的完整示例
proc encryptionSelection print plainTextPrompt inputString plainTextBuf ; 输入8字节明文 ; 拆分明文到p1、p2 mov si, offset plainTextBuf + 2 mov di, offset p1 mov cx,4 rep movsb mov si, offset plainTextBuf +6 mov di, offset p2 mov cx,4 rep movsb call printLine print keyPrompt inputString keyBuf ; 输入16字节密钥 ; 拆分密钥到k0-k3 mov si, offset keyBuf +2 mov di, offset k0 mov cx,4 rep movsb mov si, offset keyBuf +6 mov di, offset k1 mov cx,4 rep movsb mov si, offset keyBuf +10 mov di, offset k2 mov cx,4 rep movsb mov si, offset keyBuf +14 mov di, offset k3 mov cx,4 rep movsb ; 此处编写TEA加密逻辑 ret endp encryptionSelection ; 保留你的宏定义 macro inputString storage pusha mov ah, 0ah lea dx, storage int 21h popa endm inputString macro print value pusha mov ah, 09h mov dx, offset value int 21h popa endm print proc printLine pusha mov dl, 0dh mov ah, 02h int 21h mov dl, 0ah int 21h popa ret endp printLine
关键说明
rep movsb是8086高效字节复制指令,si为源地址、di为目标地址、cx为复制字节数,执行时自动递增地址直到cx归0。- 后续TEA运算时,直接用
mov eax, p1这类指令加载32位变量即可参与运算。
内容的提问来源于stack exchange,提问作者ChickenRei
相关产品推荐
相关产品推荐

