Я новичок в программировании на ассемблере, и у меня возникают проблемы при передаче и доступе к списку данных в функции. Я работаю, хотя 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Я получаю правильное значение.