汇编求最小值程序始终返回0的问题求助
问题分析与修复方案
你的程序始终返回0的核心原因是:用来终止数据列表的0被当成了普通数据项参与了最小值比较,而0比列表里所有正数都小,最终会被存入%ebx作为最小值返回。
具体流程问题
看你的循环逻辑:
- 初始加载第一个数据
3到%eax和%ebx - 进入循环后先检查当前
%eax是否为0(第一次是3,不退出) - 索引+1,加载下一个数据,直到加载到列表中的
0时:- 先执行
cmpl %ebx, %eax(此时%eax是0,%ebx是当前最小值11) - 0 < 11,所以不会触发
jge start_loop,而是执行movl %eax, %ebx,把%ebx设为0 - 跳回循环开头,此时
%eax是0,触发je loop_exit退出,最终返回0
- 先执行
修复方案
有两种简单的修复方式:
方式1:调整循环逻辑,先检查终止符再比较数据
把终止符的检查放在数据比较之前,避免终止符参与最小值计算:
.section .data data_items: # 数据项,0仍作为终止标记 .long 3, 67, 34, 222, 45, 254, 255, 75, 54, 34, 44, 33, 22, 11, 66, 0, 300, 400 .section .text .global _start _start: movl $0, %edi movl data_items(, %edi, 4), %eax movl %eax, %ebx start_loop: incl %edi # 先移动索引 movl data_items(, %edi, 4), %eax # 加载下一个数据 cmpl $0, %eax # 先检查是否到终止符 je loop_exit cmpl %ebx, %eax # 再比较当前数据与最小值 jge start_loop # 当前数据更大则跳过更新 movl %eax, %ebx # 更新最小值 jmp start_loop loop_exit: movl $1, %eax int $0x80
方式2:更换终止标记为不会干扰比较的值
因为你的数据都是正数,可以把终止标记换成负数(比如-1),这样它不会被当成有效数据参与最小值比较:
.section .data data_items: .long 3, 67, 34, 222, 45, 254, 255, 75, 54, 34, 44, 33, 22, 11, 66, -1, 300, 400 # 其余代码保持不变,循环中检查%eax是否为-1即可
关于最大值功能正常的原因
你提到替换jge start_loop后能正常找最大值,本质是因为0比所有数据都小,在最大值逻辑中,0不会被判定为更大的数,所以不会更新%ebx,最终%ebx保留的是列表中的最大值255。
内容的提问来源于stack exchange,提问作者Asad
相关产品推荐
相关产品推荐

