День добрый, господа.
Листаю книжечку по ассемблеру, все листинги в ней рассчитаны под 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
>$ 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