汇编语言中无法修改变量怎么办?代码无报错但变量未更新
问题分析与修复方案
嘿,你的代码问题其实很明确——ECX寄存器根本没拿到你输入的字符,再加上对引用类型的汇编操作没搞对,所以变量始终没变化。咱们来一步步解决:
核心问题1:ECX从未被初始化
你的汇编逻辑上来就直接比较ECX,但此时ECX里的内容是随机的(可能是之前函数调用留下的垃圾值),完全不是a_character里存储的用户输入字符。必须先把a_character的当前值加载到ECX,再做后续的加密判断。
核心问题2:引用类型的汇编操作错误
a_character是char&(引用),底层本质是指针。你直接写mov a_character, ecx,其实是把ECX的值覆盖了引用变量本身(也就是指针地址),而不是修改引用指向的实际字符内存。得先拿到引用的地址,再通过指针去修改目标值。
修复后的完整代码
void get_char(char& a_character) { a_character = (char)_getwche(); if (a_character == '\r' || a_character == '\n') // 修正转义字符的标准写法 { a_character = dollarchar; } __asm { mov eax, a_character ; 拿到引用的地址(因为引用是指针) mov cl, [eax] ; 读取实际的char值到CL(ECX低8位,char是1字节) movzx ecx, cl ; 零扩展到32位ECX,避免高位残留垃圾值影响比较 cmp ecx, '['; jb RANGE_C; jge RESUME; RANGE_C: cmp ecx, '@'; ja LOWER; jle RESUME; LOWER: ADD ecx, 32 JMP RESUME; RESUME: mov [eax], cl ; 将处理后的字符写回引用指向的内存位置 } }
关键修改点解释
- 正确读取引用指向的字符:先用
mov eax, a_character获取引用的地址,再通过[eax]访问实际存储字符的内存,读到CL里(因为char是8位,用CL足够,不会浪费寄存器)。 - 零扩展到ECX:
movzx ecx, cl把8位的CL值扩展为32位的ECX,高位补0,这样后续的比较操作不会因为ECX高位的垃圾值而出错。 - 正确写回结果:
mov [eax], cl把处理后的字符写回引用指向的内存,而不是覆盖引用变量本身,这样a_character的值才会真正被修改。
另外,原代码里的回车换行符写法' '和' '不太规范,改成标准的转义字符'\r'和'\n',代码可读性更好,也能避免编译器的解析问题。
内容的提问来源于stack exchange,提问作者Tom Wragg
相关产品推荐
相关产品推荐

