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