汇编实现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指令,但汇编基础薄弱,不知道具体修复方法。
修复方案
问题根源
当前实现存在两个核心错误:
- 参数传递逻辑错误:依赖全局变量
simbol和gamma传递参数,但C++函数fun_cipher_gamma每次调用都会传入不同字符,全局变量无法同步实时参数值,导致汇编函数拿到的并非当前需要加密的字符。 - 结果返回逻辑错误:汇编函数将计算结果存入全局变量
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
相关产品推荐
相关产品推荐

