尝试使用x86程序集在数组中查找最小值时出现意外输出

时间:2017-10-08 17:25:41

标签: assembly x86

我是一本书的初学者(从头开始编程),这是我的第一个装配程序:

.section .data

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

.section .text

.globl _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

%edi用于跟踪当前索引,当前值的%eax和当前最高值的%ebx

如果%eax小于%ebx(意味着它不必将新值存储为当前最高值),此程序最初会跳回到最高值,我只是将其更改为jge代替jle,因此如果%eax遇到较小的值,它只会在%ebx中存储。{/ p>

我的问题是我的程序返回0而不是3,我希望它是正确的输出。它遇到0时不应退出,因为它会在每次%eax次迭代开始时检查0start_loop,如果是,请跳转到loop_exit

简而言之:为什么此计划的输出0而不是3

编辑:按输出我的意思是当我致电%ebx时,echo $?的返回代码

1 个答案:

答案 0 :(得分:3)

  

当它遇到0时不应该退出,因为它检查在每次start_loop迭代开始时%eax是否为0

因此,您希望将0视为列表终止值。这要求您在阅读每个值后立即检查它。您的代码有2个这样的读取实例,因此需要对终止值进行2次检查:

    ...
    movl data_items(,%edi,4), %eax
    movl %eax, %ebx
    cmpl $0, %eax
    je   loop_exit     ;List is empty, only terminator present
start_loop:
    incl %edi
    movl data_items(,%edi,4), %eax
    cmpl $0, %eax
    je loop_exit       ;End of list reached
    ...