我有一个问题要求我将两个数组(每个值都是一个 4 字节长的 int)合并到一个数组中。数组中的值按从高到低的顺序排列,因此需要是新数组。 数组都以 0 结尾,新数组也应该如此。
我通过获取内存标签获得的所有3个数组,然后需要将新数组保存在标签mergedArray的地址中。
但是,旧数组中的值可以出现多次,而新数组最多需要每个值出现一次。
我写的代码似乎工作正常,而数组没有值出现超过一次,但一旦任何值出现超过一次就会失败。
我试着将我在原始数组中的值与我在新数组中的值进行比较,如果相同则跳过它。
但是在运行一些测试之后,似乎添加或删除该比较对代码没有影响。
代码如下:
.global _start
.section .text
_start:
mov $array1, %rax
mov $array2, %rcx
mov $mergedArray, %r8
xor %r14,%r14
loopcheck: #checks if arrays are finished
movl (%rax), %r9d
movl (%rcx), %r10d
movl (%r8), %r11d
testl %r9d, %r9d
jz rest_of_array2
testl %r10d, %r10d
jz rest_of_array1
loop: #the main loop
cmp %r10d, %r9d
jg add_r9d
jmp add_r10d
add_r9d: #add rax value
cmp %r11d,%r9d
jz remove_current_r9d
mov %r9d, (%r8)
lea 4(%r8), %r14
mov %r14 , %r8
remove_current_r9d: #adv rax
lea 4(%rax), %r14
mov %r14, %rax
jmp loopcheck
add_r10d: #add rcx value
cmp %r11d, %r10d
jz remove_current_r10d
mov %r10d, (%r8)
lea 4(%r8),%r14
mov %r14, %r8
remove_current_r10d: #adv rcx
lea 4(%rcx), %r14
mov %r14, %rcx
jmp loopcheck
rest_of_array2: #adding the rest of array 2 once array 1 is finished
testl %r10d, %r10d
jz end
cmp %r10d,%r11d
jz finish_loop2
movl %r10d, (%r8)
lea 4(%r8),%r14
mov %r14, %r8
finish_loop2:
lea 4(%rcx), %r14
mov %r14 ,%rcx
movl (%rcx), %r10d
movl (%r8), %r11d
jmp rest_of_array2
rest_of_array1: #adding the rest of array 1 once array 2 is finished
testl %r9d,%r9d
jz end
cmp %r9d,%r11d
jz finish_loop1
movl %r9d, (%r8)
lea 4(%r8),%r14
mov %r14, %r8
finish_loop1:
lea 4(%rax),%r14
mov %r14 ,%rax
movl (%rax), %r9d
movl (%r8), %r11d
jmp rest_of_array1
end: #ennd
xor %r14,%r14
mov %r14, (%r8)