如何在GNU Assembly中传递数据列表作为参数?

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

代码如下:

maxfunc.s

# NAME: maxfunc.s # PURPOSE: A modular approach of finding the maximum of lists .section .data # The data section has three lists for testing, change the code # highlighted in the text section to change the list passed. data_1: .long 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 data_2: .long 23, 45, 62, 13, 87, 54, 0 data_3: .long 1, 2, 3, 3, 3, 7, 6, 5, 8, 1, 1, 0 # VARIABLES: # 1. %edi - Will be our index variable, to access the items # 2. %ebx - The element we're looking at currently # 3. %eax - The maximum value we've found so far # 4. %ecx - To store the address of the list .section .text # Push the address of the list we want to find the maximum of pushl data_1 # ^ # +---> Change this to select your list call maximum addl $4, %esp # Reset the stack movl %eax, %ebx movl $1, %eax int $0x80 .type maximum, @function maximum: # Setup popl %ebp movl %esp, %ebp # The initial setup: # Get the address of the list # Set the index to 0 # Get the first item from the list # The first item is currently the largest movl $0, %edi movl 8(%ebp), %ecx movl (%ecx)(, %edi, 4), %ebx movl %ebx, %eax max_loop: cmpl $0, %ebx je exit_loop incl %edi movl (%ecx)(, %edi, 4), %ebx cmpl %eax, %ebx jle max_loop # %ebx is greater than %eax, therefore, update max movl %ebx, %eax jmp max_loop exit_loop: # Tear down movl %ebp, %esp popl %ebp ret 

它不会编译并显示以下错误:

 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 data_set(,%rbx,8), %rax

语法就像INSTRUCTION CONST(BASE_ADDR_REG,INDEX_REG,MULTIPLIER

你可以像我的例子那样省略基址寄存器。 我省略的原因是因为我的数据地址在我的程序中没有改变,所以我使用它的直接值。

其中data_set是基地址(用作常量), %rbx是索引, 8是乘数…在我的情况下8字节,因为我正在迭代四字值。

如果我正在迭代long值,就像你一样,我将使用4作为乘数,因为在x86上longs通常是4个字节(32位)。

示例最大功能

 .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