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

汇编语言字符串比较报错:0xC0000005 读取位置0x00000043访问违例

排查汇编菜单代码中的0xC0000005访问违例错误

先直接戳破问题根源:你看到的0xC0000005访问违例,读取地址0x00000043——这个0x43刚好是字符'C'的ASCII码,而你代码里定义的letterC DWORD "C"就是罪魁祸首!

问题出在哪?

在x86汇编里,当你写DWORD "C"时,汇编器会把字符串字面量"C"转换成它的ASCII值0x43,所以letterC这个DWORD变量实际存储的是0x00000043。

如果你的后续代码里,把letterC当成了内存指针来使用(比如错误地对它做了解引用操作,或者用它来指向要比较的字符串),CPU就会尝试去读取地址0x00000043的内存——这个地址属于系统保留的低地址空间,完全没有可访问的有效内存,直接触发访问违例。

怎么修复?

根据你的实际需求选对应的方案:

  1. 如果letterC是用来存储字符'C'的值(不是指针):

    • 单个字符只需要1字节,把定义改成:
      letterC BYTE 'C'
      
    • 要是必须用DWORD类型(比如和其他DWORD变量统一),就明确写ASCII值:
      letterC DWORD 0x00000043
      
    • 后续比较时,直接使用这个变量的值,不要把它当作指针去访问内存。
  2. 如果letterC是指向字符串"C"的指针:

    • 先定义字符串(注意要加终止符,方便字符串比较),再把地址赋值给指针:
      cStr BYTE "C", 0  ; 带终止符的字符串
      letterC DWORD OFFSET cStr  ; 存储字符串的内存地址
      

额外检查点

除了上面的核心问题,也顺便检查下ReadConsoleA的调用是否合规:

  • 确保第四个参数(接收实际读取字符数的变量)是有效的DWORD指针,比如你得先定义一个bytesRead DWORD ?,然后传ADDR bytesRead,不能传立即数或者无效地址。
  • 读取输入后,记得处理缓冲区里的回车换行符(ReadConsoleA会把用户按下的回车、换行也读进缓冲区),否则和硬编码选项比较时会因为多余字符匹配失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:37:43