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

汇编求最小值程序始终返回0的问题求助

问题分析与修复方案

你的程序始终返回0的核心原因是:用来终止数据列表的0被当成了普通数据项参与了最小值比较,而0比列表里所有正数都小,最终会被存入%ebx作为最小值返回。

具体流程问题

看你的循环逻辑:

  1. 初始加载第一个数据3到%eax和%ebx
  2. 进入循环后先检查当前%eax是否为0(第一次是3,不退出)
  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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 11:16:03