基本 linux x86 程序集最小数量 returns 错误

basic linux x86 assembly minimum number returns incorrectly

我写了这个基本的 linux x86 汇编应用程序。我希望它 return 3 当我做 echo $? 但是状态总是 0。我做错了什么?

.section .data
   data_items:
      .long 3,67,34,222,45,2,54,34,44,33,22,11,66,0

.section .text
   .global _start

   _start:
      movl [=12=], %edi
      movl data_items(,%edi,4), %eax
      movl %eax, %ebx

   start_loop:
      cmpl [=12=], %eax
      je loop_exit
      incl %edi
      movl data_items(,%edi,4), %eax
      cmpl %ebx, %eax
      jge start_loop
      movl %eax, %ebx
      jmp start_loop

   loop_exit:
      movl , %eax
      int [=12=]x80

注意:%ebx始终包含状态代码,应该包含退出时间的最小值。

固定:

   _start:
      movl [=13=], %edi
      movl data_items(,%edi,4), %ebx

   start_loop:
      incl %edi
      movl data_items(, %edi, 4), %eax
      cmpl [=13=], %eax
      je loop_exit

      cmpl %ebx, %eax
      jge start_loop

      movl %eax, %ebx

问题是终止零也参与最小值计算。只有在完成最小值检查后,您才检查该零。学习使用调试器单步执行代码。

考虑一下当您到达最后一项 66 时会发生什么。按照 start_loop 中的代码进行操作。显然 66 不是 0 所以它继续,递增索引并获取下一个数字,即零。这当然小于目前的最小值,因此它被存储到 ebx 中,我们再次以 start_loop 结束,它正确地检测到终止条件。但是 ebx 已经归零。