无效的字符'&'操纵内存中的变量

时间:2016-04-09 14:13:32

标签: assembly x86 gas att

我想计算数组的最大值。我只完成了寄存器,但现在我在操作内存中的变量时遇到了麻烦。一开始我想让第一个数字成为最大值。我做了movl array(, %edi, 4), &max它给出了错误,无效的字符''。做正确的方法是什么? 我对decl &n指令有类似的问题。

在代码中,我使用%edi作为索引,使用%eax作为当前值。

.data
    array:
        .int 31, 9, 42, 18, 40
    n:
        .int 5
    max:
        .int 0

.text
.globl _start

_start:
    movl $0, %edi
    movl array(, %edi, 4), &max
start_loop:
    incl %edi
    decl &n
    cmpl $0, n
    je exit_loop
    movl array(, %edi, 4), %eax
    cmpl max, %eax
    jle start_loop
    movl %eax, &max
    jmp start_loop

exit_loop:
    movl $1, %eax
    movl &max, %ebx
    int $0x80

1 个答案:

答案 0 :(得分:0)

  

我想计算数组中的最大值。

解决获取数组最大值问题的一种天真的方法是以下代码(复制数据序言):

_start:
    movl n, %ecx                ; %ecx is now equal to the array len
    lea array, %esi             ; %esi points to the beginning of the array
    xorl %edx, %edx             ; first maximum value is 0
start_loop:
    movl (%esi), %eax           ; get value from array to %eax
    cmpl %edx, %eax             ; is new value greater (or equal) to the current max?
    cmovge %eax, %edx           ; then replace it
    add $4, %esi                ; set pointer to next element of array
    loop start_loop             ; decrement %ecx and jump to label if not 0
exit_loop:
    movl $1, %eax               ; SYS_EXIT
    movl %edx, %ebx             ; copy max to 'exit status'
    int $0x80                   ; execute SYSCALL