Функция расчета максимального значения в сборке AT & T x86 - PullRequest
1 голос
/ 01 марта 2020

Я пытаюсь написать эту функцию под названием максимум, которая будет возвращать максимальное значение из списка чисел, я хочу использовать метки, которые могут указывать, с чего начать. Когда адрес (который я использую для вычисления, где находится следующее значение) превысит список, функция перейдет к концу l oop.

К сожалению, после сборки программы и ее запуска я получаю ошибку сегментации.

Я прошу найти ошибку в моем коде. Я пытался использовать отладчик GDB, но все равно не смог.

.section .data
list_1:
 .long 5,3,6,2,7,78
list_2:
 .long 33,23,52,6,7,89,22,33,6
list_3:
 .long 22,33,10,45,6,34
end_list_3:

 .section .text

 .globl _start
 .globl maximum
_start:

 pushl list_2
 pushl list_1
 call maximum
 addl $8, %esp
 movl %eax, %ebx


 mov $1, %eax
 int $0x80
                        #maximum function: 1 param - location of first value
                        #                  2 param - location of last value+4
 .type maximum STT_FUNC
maximum:
 pushl %ebp
 movl %esp, %ebp

 movl 8(%ebp),%ebx      # %ebx = location of first value
 movl 12(%ebp), %ecx    # %ecx location of last value + 4

 movl (%ebx), %eax      # %eax will store current highest value

 movl $0, %esi          # %esi will be our index

start_loop:
 incl %esi
 lea (%ebx,%esi,4), %edx
 cmpl %edx, %ecx
 je exit_loop
 movl (%ebx,%esi,4), %edi       #%edi is a current examined value
 cmpl %eax, %edi
 cmovg %edi, %eax
 jmp start_loop
exit_loop:

 movl %ebp, %esp
 popl %ebp
 ret

Ответы [ 2 ]

3 голосов
/ 01 марта 2020

Проблема заключалась в выдвижении аргументов, я хотел набрать адреса sh, но использовал:

pushl   list_2
pushl   list_1

list_1 и list_2 обрабатываются как адреса для значения, которое будет помещено в стек, так что это выдвигало операнд источника памяти не сразу.

Вместо этого используйте:

pushl   $list_2
pushl   $list_1

После того небольшого изменения программа работает как запланировано, теперь эти 2 инструкции выдвигают прямые адреса: list_1 и list_2, что я и хотел.

Спасибо @ Jérôme Richard и @ Jester.

0 голосов
/ 01 марта 2020

Вы можете использовать отладчик, чтобы легко выяснить, почему. Я советую вам использовать GDB (особенно с помощью команд layout asm и ni).

Сегфоут находится в этой строке:

    mov (%ebx), %eax

Это нормально, поскольку значение сохраняется в ebx - целое число (5), а не правильный указатель. Вы, вероятно, хотели использовать lea вместо movl в следующих инструкциях:

    movl 8(%ebp),%ebx      # %ebx = location of first value
    movl 12(%ebp), %ecx    # %ecx location of last value + 4
...