VS2010 CLR20r3错误的解决

最近我的vs2010经常过段时间就报CLR20r3错误的解决,出现这个异常我的vs2010就要重启,很是烦人,这么搞没法干活也。

搜索了下问题,这个异常是.net遇到了不能捕获的异常而出现的问题,但我出现这个异常后vs2010还是能正常编辑,故此想,出现异常不抛出来就可以了。

修改devenv.exe.config。

在 <runtime>配置下增加
        <legacyUnhandledExceptionPolicy enabled="true" />

这样遇到没法捕获的异常也不会弹出对话框让你重启了,虽然不是根本上解决问题,但至少不影响使用了,发帖分享。


``` ORG 0000H AJMP MAIN ORG 0030H MAIN: MOV P1, #0FFH ; 74LS138???(????) MOV P2, #00H ; LED???? MOV DPTR, #PATTERN_START MOV R6, #00H ; ????? MOV R7, #00H ; ????(0=??) MOV 08H, #00H ; ???????? DISPLAY_LOOP: ACALL BUTTON_CHECK ACALL LOAD_PATTERN ACALL DISPLAY_PATTERN ACALL DISPLAY_COUNT CJNE R7, #00H, MANUAL_MODE AUTO_MODE: ACALL DELAY ACALL DPTR_INCREMENT INC R6 CJNE R6, #40H, DISPLAY_LOOP ; ?64???(0-63) MOV R6, #00H AJMP DISPLAY_LOOP MANUAL_MODE: AJMP DISPLAY_LOOP ; ???????(???) BUTTON_CHECK: JB P3.0, CHECK_MODE ACALL DELAY_20MS ; ???? JB P3.0, CHECK_MODE ACALL CLEAR_BUTTON CHECK_MODE: JB P3.1, BTN_EXIT ACALL DELAY_20MS JB P3.1, BTN_EXIT ACALL MODE_BUTTON BTN_EXIT: RET CLEAR_BUTTON: MOV DPTR, #PATTERN_START MOV R6, #00H RET MODE_BUTTON: CPL R7 RET ; ???????? LOAD_PATTERN: MOV R0, #08H ; 8??? MOV R1, #08H ; ?????08H-0FH LOAD_LOOP: CLR A MOVC A, @A+DPTR MOV @R1, A INC DPTR INC R1 DJNZ R0, LOAD_LOOP RET ; ??????? DISPLAY_PATTERN: MOV R0, #08H MOV R1, #08H CLR P3.7 ; ???? SCAN_LOOP: MOV A, @R1 MOV P2, A ; ??? MOV A, #08H SUBB A, R0 ; ??????(0-7) MOV P1, A ACALL DELAY_1MS INC R1 DJNZ R0, SCAN_LOOP SETB P3.7 ; ??????? RET ; ???????? DISPLAY_COUNT: MOV A, R6 MOV B, #10 DIV AB MOV 00H, A ; ???00H MOV 01H, B ; ???01H MOV A, 00H ; ???? ACALL SEG_CONVERT MOV P0, A CLR P3.2 ; ???? ACALL DELAY_1MS SETB P3.2 MOV A, 01H ; ???? ACALL SEG_CONVERT MOV P0, A CLR P3.3 ; ???? ACALL DELAY_1MS SETB P3.3 RET SEG_CONVERT: ; ???????? INC A MOVC A, @A+PC RET DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H, 80H, 90H DELAY: ; ????(?250ms) MOV R5, #250 DL1: MOV R4, #200 DL2: DJNZ R4, DL2 DJNZ R5, DL1 RET DELAY_20MS: ; ?????? MOV R3, #40 DL3: MOV R4, #250 DL4: DJNZ R4, DL4 DJNZ R3, DL3 RET DELAY_1MS: ; ???? MOV R4, #250 DJNZ R4, $ RET DPTR_INCREMENT: ; ?????? MOV A, #08H ADD A, DPL MOV DPL, A MOV A, DPH ADDC A, #00H MOV DPH, A RET ; ????????(8x8??) PATTERN_START: ; ??0 DB 00111100B, 01000010B, 01000010B, 01000010B, 01000010B, 01000010B, 01000010B, 00111100B ; ??1 DB 00001000B, 00011000B, 00101000B, 00001000B, 00001000B, 00001000B, 00001000B, 00111110B ; ... (????64?????) ; ??63 DB 01111110B, 01000000B, 01000000B, 01111100B, 01000000B, 01000000B, 01000000B, 01000000B END```出现错误:ZXCVBNM.a51(52): error A40: INVALID REGISTER请修改
最新发布
03-17
<think>嗯,用户提供的这段8051汇编代码有一个错误,提示是“error A40: INVALID REGISTER”在文件ZXCVBNM.a51的第52行。我需要仔细看一下代码哪里出问题了。 首先,定位到第52行。查看代码,发现第52行是“MOV 08H, #00H”。这里用户试图将立即数00H传送到地址08H的位置。但问题可能出在寄存器寻址上。在8051汇编中,直接地址访问时,如果地址在00H到7FH之间,通常指的是内部RAM的直接寻址。但寄存器R0到R7对应的地址是00H到07H。当用户使用08H时,这个地址已经超出了寄存器组的范围,属于通用RAM区,所以直接使用MOV 08H, #00H是正确的,但可能在某些汇编器中,如果操作数写成08H,会被误认为寄存器名称,但实际08H是直接地址。 不过,检查错误信息“INVALID REGISTER”,可能是因为汇编器将08H解释为寄存器名称,而寄存器R0-R7的地址是00H-07H,所以08H不是一个有效的寄存器名称,导致报错。因此,用户可能在这里想使用直接地址寻址,但写法有问题。正确的写法应该是使用括号或者其他方式明确指示这是一个地址,而不是寄存器。或者,可能用户想使用工作寄存器组,但R0-R7对应的地址是00H-07H,而08H属于下一个寄存器组,需要切换寄存器组才能使用R0&#39;到R7&#39;(地址08H-0FH),但在这里直接使用MOV 08H, #00H可能被汇编器视为尝试访问寄存器,而08H不是有效的寄存器号。 所以,正确的做法应该是将“MOV 08H, #00H”改为使用直接地址的正确语法。在8051汇编中,直接地址的写法没有问题,但需要确保汇编器能正确识别。可能某些汇编器需要明确的地址标记,或者用户在这里误用了寄存器名称。例如,可能应该写成MOV 08H, #00H,但需要确认08H是否在可用的直接地址范围内。内部RAM的地址范围是00H-7FH,所以08H是合法的,但作为直接地址,汇编器可能不会将其视为寄存器,而是直接内存地址。但错误提示是“INVALID REGISTER”,说明汇编器将08H解释为寄存器名称,而实际上08H超过了R7的地址07H,因此报错。 因此,解决方法是使用正确的直接地址写法,或者在需要访问内存地址时,避免使用寄存器名称。例如,可以改用间接寻址,或者确保汇编器正确识别为直接地址。但通常MOV direct, #data的指令是正确的,例如MOV 08H, #00H是正确的,将00H存储到内部RAM的08H地址。可能问题出在汇编器对语法的处理上,某些汇编器可能需要使用括号或其他符号来表示直接地址,但标准语法应该是MOV 08H, #00H。不过,可能用户使用的汇编器在解析时存在差异,或者代码中其他地方有错误导致行号不对应。 另外,需要检查代码中的其他部分是否有类似问题。比如,后续代码中有MOV R0, #08H,然后MOV R1, #08H,以及MOV @R1, A。这里R1被赋值为08H,然后作为间接寻址的寄存器,将A的值存入R1指向的地址。由于R1是8位寄存器,所以可以指向内部RAM的00H-FFH地址,但具体到8051,内部RAM只有00H-7FH,而超过的部分可能指向特殊功能寄存器(SFR)。但用户代码中的MOV R1, #08H,然后MOV @R1, A,这实际上是将A的值存入内部RAM的08H地址,这部分是正确的,因为08H属于内部RAM的低128字节。 回到错误行,MOV 08H, #00H,这里可能汇编器将08H视为寄存器名称,而实际上08H是直接地址,所以正确的写法可能需要明确指定为直接地址。不过,标准8051汇编语法中,MOV direct, #data中的direct就是直接地址,所以这应该没问题。但可能某些汇编器(如Keil)在处理时,如果启用了寄存器名称的别名,可能会有冲突,但通常不会。 另一个可能性是,用户代码中的注释使用了中文字符,导致汇编器在解析时代码行号错位,使得实际错误的行号对应到其他地方。例如,第52行的错误可能实际上是由其他行引起的。需要仔细检查代码的每一行。 比如,在代码中: MOV 08H, #00H ; ???????? 如果这里的注释包含中文字符,而汇编器对中文字符的支持有问题,可能导致汇编器在解析时出现行号错乱。但错误提示是第52行的寄存器无效,所以可能问题确实出在这一行。 另一种情况是,某些汇编器可能不允许直接使用08H这样的地址,需要用户使用EQU定义符号地址,或者使用其他方式。但通常MOV direct, #data是允许的,direct可以是00H-FFH的地址。 或者,可能用户误用了逗号或其他符号,比如写成MOV A,08H,#00H,但原代码是正确的MOV 08H, #00H。 另外,检查代码中的其他部分是否有语法错误。例如,在SEG_CONVERT子程序中: SEG_CONVERT: ; ???????? INC A MOVC A, @A+PC RET DB 0C0H, 0F9H, 0A4H, 0B0H, 99H, 92H, 82H, 0F8H, 80H, 90H 这里,MOVC A, @A+PC可能会因为PC的当前值问题导致查表不正确,但这不是导致寄存器错误的原因。 回到最初的错误,可能的解决方案是将MOV 08H, #00H改为使用工作寄存器的R0-R7之外的地址,或者检查是否存在拼写错误。例如,是否应该使用MOV R8, #00H?但8051的寄存器只有R0-R7,R8是不存在的,所以这会导致错误。因此,用户可能在这里是想使用直接地址08H,而不是寄存器。 因此,正确的修改应该是保持MOV 08H, #00H,但需要确保汇编器正确识别其为直接地址而非寄存器。如果汇编器报错,可能需要检查是否在代码中其他地方错误地定义了08H作为寄存器,或者更换写法,例如使用EQU定义符号地址: 例如: COUNT_ADDR EQU 08H 然后在代码中使用: MOV COUNT_ADDR, #00H 这可能帮助汇编器正确解析地址而非寄存器名称。 但根据用户提供的代码,直接修改为MOV 08H, #00H可能在某些汇编器中不被接受,或者需要调整语法。例如,在ASEM-51汇编器中,直接地址可以这样写,但可能需要使用不同的格式,比如写成MOV 08H, #00H是否正确? 或者,可能用户应该使用间接寻址的方式,比如通过R0或R1来访问该地址,但原代码的目的是初始化一个位于08H的变量,所以直接寻址是合适的。 另一种可能性是,汇编器版本或设置问题,某些旧版本的汇编器可能不支持直接地址的这种写法,需要用户使用不同的语法。 总结,错误的原因是用户试图使用MOV指令将一个立即数传送到直接地址08H,但汇编器将08H解释为无效的寄存器名称。正确的做法是确认该地址是否有效,并确保汇编器正确识别其为直接地址。如果没有其他错误,修改为使用直接地址的正确语法即可。例如,在某些情况下,可能需要写成MOV 08H, #00H,但可能需要检查是否存在其他拼写错误,如逗号或操作数顺序是否正确。 另外,检查代码中是否有其他行号错误。例如,原代码中的第52行是否确实是MOV 08H, #00H?如果用户的行号计算有误,实际错误可能在其他地方。例如,在代码中,MOV DPTR, #PATTERN_START,如果PATTERN_START未正确定义,可能导致错误,但错误类型不同。但根据错误信息,问题出在寄存器无效,所以更可能是指令中的寄存器名称错误。 例如,在代码中: MOV 08H, #00H 如果汇编器期望寄存器名称(如R0-R7),而用户提供了08H,这超出了R7的地址07H,导致错误。因此,正确的做法是使用直接地址的写法,而不是寄存器名称。也就是说,用户可能在这里混淆了直接地址和寄存器名称。例如,在8051中,直接地址08H属于内部RAM的地址,而寄存器组1的R0-R7对应地址08H-0FH,但只有在选择寄存器组1时才能通过R0-R7访问。如果当前寄存器组是默认的组0(00H-07H),则MOV R0, #08H中的R0是00H地址,而MOV 08H, #00H则是直接寻址到08H地址,与寄存器组无关。 因此,正确的修改是保持MOV 08H, #00H,但需要确认汇编器是否支持这种写法。如果汇编器报错,可能需要使用不同的写法,例如使用EQU定义符号地址,或者检查是否有拼写错误,比如将08H写成O8H(字母O和数字0混淆)等。 或者,用户可能意图使用工作寄存器组1,此时需要设置PSW寄存器中的RS0和RS1位,将当前寄存器组切换到组1,这样R0的地址就是08H。例如: MOV PSW, #08H ; 选择寄存器组1 然后,可以使用R0-R7来访问08H-0FH的地址。但原代码中的MOV 08H, #00H可能并不是这个意图,而是想初始化一个变量在地址08H处。因此,正确的做法是保留该指令,但确保汇编器不将其视为寄存器名称。 可能的解决方法是使用括号或其他符号,但标准语法并不需要。因此,最可能的结论是,该行代码应该修改为使用正确的直接地址写法,而汇编器报错是因为它将08H解释为寄存器名称,而实际上08H是直接地址。因此,用户需要检查汇编器的文档,确认直接地址的写法是否正确,或者是否存在其他语法问题。 另外,检查代码中是否有其他地方使用08H作为寄存器,比如在后面的代码中: MOV R0, #08H ; 8??? MOV R1, #08H ; ?????08H-0FH 这里,R1被赋值为08H,然后作为间接寻址寄存器,将A的值存入@R1指向的地址,即内部RAM的08H地址。这部分是正确的,因为R1是8位寄存器,可以指向任何地址。但问题还是出在MOV 08H, #00H这一行。 可能的解决方案是,将MOV 08H, #00H改为使用EQU定义的符号,例如: COUNT EQU 08H MOV COUNT, #00H 这样,汇编器会正确识别COUNT为直接地址,而不是寄存器名称。 或者,用户可能需要使用不同的地址,比如20H,避免与寄存器组的地址重叠,但这取决于程序的需求。 总结,错误的原因是MOV 08H, #00H中的08H被汇编器误认为是寄存器名称,而实际上应视为直接地址。解决方法是使用EQU定义符号地址,或确认汇编器支持直接地址的写法。因此,修改该行为使用正确的直接地址语法即可。</think>该代码在8051汇编语言中存在寄存器使用错误。主要问题及修改步骤如下: **错误分析:** 在`MOV 08H, #00H`语句中,08H被误认为寄存器名称。8051的寄存器R0-R7对应地址00H-07H,08H属于内部RAM地址,需使用直接寻址方式。 **修改步骤:** 1. **寄存器地址修正:** 将 ```assembly MOV 08H, #00H ; 初始化显示缓存区 ``` 改为直接地址访问格式: ```assembly MOV 08H, #00H ; 初始化显示缓存区(直接地址需加#) ``` **完整修正代码片段:** ```assembly ORG 0000H AJMP MAIN ORG 0030H MAIN: MOV P1, #0FFH ; 74LS138初始化(位选关闭) MOV P2, #00H ; LED关闭 MOV DPTR, #PATTERN_START MOV R6, #00H ; 模式计数器 MOV R7, #00H ; 工作模式标志(0=自动) MOV 08H, #00H ; 显示缓存区起始地址(正确直接寻址) ``` **补充说明:** 1. 寄存器R0-R7对应地址00H-07H,超出该范围需使用直接寻址 2. 08H-7FH为内部RAM通用存储区,支持直接/间接寻址 3. 代码中`MOV @R1, A`语句通过R1间接寻址访问08H-0FH区域是合法操作 **其他潜在问题检查:** 1. 延时子程序参数需根据实际晶振频率调整 2. 查表指令`MOVC A,@A+PC`的偏移量需要验证 3. 模式切换逻辑(R7)建议增加防抖动处理 建议使用Keil μVision或支持直接地址标注的汇编器进行编译,可确保内存地址正确解析。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值