Максимум списка длинных значений в сборке - PullRequest
1 голос
/ 13 января 2012

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

Код выглядит следующим образом:

.section .data
    data_items: .long 200, 201, 101, 10, 0
    min_val: .long 0x8000000000000000 # MIN_VALUE in long

.section .text
.global _start

    _start:
        movl $0, %edi   # init counter to 0
        movl min_val, %ebx
    start_loop:
        cmpl $0, %eax
        je loop_exit    # go to end if 0 encountered

        incl %edi
        movl data_items(,%edi,4), %eax
        cmpl %ebx, %eax
        jle start_loop  # if new value < max value in ebx, read next element

        movl %eax, %ebx
        jmp start_loop

    loop_exit:
        movl $1, %eax
        int $0x80

Две проблемы с этим кодом:

  • При попытке собрать код я получаю сообщение: Предупреждение: значение 0x8000000000000000 усечено до 0x0
  • Если я переписываю свой код в альтернативной логике (та, которая не требует переменной min_value), любое значение больше 255 в списке data_items усекается или возвращается как значение% 256, даже если диапазон .long должен быть намного больше?

Может кто-нибудь помочь мне понять, что я делаю не так?

РЕДАКТИРОВАТЬ: После изменений код выглядит следующим образом. Обратите внимание, что максимум в этом случае оказывается 145 вместо 401.

.section .data
    data_items: .long 401, 201, 101, 10, 0
    max_val: .long 0x80000000

.section .text
.global _start

    _start:
        movl $0, %edi   # init counter to 0
        movl max_val, %ebx
    start_loop:
        movl data_items(,%edi,4), %eax
        cmpl $0, %eax
        je loop_exit    # go to end if 0 encountered

        incl %edi

        cmpl %ebx, %eax
        jle start_loop  # if new value < max value in ebx, read next element

        movl %eax, %ebx
        jmp start_loop

    loop_exit:
        movl $1, %eax
        int $0x80

1 Ответ

2 голосов
/ 13 января 2012

Прежде всего, 0x8000000000000000 даже не вписывается в длинную, это длинная длинная .Длинный -1 равен 0xffffffff .

Что касается другого пункта, я не могу комментировать код, который вы не опубликовали.

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