我编写了这个基本的 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/