Assembly 无效字符'&';在内存中操作变量

Assembly 无效字符'&';在内存中操作变量,assembly,x86,gnu-assembler,att,Assembly,X86,Gnu Assembler,Att,我想从数组中计算最大值。我只使用过寄存器,但现在我在处理内存中的变量时遇到了麻烦。在开始时,我想让第一个数字成为最大值。我做了movl数组(,%edi,4),&max它给出了错误,无效字符'&'。正确的方法是什么? 我对decl&n指令也有类似的问题 在代码中,我使用%edi作为索引,使用%eax作为当前值 .data array: .int 31, 9, 42, 18, 40 n: .int 5 max: .int 0

我想从数组中计算最大值。我只使用过寄存器,但现在我在处理内存中的变量时遇到了麻烦。在开始时,我想让第一个数字成为最大值。我做了
movl数组(,%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
我想从数组中计算最大值

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


你想让那神奇的
做什么?您不需要它来访问变量。您不需要使用
&
来表示地址
max
是标签的地址。第二个问题是,在英特尔x86上,指令不能接受两个内存操作数。您必须使用中间寄存器将其分解为两条指令。我的意思是,您必须分解的行是
movl数组(,%edi,4),&max
。一个例子是
movl数组(,%edi,4),%eax
movl%eax,max
cmpl$0,n
decln
之后是不必要的,因为如果
n
变为零,零标志将由
decl
自动设置,因此无需额外比较到零。通常是的。但也有例外。与
mov(B/W/D)
类似,它使用固定索引寄存器/指针(ESI/EDI)将数据从内存移动到内存,而不使用任何寄存器。movl数组,%ESI会将整数移动到ESI吗?这让我很困惑,因为数组是地址的标签。我真的不知道你们想对我说什么。在上面的代码中,甚至不存在像
movl数组,%esi
这样的行。我使用指令
lea-array,%esi
%esi
分配给
array
的地址。之后,我使用
movl(%esi),%eax
访问应用间接寻址模式的数组的值。指令
movl数组,%esi
只需将
array
的前四个字节移动到
%esi
array
是一个标签,
movl
将该标签的四个字节移动到目标)。
_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