Linux 如何在GNU汇编中将数据列表作为参数传递?

Linux 如何在GNU汇编中将数据列表作为参数传递?,linux,assembly,gnu,gnu-assembler,Linux,Assembly,Gnu,Gnu Assembler,我在代码的数据部分有3个不同的列表。我打算编写一个函数来查找这些列表的最大数量,无论用户希望使用哪个列表。如何将所需列表的地址正确传递给函数?如何使用索引从列表中获取值?我不知道在作为参数得到的地址上进行索引寻址的正确语法。我在谷歌上找不到任何有用的东西 代码如下: maxfunc.s 它不编译并显示以下错误: maxfunc.s: Assembler messages: maxfunc.s:47: Error: register value used as expression maxfunc

我在代码的数据部分有3个不同的列表。我打算编写一个函数来查找这些列表的最大数量,无论用户希望使用哪个列表。如何将所需列表的地址正确传递给函数?如何使用索引从列表中获取值?我不知道在作为参数得到的地址上进行索引寻址的正确语法。我在谷歌上找不到任何有用的东西

代码如下:

maxfunc.s 它不编译并显示以下错误:

maxfunc.s: Assembler messages:
maxfunc.s:47: Error: register value used as expression
maxfunc.s:55: Error: register value used as expression
从寄存器
%ecx
获取数据列表地址以用于索引寻址的正确方法是什么?还是参数



我的系统是64位的,但我将其编译为32位二进制文件(以符合要求)

索引寻址模式类似于
movq数据集(,%rbx,8),%rax

语法类似于指令常量(基本地址、索引、乘法器)

在我的示例中,您可以省略基址寄存器。我省略它的原因是因为我的数据地址在我的程序中没有改变,所以我使用它的立即值

其中,
data\u set
是基址(用作常数),
%rbx
是索引,
8
是乘数……在我的例子中,是8个字节,因为我正在迭代四字值

如果我像您一样迭代
long
值,我会使用
4
作为乘法器,因为在
x86
上,long通常是4个字节(32位)

最大值函数示例
是的,但我想把它移到一个以
data\u set
为参数的函数。我已经熟悉你发布的代码了。我试过了。。。它不起作用了。。。或者我不知道正确的方法。(查看代码和错误)尝试
movl(%ecx,%edi,4),%ebx
。它可以编译,但我遇到了Seg故障。我最终会修好的。谢谢你的帮助。:-)当我的代码工作正常时,我会接受你的答案。
pushl data_1
将推送
data_1
数组中第一个元素的值。您的注释和代码冲突。您肯定打算推送立即地址值。更改为
pushl$data\u 1
。。。。现在,
popl
可以恢复正确的值。
maxfunc.s: Assembler messages:
maxfunc.s:47: Error: register value used as expression
maxfunc.s:55: Error: register value used as expression
.section .data
    data_set: .quad 8, 1, 98, 18, 18, 12, 18, 19, 27, 32, 9, 12, 18, 92, 255, 0

.section .text
.globl _start


# rbx, data index
# rdi, current max
# rax, current data
_start:
    movq $0, %rbx # init index reg
    movq data_set(,%rbx,8), %rax
    movq %rax, %rdi

loop:   
    cmpq $0, %rax # check if end
    je exit
    incq %rbx
    movq data_set(,%rbx,8), %rax
    cmpq %rdi, %rax
    jle loop

    movq %rax, %rdi
    jmp loop

exit:
    movq $60, %rax
    syscall