汇编语言字符串比较报错:0xC0000005 读取位置0x00000043访问违例
排查汇编菜单代码中的0xC0000005访问违例错误
先直接戳破问题根源:你看到的0xC0000005访问违例,读取地址0x00000043——这个0x43刚好是字符'C'的ASCII码,而你代码里定义的letterC DWORD "C"就是罪魁祸首!
问题出在哪?
在x86汇编里,当你写DWORD "C"时,汇编器会把字符串字面量"C"转换成它的ASCII值0x43,所以letterC这个DWORD变量实际存储的是0x00000043。
如果你的后续代码里,把letterC当成了内存指针来使用(比如错误地对它做了解引用操作,或者用它来指向要比较的字符串),CPU就会尝试去读取地址0x00000043的内存——这个地址属于系统保留的低地址空间,完全没有可访问的有效内存,直接触发访问违例。
怎么修复?
根据你的实际需求选对应的方案:
如果
letterC是用来存储字符'C'的值(不是指针):- 单个字符只需要1字节,把定义改成:
letterC BYTE 'C' - 要是必须用DWORD类型(比如和其他DWORD变量统一),就明确写ASCII值:
letterC DWORD 0x00000043 - 后续比较时,直接使用这个变量的值,不要把它当作指针去访问内存。
- 单个字符只需要1字节,把定义改成:
如果
letterC是指向字符串"C"的指针:- 先定义字符串(注意要加终止符,方便字符串比较),再把地址赋值给指针:
cStr BYTE "C", 0 ; 带终止符的字符串 letterC DWORD OFFSET cStr ; 存储字符串的内存地址
- 先定义字符串(注意要加终止符,方便字符串比较),再把地址赋值给指针:
额外检查点
除了上面的核心问题,也顺便检查下ReadConsoleA的调用是否合规:
- 确保第四个参数(接收实际读取字符数的变量)是有效的DWORD指针,比如你得先定义一个
bytesRead DWORD ?,然后传ADDR bytesRead,不能传立即数或者无效地址。 - 读取输入后,记得处理缓冲区里的回车换行符(
ReadConsoleA会把用户按下的回车、换行也读进缓冲区),否则和硬编码选项比较时会因为多余字符匹配失败。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

