Сборка x86 - ставится в тупик при обходе массива и установке переменных, равных элементу в массиве - PullRequest
0 голосов
/ 04 февраля 2019

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

Что происходит, я пересекаюмассив с 16 элементами в нем, но мне нужно получить доступ к 4 элементам одновременно, так что есть наложение.Поэтому, когда я = 12, он будет обращаться к элементам массива array [12], ... array [15].

for (int i = 0; i < 13; i++)
{
    w = array[i];
    x = array[i+1];
    y = array[i+2];
    z = array[i+3];

    result = function(w, x, y, z);
    // output
}

int function (int w, int x, int y, int z)
{
    return (w-x)*(y+z);
}

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

loop:
    cmp %13, %rcx


    call myfunction /* insert function call to perform a computation on all 4 variables */
    /* insert call to output the variables with the result of the computation */

    inc %rcx
    jmp loop

1 Ответ

0 голосов
/ 15 мая 2019

Вот упрощенная сборка (здесь можно сделать много оптимизаций, но они усложнят код), для этого я использовал то же соглашение о вызовах, что и GCC:

function:
  /* save the old stack frame*/
  push rbp
  mov rbp, rsp

  /* w, x, y, z = rdi, rsi, rdx, rcx */
  sub edi, esi /* edi -= esi */
  add edx, ecx /* edx -= ecx */
  imul edi, edx /* edi *= edx */

  /* Conclude the call */
  mov eax, edi /* return value */
  mov rsp, rbp
  pop rbp
  ret

/*main_logic(array)*/
main_logic:
  /* save the old stack frame*/
  push rbp
  mov rbp, rsp

  /* rdi contains the pointer to the array, save it*/
  mov r8, rdi

  /* r9 = 0 */
  xor r9, r9

  calc_loop:
    /* We're using the e registers because ints in C are 4 bytes */
    /* e registers are subregisters of r registers with similar names that refer to the first 4 bytes of the register */
    /* r registers are 8 bytes */
    mov edi, [r8+r9*4] /* r8[r9] */
    mov esi, [r8+r9*4+4] /* r8[r9+1] */
    mov edx, [r8+r9*4+8] /* r8[r9+2] */
    mov ecx, [r8+r9*4+12] /* r8[r9+3] */
    call fn /* result = function(w, x, y, z); */

    mov edi, eax /*Pass return value of function to output function*/
    /*call your number outputting function here*/

    inc r9 /* r9 ++ */
    cmp r9, 14 /* r9 < 14 */
    jne calc_loop /* Jump back to the beginning of the calc_loop */

  /* Conclude the call */
  mov rsp, rbp
  pop rbp
  ret
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...