我是一本书的初学者(从头开始编程),这是我的第一个装配程序:
.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
次迭代开始时检查0
是start_loop
,如果是,请跳转到loop_exit
?
简而言之:为什么此计划的输出0
而不是3
?
编辑:按输出我的意思是当我致电%ebx
时,echo $?
的返回代码
答案 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
...