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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 19:20:09