assembly at&t,无法比较数组中的值

问题描述 投票:0回答:0

我有一个问题要求我将两个数组(每个值都是一个 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)
    
assembly att
© www.soinside.com 2019 - 2024. All rights reserved.