- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I have this assembly code that takes two sorted arrays and merges them to one merged array without repetition:
.global main .section .text main: lea (array1), %rax lea (array2), %rbx lea (mergedArray), %rcx loop_hw1_ex3: cmp $0,(%rax) je exit cmp $0,(%rbx) je exit movl (%rax), %edx movl (%rbx), %esi leaq 4(%rbx), %rdi movl (%rdi), %edi cmp %esi,%edi # checking if there is repetition in first array jne no_rep_Label_hw1 leaq 4(%rbx), %rbx jmp loop_hw1_ex3 no_rep_Label_hw1: leaq 4(%rax), %rdi movl (%rdi), %edi cmp %edx,%edi # checking if there is repetition in second array jne no_rep_Label2_hw1 leaq 4(%rax), %rax jmp loop_hw1_ex3 no_rep_Label2_hw1: cmpl %edx, %esi ## main compare to sort it fails after a while jle less_equal_Label_hw1 movl %esi, (%rcx) leaq 4(%rcx) ,%rcx leaq 4(%rbx), %rbx jg bigger_Label_hw1 less_equal_Label_hw1: je rax_eq_rbx_label_hw1 movl %edx, (%rcx) leaq 4(%rcx) ,%rcx rax_eq_rbx_label_hw1: # there both arrays have same val so I move one forward leaq 4(%rax), %rax bigger_Label_hw1: jmp loop_hw1_ex3 exit: #this the part when one of them has ended and we only need to continue with the other one loop2_hw1_ex3: cmp $0,(%rbx) je no_loop2 movl (%rbx), %esi leaq 4(%rbx), %rdi movl (%rdi), %edi cmp %esi,%edi je rep_label_hw1 movl %esi, (%rcx) leaq 4(%rcx),%rcx rep_label_hw1: leaq 4(%rbx),%rbx jmp loop2_hw1_ex3 no_loop2: loop3_hw1_ex3: cmp $0,(%rax) je no_loop3 movl (%rax), %edx leaq 4(%rax), %rdi movl (%rdi), %edi cmp %edx,%edi je rep_label_hw1 movl %edx, (%rcx) leaq 4(%rcx),%rcx rep_label2_hw1:leaq 4(%rax),%rax jmp loop3_hw1_ex3 no_loop3:
I added the whole code so that maybe you would want to run it on your machine as well. and this is the test I'm doing:
#test mov $mergedArray, %rax cmpl $3938153337, 0(%rax) jne bad_exit cmpl $3921428393, 4(%rax) jne bad_exit cmpl $3860874895, 8(%rax) jne bad_exit cmpl $3793010036, 12(%rax) jne bad_exit cmpl $3728920121, 16(%rax) jne bad_exit cmpl $3652968237, 20(%rax) jne bad_exit cmpl $2810665667, 24(%rax) jne bad_exit cmpl $2734063791, 28(%rax) jne bad_exit cmpl $2534193645, 32(%rax) jne bad_exit cmpl $2311096085, 36(%rax) jne bad_exit#########3 syscall bad_exit: movq $60, %rax movq $1, %rdi syscall .section .data array1: .int 3938153337, 3860874895, 3793010036, 2810665667, 2734063791, 2311096085, 2083910944, 2062799482, 2029885871, 1979220646, 1968205798, 1855504373, 1824017782, 1629103669, 1437682032, 1364807752, 1269411879, 1167414194, 838087726, 676572428, 595215934, 309552879, 114306948, 6088819, 5996561, 0 array2: .int 3938153337, 3938153337, 3921428393, 3728920121, 3652968237, 2534193645, 2046175771, 1968205798, 1925687059, 1292648006, 165804778, 0 mergedArray: .zero 34
so the code fail when coming to the value 2311096085 , for some reason it keeps considering every other value in the second array bigger and therefore it gets sorted the wrong way, PS: the sorting is from big to small I have debugged it on SASM but I couldn't figure what happened wrong since the values before that were sorted correctly.
Link Copied
0 Replies

Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page