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

x86 NASM汇编如何正确比较数组元素与变量?附代码异常排查

问题原因分析与修复方案

核心错误点

  • 数组地址获取错误
    你写的mov eax, [numArray]是读取numArray地址指向的前4字节内存值存入eax,而不是把数组的起始地址存入eax。正确写法是mov eax, numArray,不加中括号代表直接取标签对应的地址值。
  • 数据宽度不匹配
    你定义num和numArray都是db类型(单字节,8位),但比较时用了32位寄存器eax,cmp [num], eax相当于拿1字节的num值和4字节的eax值做比较,类型完全不匹配,永远不可能得到相等的结果。
  • 循环逻辑错误
    你当前循环直接拿eax寄存器的值(要么是错误的内存值要么是地址)和num比较,没有实时读取当前数组地址指向的元素值;同时判断循环结束的位置不合理,也没有适配字节数组的寻址规则(字节数组每个元素占1字节,地址每次只需要+1)。

修正后的可运行代码

section .text
    global _start
    
_start:
    mov eax, numArray  ; 存储数组起始地址到eax
    mov ecx, 3         ; 数组元素总数
    mov dl, [num]      ; 把待匹配的num值提前存入8位寄存器dl
    
Num:
    cmp [eax], dl      ; 比较当前数组元素和num的值
    je inArray         ; 相等就跳转到存在分支
    inc eax            ; 地址+1,指向数组下一个字节元素
    dec ecx            ; 计数器减1
    jnz Num            ; 计数器不为0就继续循环
    
    ; 循环跑完未跳转代表元素不存在
notIn:
    mov eax, 4
    mov ebx, 1
    mov ecx, msg2
    mov edx, len2
    int 0x80
    jmp _exit
    
inArray:
    mov eax, 4
    mov ebx, 1
    mov ecx, msg1
    mov edx, len1
    int 0x80
    
_exit:
    mov eax, 1
    int 0x80
    
section .data
    num db 1
    numArray db 1, 2, 3
    
    msg1 db 'That is in the array!'
    len1 equ $-msg1
    
    msg2 db 'That is not in the array'
    len2 equ $-msg2

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 12:06:03