【发布时间】:2016-04-09 14:13:32
【问题描述】:
我想从数组中计算最大值。我只使用了寄存器,但现在我在处理内存中的变量时遇到了麻烦。一开始我想让第一个数字成为最大值。我做了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
【问题讨论】:
-
你想让那个神奇的
&做什么?您不需要它来访问变量。 -
您不使用
&来表示地址。max是标签的地址。您的第二个问题是 Intel x86 指令不能使用两个内存操作数。您必须使用中间寄存器将其分解为两条指令。 -
我的意思是你必须分手的那一行是
movl array(, %edi, 4), &max。一个例子是movl array(, %edi, 4), %eaxmovl %eax, max -
cmpl $0, n在decl n之后不是必需的,因为如果n变为零,decl将自动设置零标志,因此无需额外与零进行比较。跨度> -
嗯,通常是的。但也有例外。就像
MOVS(B/W/D)一样,它使用固定索引寄存器/指针 (ESI/EDI) 将数据从内存移动到内存,而不使用任何寄存器。
标签: assembly x86 gnu-assembler att