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

NASM循环写入变量时字节数据异常损坏问题求助

问题分析与解决

核心问题1:数据“损坏”是查看方式导致的误解

你看到的字节0变为“随机值”(比如257),本质是错误的查看方式造成的:

  • 用mov ebx, [numbet_to_text]读取的是4个连续字节组成的32位整数,或是在GDB中用x/w(查看4字节)命令查看,此时显示的是多字节组合值,并非单个字节的真实内容。
  • 比如写入第一个字节(偏移0)为1后,未初始化的其他字节会让32位值呈现0x??????01;写入第二个字节(偏移1)为1后,32位值变为0x????0101,看起来像“字节0变了”,但实际上单个字节0的内容始终是1,只是你查看的是4字节整体。

正确查看方式:在GDB中执行x/4b numbet_to_text,逐个查看4个字节的内容,就能确认每个字节都是1。

核心问题2:检查逻辑错误导致无法触发teste标签

你的检查代码把numbet_to_text的4个字节当成一个32位整数,和十进制1111比较:

mov ebx, [numbet_to_text]
cmp ebx, 1111
je teste

但循环写入的4个字节1,组合成的32位整数是十六进制0x01010101,对应十进制16843009,和1111完全不相等,自然不会触发跳转。

解决方案

方案1:修正检查的数值

如果要将4个字节视为32位整数判断,应与0x01010101比较:

mov ebx, [numbet_to_text]
cmp ebx, 0x01010101  ; 或直接写十进制16843009
je teste

方案2:逐个字节检查

若需确保每个字节都是1,更严谨的方式是逐个验证:

mov ebx, 0
check_loop:
cmp ebx, 4
je teste
mov al, [numbet_to_text + ebx]
cmp al, 1
jne check_loop_end  ; 只要有一个字节不是1就退出检查
inc ebx
jmp check_loop
check_loop_end:
; 检查不通过的逻辑
teste:
; 检查通过的逻辑

额外注意:确保变量定义正确

需保证numbet_to_text是4字节数组,在数据段中正确定义:

section .data
numbet_to_text db 0, 0, 0, 0  ; 初始化为4个0的字节数组

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 14:42:21