我正在 x86 汇编中进行快速排序,我需要交换数组 A[pivot] 和 A[j] 的两个元素,但我什至无法为数组索引分配值,更不用说交换元素了。
数组是这样分配的:
A: .long 2,1,8,6,12
我最初的交换计划根本不起作用,所以我将其简化为了解我的问题所在。我尝试了多种方法来获得正确的结果,但都导致错误的值或分段错误
movl A(,%ebx,4), %eax #eax = A[pivot]
movl A(,%edi,4), %edx #edx = A[j]
#ebx = pivot = 0
#edi = j = 1
pushl %eax
pushl $test7 #"A[pivot] = %d"
call printf
addl $8, %esp # A[0] = 2
pushl %edx
pushl $test8 #"A[j] = %d"
call printf
addl $8, %esp #A[1] = 1
此代码段返回:
A[pivot] = 2
A[j] = -143535296
A[pivot] = A[0] = 2,所以这是正确的,但是 A[j] = A[1] = 1
当 %ebx 和 %edi 是两个数组索引以查看它们的内容或更改它们的值时,这是引用数组元素的正确方法吗?
无法弄清楚我做错了什么,任何帮助将不胜感激。
编辑:另外,如果我使用 A(,[index],4) 作为 printf 参数,它会显示正确的值。
编辑1:我意识到为什么我的 printf 语句不正确,我更改了代码,它返回了似乎是正确的内存地址。addr[A] = 134513652 和 addr[A+1] = 134513656。我原来更改数组值的问题仍然存在,但执行此操作时仍然出现分段错误:
leal A(,%ebx,4), %ecx # ecx = addr[A[0]]
movl A(,%edi,4), %edx # edx = A[1]
movl %edx, (%ecx) # (ecx) = edx