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

汇编实现C++伽马序列字符串加密XOR函数返回值问题求助

伽马序列加密功能的汇编函数修复问题

问题背景

在实现伽马序列加密字符串的功能时,遇到汇编语言函数无法返回正确结果的问题,相关代码如下:

C++调用代码

cout << "\ncipher with code: ";
for (register int i = 0; i < str.length(); i++) {
    str[i] = fun_cipher_gamma(str[i], gamma[i]);
    cout << str[i];
}
cout << endl;

C++函数定义

char fun_cipher_gamma(register char simbol, register char gamma)
{
    char result = ' ';
    funct();
    return result;
}

汇编实现代码

.MODEL FLAT, C
.STACK 256
.DATA

.CODE

    EXTRN gamma : BYTE
    EXTRN simbol : BYTE
    EXTRN result : BYTE

PUBLIC funct
funct PROC far

    mov al, simbol        
    mov bl, gamma         
    xor al, bl            
    mov result, al        
    retn

funct ENDP
END

补充信息

  • 原本正常运行的C++逻辑:return btowc(simbol) ^ btowc(gamma);
  • 已在.cpp文件中添加外部声明:
extern "C" char funct(void);
extern "C" unsigned char gamma = ' ';
extern "C" unsigned char simbol = ' ';
extern "C" unsigned char result = ' ';

调试后确认汇编函数无法返回正确结果,猜测可能需要使用push指令,但汇编基础薄弱,不知道具体修复方法。


修复方案

问题根源

当前实现存在两个核心错误:

  1. 参数传递逻辑错误:依赖全局变量simbol和gamma传递参数,但C++函数fun_cipher_gamma每次调用都会传入不同字符,全局变量无法同步实时参数值,导致汇编函数拿到的并非当前需要加密的字符。
  2. 结果返回逻辑错误:汇编函数将计算结果存入全局变量result,但C++函数仅初始化result = ' ',并未读取全局变量中计算后的结果,最终返回初始值而非加密结果。

正确实现方式

遵循C语言调用约定(因汇编指定.MODEL FLAT, C),通过栈传递参数,利用EAX寄存器返回结果,无需全局变量。

修改后的汇编代码

.MODEL FLAT, C
.STACK 256
.CODE

PUBLIC funct
funct PROC
    ; C调用约定:第一个参数在[ebp+8],第二个参数在[ebp+12]
    push ebp
    mov ebp, esp

    mov al, BYTE PTR [ebp+8]   ; 获取第一个参数simbol
    xor al, BYTE PTR [ebp+12]  ; 与第二个参数gamma执行异或运算
    ; 结果存储在al(EAX低8位),符合C调用约定的返回值规则

    pop ebp
    ret
funct ENDP
END

修改后的C++函数

char fun_cipher_gamma(register char simbol, register char gamma)
{
    // 直接传递参数并接收汇编函数的返回值
    return funct(simbol, gamma);
}

移除冗余全局变量

删除.cpp文件中多余的全局变量声明,仅保留函数声明:

extern "C" char funct(char simbol, char gamma);

关键说明

  • C调用约定下,函数参数从右往左压入栈,第一个参数位于栈帧的ebp+8位置(ebp自身占4字节,返回地址占4字节)。
  • 字符类型为1字节,需用BYTE PTR访问栈上的参数。
  • 对于char/int这类小类型返回值,C调用约定规定存入EAX寄存器,汇编中直接将结果存在al(EAX低8位)即可,C++会自动读取EAX作为返回值。
  • 修改后,每次调用fun_cipher_gamma时,当前的simbol和gamma会正确传递给汇编函数,计算后返回正确的异或加密结果。

内容的提问来源于stack exchange,提问作者KoraOnEarth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 15:05:19