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
相关产品推荐
相关产品推荐

