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

