基本 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
已经归零。
我写了这个基本的 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
已经归零。