Доступ передается в аргументе в сборке - PullRequest
0 голосов
/ 08 ноября 2019

Я новичок в программировании на ассемблере, и у меня возникают проблемы при передаче и доступе к списку данных в функции. Я работаю, хотя PDF-файл, который я скачал с сайта под названием «Программирование с нуля» Джонатана Бартлетта. В любом случае, я могу создать список данных, но когда я передаю его в свою функцию, я могу получить только первое значение - все остальные кажутся мусором, но они кажутся согласованными между выполнениями. Я пытался выяснить это в течение пары дней и рылся в интернете в поисках ответов, но не нашел ни одного. И вот я здесь.

Задача состоит в том, чтобы поместить список данных в стек, вызвать функцию, извлечь аргумент из стека, получить элемент из аргумента и передать его обратно в eax

Яс использованием GAS в Linux x86

    data_list:  .long 7,6,5,4,3
    data_items: .long
.section .text
.global _start
_start:
    movl data_list, %eax
    pushl %eax
    call pass

    # move eax to ebx
    movl %eax, %ebx

    # set exit 
    movl $1, %eax

    # call kernel
    int $0x80

.type pass, @function
pass:
    # save off ebp
    pushl %ebp

    # move esp to ebp
    movl %esp, %ebp

    # get argument
    movl 8(%ebp), %ebx

    # move ebx to our variable
    movl %ebx, data_items

    # set edi to then index we want
    movl $4, %edi

    # get element from data and put it into our return value
    movl data_items(,%edi,4), %eax
done:
    # reset esp
    movl %ebp, %esp

    # pop ebp
    popl %ebp

    # return to caller
    ret

Я ожидаю, что он вернет 3, но я получу 116. Это заставляет поверить, что он только передает копию первого элемента в списке данных, как если бы edi равнялось 0Я получаю правильное значение.

...