为何MOV EAX, [COLOR1 + ECX*4]会触发timeout 7错误?求解决
汇编中使用
MOV EAX, [COLOR1 + ECX*4]导致超时错误的解决方法 核心问题排查与修复
1. LEVEL值加载错误
你当前用MOV ECX, LEVEL是将LEVEL的内存地址加载到ECX,而非LEVEL变量存储的数值。正确写法应使用MOVZX将字节类型的LEVEL零扩展到32位寄存器,避免高24位出现垃圾值:
MOVZX ECX, BYTE [LEVEL]
2. 未定义目标存储变量
代码中直接使用[COLOR1CUR]和[COLOR2CUR],但未在.DATA段定义这两个变量,导致程序访问非法内存地址,这是超时/崩溃的直接原因。需在DATA段添加:
COLOR1CUR DD 0 COLOR2CUR DD 0
3. .LOOP子程序破坏ECX有效值
你的.LOOP子程序对ECX执行了无意义的减法、循环和加法操作,完全打乱了LEVEL的初始值。若该子程序无实际用途,直接删除;若需保留,需通过PUSH ECX/POP ECX保存和恢复寄存器值。
4. 拆分指令的逻辑错误
你之前的拆分写法是将COLOR1第一个元素的数值与ECX*4相加,而非将数组地址与偏移相加。正确的拆分写法应先计算元素地址再取值:
LEA EAX, [COLOR1 + ECX*4] ; 计算目标元素的内存地址 MOV EAX, [EAX] ; 取出元素值
当然,只要ECX值正确,你最初尝试的MOV EAX, [COLOR1 + ECX * 4]本身是合法的汇编指令,可以直接使用。
修正后的完整代码
SECTION .DATA COLOR1 DD 00223AD0h, 00BF2A04h, 000BA109h, 00AF04AFh, 00CB0556h, 005E90DFh, 00BF2A04h, 007703D5h COLOR2 DD 0040B2DFh, 00E1963Fh, 007CBD11h, 00D775D9h, 0058D590h, 0058D590h, 00707070h, 009E050Dh LEVEL DB 0 COLOR1CUR DD 0 ; 新增存储选中COLOR1元素的变量 COLOR2CUR DD 0 ; 新增存储选中COLOR2元素的变量 section .text global _start _start: ; 正确加载LEVEL的值到ECX MOVZX ECX, BYTE [LEVEL] ; 直接使用目标指令,现在可正常工作 MOV EAX, [COLOR1 + ECX * 4] MOV [COLOR1CUR], EAX ; 正确获取COLOR2对应元素 MOV EAX, [COLOR2 + ECX * 4] MOV [COLOR2CUR], EAX CALL .PRINT MOV EAX,1 ; sys_exit系统调用 MOV EBX,0 ; 退出码0 INT 80h .PRINT: ; 注意:sys_write输出字节流,直接输出DWORD变量会显示二进制乱码 ; 若需输出可读的十六进制字符串,需自行实现转换逻辑 mov eax, 4 ; sys_write系统调用 mov ebx, 1 ; 标准输出文件描述符 mov ecx, COLOR1CUR ; 要输出的内存地址 mov edx, 4 ; 输出4字节(DWORD大小) int 80h RET
补充说明
- 关于
[COLOR1 + 1]能运行:该偏移属于COLOR1数组的合法内存范围(第一个元素的第二个字节),因此不会触发非法访问,但这并非正确的数组元素访问方式。 - 超时错误本质是程序触发内存访问异常,被系统终止进程,OneCompiler将其判定为超时。
内容的提问来源于stack exchange,提问作者SmolChicken45
相关产品推荐
相关产品推荐

