SirenaProgrammer
@SirenaProgrammer
Увлекаюсь программированием и легкой атлетикой

Как правильно решить задачу на работу с двумя массивами в asm?

Добрый день!
Мне нужно написать программу, в которой у меня есть массив из 16(32) байт. Нужно из c++ переместить этот массив в ассемблерную вставку, а там уже перенести из этого массива в другой массив все элементы, которые равны сумме соседних. Можно в ассемблере максимум использовать двойные слова. То есть регистры e*x нельзя брать. Кто может подсказать, где найти материал по этой теме, либо же предложить пример кода для решения поставленной задачи? Я пыталась найти что-то в интернете на эту тему, но, к сожалению, ничего не нашла :(
  • Вопрос задан
  • 409 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Нужно из c++ переместить этот массив в ассемблерную вставку, а там уже перенести из этого массива в другой массив все элементы, которые равны сумме соседних.
То есть регистры e*x нельзя брать. Кто может подсказать, где найти материал по этой теме, либо же предложить пример кода для решения поставленной задачи?

Можно написать этот код так, что он не будет использовать никакие конкретные регистры явно. Конкретные регистры будут подставлены компилятором. Например (gcc):
#include <stdint.h>

void f(void)
{
    uint32_t a[16] = {1, 2, 3, 1, 5, 4, -1, }, b[16] = {0};
    void *a1, *b1;
    uint32_t tmp, cnt = 14;

    asm (
        "lea %[a], %[a1]\n\t"
        "lea %[b], %[b1]\n"
        "1:\n\t"
        "mov (%[a1]), %[tmp]\n\t"
        "add 8(%[a1]), %[tmp]\n\t"
        "cmp 4(%[a1]), %[tmp]\n\t"
        "jne 2f\n\t"
        "mov %[tmp], (%[b1])\n\t"
        "add $4, %[b1]\n"
        "2:\n\t"
        "add $4, %[a1]\n\t"
        "dec %[cnt]\n\t"
        "jnz 1b\n\t"
        : [cnt] "=&r" (cnt), [tmp] "=&r" (tmp),
          [a1] "=&r" (a1), [b1] "=&r" (b1),
          [b] "=m" (b)
        : [a] "m" (a));
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы