linux - basic linux x86 assembly minimum number 返回不正确

标签 linux assembly x86 minimum

我编写了这个基本的 linux x86 汇编应用程序。我希望它在我执行 echo $? 时返回 3 但状态始终为 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 $0, %edi
      movl data_items(,%edi,4), %eax
      movl %eax, %ebx

   start_loop:
      cmpl $0, %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 $1, %eax
      int $0x80

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

固定:

   _start:
      movl $0, %edi
      movl data_items(,%edi,4), %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

最佳答案

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

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

关于linux - basic linux x86 assembly minimum number 返回不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37003670/

相关文章:

assembly - 我想手写一个ELF文件。如何让我的elf文件调用c标准库

assembly - AVX2 中的 VPERMB 在哪里?

assembly - 如何在程序集引导加载程序中打印按下的键盘按键?

php - linux msmtp 配置从 shell 发送但从 PHP/apache 失败

c - __WORDSIZE 在编译中的作用

linux - 正确的 zsh shell 命令转义

assembly - 在汇编程序中交换最高有效字节和最低有效字节

assembly - 以 8086 读取文件,直到文件结束

java - 基本 Mule ESB 安装和开发

c - 如何使用自己的函数覆盖系统调用表条目?