LINUX.ORG.RU

assembler: wtf?

 , ,


0

1

День добрый, господа.

Листаю книжечку по ассемблеру, все листинги в ней рассчитаны под 32-битную архитектуру, посему я пытаюсь их адаптировать под 64-бита, параллельно просматривая доку отсюда. Вот, что у меня пока получилось (на комментарии не обращайте внимания):

    # an example of the cmov instructions
    .section .data
output:
    .asciz "The largest value is %ld\n"
values:
    .quad 105, 235, 61, 315, 134, 53, 145, 117, 5
    .section .text
    .globl _start
_start:
    # movq values, %rdi       # push address of the values first element to %rdi
    movq values, %rsi
    movq $1, %rcx             # set counter in %rcx
loop:
    movq values(, %rcx, 8), %rax    # push the element of values to %rax
    cmp %rsi, %rax                  # compare %rax with %rdi
    cmova %rax, %rsi                # push %rax value to %rdi if it is >
    incq %rcx                       # increment counter
    cmp $10, %rcx                   # compare counter with 10
    jne loop                        # jump to the start of loop if it is less then 10

    # preparation for printf
    # pushq %rdi
    # pushq $output
    movq $output, %rdi
    # pushq %rsi
    callq printf
    addq $8, %rsp
    pushq $0
    callq exit
Бинарь должен выводить максимальное число из последовательности чисел — 315, но у меня получается бред
>$ make cmovtest
as -gstabs cmovtest.s -o cmovtest.o
ld -dynamic-linker /usr/x86_64-pc-linux-gnu/lib/ld-linux-x86-64.so.2 -o cmovtest -lc cmovtest.o
>$ ./cmovtest 
The largest value is 65536
ЧЯДНТ?


ЧЯДНТ?

все листинги в ней рассчитаны под 32-битную архитектуру, посему я пытаюсь их адаптировать под 64-бита

anonymous
()
Ответ на: комментарий от Radjah

Вот тут 8 не надо поменять на что-то кратное?

Почему? У меня же values содержит .quad директиву, соответственно мне нужно сдвигаться на 8 байт.

Ox4
() автор топика
Ответ на: комментарий от mashina

ну, всё верно, jump происходит в том случае, когда счётчик не равен 10, т.е. следующие 10*8 байт не затрагиваются

Ox4
() автор топика
Ответ на: комментарий от Ox4

отсчёт идёт от нуля, таким образом при %rcx = 8 уже оказываешься на последнем элементе, а на 9 выходишь за область массива.

mashina ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.