Простой алгоритм сборки, чтобы найти наибольшее число - Почему он возвращает неправильный номер? - PullRequest
2 голосов
/ 27 сентября 2011

Я работаю над простой процедурой, которая перебирает список чисел и возвращает макс. Всегда возвращается 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 ]

1 голос
/ 11 января 2018

Операционные системы на основе Unix поддерживают только 8-битное возвращаемое значение (т. Е. 0-255).

Таким образом, ваша программа находит максимальное значение и сохраняет его в %ebx,но вы не можете вернуть его как код завершения программы.Я запустил вашу программу без чисел больше 255, и она работала правильно.

0 голосов
/ 27 сентября 2011

две точки (1) при отладке и получении необоснованного ответа удалите это значение из ваших тестовых данных, поэтому в этом случае удалите 11 из ваших данных и посмотрите, что произойдет

(2) Я только что проверилзначение 4356 (10) и отобразил его в шестнадцатеричном виде и получил 1104 (16), поэтому я думаю, что ваш код возврата получает только левый байт 16-битного значения (4356).

0 голосов
/ 27 сентября 2011

Нет ничего плохого в вашей логике .Когда я ввожу этот код в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...