简单的汇编算法找到最大的数字 - 为什么返回错误的数字?

时间:2011-09-27 03:23:05

标签: assembly x86

我正在研究一个简单的例程,它将遍历一个数字列表并返回最大值。它总是返回11,我看不出我的逻辑有什么问题。为了测试例程,我有一个循环的数字列表(data_items)。我在这做错了什么?

 .section .data

data_items:    #these are the data items

.long 3,67,34,222,45,75,857,858,983,11,55,43,23,123,785,4356,0

.section .text

.globl _start

_start:

movl $0, %edi                       #move 0 into the index register
movl data_items(,%edi,4), %eax      #load the first byte of data
movl %eax, %ebx                     #since this is the first item, %eax is the biggest


start_loop:
cmpl $0, %eax                       #check to see if we've hit the end
je loop_exit
incl %edi                           #load the next value
movl data_items(,%edi,4), %eax
cmpl %ebx, %eax                     #compare values
jle start_loop                      #jump to the start of the loop if the value is not larger

movl %eax, %ebx                     #move the value as the largest
jmp start_loop                      #jump to the loop beginning

loop_exit:
movl $1, %eax                       #1 is the exit() syscall
int $0x80

3 个答案:

答案 0 :(得分:1)

基于Unix的操作系统仅支持8位返回值(0-255)。

因此,您的程序确实找到了最大值,并将其存储在%ebx中,但您无法将其作为程序的退出代码返回。我运行你的程序没有大于255的数字,它运行正常。

答案 1 :(得分:0)

你的逻辑完全没有问题。当我将该代码输入qq.s并执行以下内容时:

pax$ as -o qq.o qq.s

pax$ ld -o qq qq.o

pax$ gdb qq
GNU gdb (Ubuntu/Linaro 7.2-1ubuntu11) 7.2
Copyright (C) 2010 Free Software Foundation, Inc.
... blah blah blah ...
Reading symbols from /home/pax/qq...(no debugging symbols found)...done.

(gdb) break loop_exit
Breakpoint 1 at 0x8048097

(gdb) run
Starting program: /home/pax/qq 
Breakpoint 1, 0x08048097 in loop_exit ()

(gdb) info reg ebx
ebx            0x1104   4356

(gdb) _

换句话说,正确的值正在加载到ebx

答案 2 :(得分:0)

两点(1)在调试并获得不合理的答案时,从测试数据中删除该值,因此在这种情况下从数据中删除11,看看会发生什么

(2)我刚检查了值4356(10)并以十六进制显示并得到了1104(16),所以我认为你的返回码只是得到一个16位值的左字节(4356)。 / p>