You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 21:47:03