Не понимаю, как писать инструкции

Модератор: Модераторы разделов

Ответить
Акаролибр
Сообщения: 104

Не понимаю, как писать инструкции

Сообщение Акаролибр »

Я хочу выгрузить регистр к примеру с именем XMM14 в стек (желательно с каким-нибудь смещением относительно RSP).

Руководство пишет мне, используй инструкцию
MOVAPD—Move Aligned Packed Double-Precision Floating-Point Values
и приводит примеры:
MOVAPD xmm1, xmm2/m128
MOVAPD xmm2/m128, xmm1
У этих двух инструкций разные опкоды (28 и 29), и этот младший бит позволяет различить, где источник, а где приёмник. Хорошо.

Но мне непонятно, как писать инструкцию конкретно в синтаксисе GNU Assembler, ну, типа
movapd %XMM14, disp(%RSP, 1, -640)

Это не ассемблируется. Как правильно?

Пробую запускать это всё там:
https://www.onlinegdb.com/online_gcc_assembler

Код: Выделить всё

gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0
Copyright (C) 2021 Free Software Foundation, Inc.

Код: Выделить всё

-opt=-pass-through=-lgcc_s --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro -o a.out /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/11/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/11 -L/usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/11/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/11/../../.. /tmp/ccFpiMrd.o -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /usr/lib/gcc/x86_64-linux-gnu/11/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/11/../../../x86_64-linux-gnu/crtn.o
COLLECT_GCC_OPTIONS='-o' 'a.out' '-v' '-mtune=generic' '-march=x86-64' '-dumpdir' 'a.'
Последний раз редактировалось Акаролибр 24.02.2023 10:45, всего редактировалось 2 раза.
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: Не понимаю, как писать инструкции

Сообщение olecya »

Акаролибр писал:
24.02.2023 07:18
movapd %XMM14, disp(%RSP, 1, -640)
Меня смущает отрицательное смещение -640. Вы не забыли что стек растет в меньшую сторону? Попробуйте убрать знак минуса или заменить регистр %RSP на %RBP
Добавлено (09:17):
И еще,
olecya писала:
24.02.2023 09:03
disp(%RSP, 1, -640)
В этой адресации, по-моему, должен быть регистр, а не непосредственное значение. Что-то вроде:
disp(%rsp, %rbx, 640)
Последний раз редактировалось olecya 24.02.2023 09:19, всего редактировалось 1 раз.
Спасибо сказали:
Акаролибр
Сообщения: 104

Re: Не понимаю, как писать инструкции

Сообщение Акаролибр »

> Вы не забыли что стек растет в меньшую сторону?

Все адреса выше границы стека уже заняты (там что-нибудь, да лежит). Если я буду туда записывать - что-нибудь затру. Меня тоже смущает именно число -640, но не по этой причине, не по причине того что "знак минус".

> Что-то вроде:
disp(%rsp, %rbx, 640)

Я попробовал. А Вы? А ссылку где пробую написал не просто так, а чтобы наверняка.

/usr/bin/ld: /tmp/ccrYbPHY.o: relocation R_X86_64_32S against undefined symbol `disp'
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: Не понимаю, как писать инструкции

Сообщение olecya »

Акаролибр писал:
24.02.2023 09:18
Я попробовал. А Вы?
Тут пробовать нечего. Мой опыт минувших дней, не так быстро все вспоминается, но вот что без сомнения я помню:

Shell

movapd %XMM14, -4(%rsp, %rbx, 2)
В составлении адреса на память первая это непосредственное значение, потом два регистра и последняя цифра тоже непосредственное значение это скаляр, он может быть только 1, 2, 4 или 8, но никак не -640
Добавлено (10:35):
Вот так попробуйте:

Код: Выделить всё

movapd %xmm14, -640(%rsp, %rbx, 1)
Во второй регистр положите нужное значение
Спасибо сказали:
Акаролибр
Сообщения: 104

Re: Не понимаю, как писать инструкции

Сообщение Акаролибр »

olecya писала:
24.02.2023 10:28
Во второй регистр положите нужное значение
Мне не важно, куда запишется, меня другое интересует.

Вот мой код:

Код: Выделить всё

.data
# storage: .space 16, 0x00

.code64
.text
.global main
main:
    # your code goes here
#    movapd %XMM14, storage
    movapd %XMM14, 0x38374754
    movapd %xmm14, -640(%rsp, %rbx, 1)    
    movapd %XMM14, (%RSP)
    movapd %xmm14, -640(%rsp)    
	
	xor	%eax, %eax
	ret
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: Не понимаю, как писать инструкции

Сообщение olecya »

Акаролибр писал:
24.02.2023 10:41
Мне не важно, куда запишется,
Ну раз это не массив то и замарачиваться с составлением такого адреса нет резона. Тем более по прежнему опыту сужу что в локальных фикциях из которых ничего больше не вызывается даже не создается стек, Регистры %rsp и %rbp с одинаковыми адресами, и все локальные переменные находятся как бы за пределами стека. Тем более что в архитектуре amd64 каждый стек отделяется обязательной пограничной "красной зоной" по-моему в несколько десятков килобайт
Спасибо сказали:
Акаролибр
Сообщения: 104

Re: Не понимаю, как писать инструкции

Сообщение Акаролибр »

я пытаюсь скомпилировать инструкцию
movapd %xmm14, 0x89ABCDEF(%RSP)
мне выдаётся ошибка "out of range of signed 32bit displacement"

Всё понятно 0x8 это много, старший бит единица и в signed столько не влезает.

Вопрос, что куда в коде написать в какую опцию, чтобы эти displacement стали 64-битными (вроде такого в принципе не может быть, кроме регистра RAX?) или unsigned ? Или я вообще хочу странного?

Константу 0x89ABCDEF я вижу в бинарном коде. И хочу составить эквивалентную инструкцию.
Чтобы не сильно мучаться, я хочу, чтобы преобразованием типа из unsigned в signed занялся ассемблер.
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 901
ОС: debian, fedora (i3-wm)

Re: Не понимаю, как писать инструкции

Сообщение olecya »

Акаролибр писал:
24.02.2023 11:21
что куда в коде написать в какую опцию, чтобы эти displacement стали 64-битными
Может как-то так?

Код: Выделить всё

mov $0x89abcdef, %eax
movapd %xmm14, (%rax)
Спасибо сказали:
Ответить