gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:29:38 25 4
gpt4 key购买 nike

我是一个初学者,正在看书(从头开始编程),这是我的第一个汇编程序:

.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如果遇到更小的值。

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

简而言之:为什么这个程序的输出是 0 而不是 3

编辑:我所说的输出是指当我调用 echo $?

%ebx 的返回码

最佳答案

Shouldn't it exit when it encounters 0 because it checks if %eax is 0 at the start of every start_loop iteration

因此您希望将 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
...

关于assembly - 尝试使用 x86 程序集查找数组中的最小值时出现意外输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46633965/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com