2016-06-17 5 views
0

以下のコードを参考にしていただきたいと思います。コードは、テーブルの参照、オブジェクトの数をとって、負の値と奇数の数を数えます。 次に、負の値の数をメモリの1つのテーブルに送信し、奇数の数をメモリの他のテーブルに送信する必要があります。 私はゼロと比較しようとしました、私は最後のビットを見つけることを試みた、私はレジストリのxorを試した、何も動作しません。すべての値が長いlong型であることが重要です。アセンブリー64ビットGAS、奇数と偶数のカウント

.type max_1_ind, @function 
.global max_1_ind 

max_1_ind: 
    movq %rdi, %r8   # object table address from rdi to r8 
    xor  %r11, %r11 
    xor  %r12, %r12 
    movq %rcx, %r14  # rcx is needed for the loop 
    movq %rsi, %rcx  # number of objects for the loop counter 
    xor  %r15, %r15 
loop: 
    movq (%r8), %r15 
    and  $1, %r15   
    jc  increase 
continue: 
    movq  (%r8), %r15 
    test  %r15, %r15 
    jne  increase2    
continue2: 
    inc  %r8     
    dec  %rcx 
    cmpq  $0, %rcx 
    jne  loop 

    movq  %r11, (%rdx) 
    movq  %r14, %rcx 
    movq  %r12, (%rcx) 

finish: 
    xor  %rax, %rax 
    ret 

increase: 
    inc  %r11     
    jmp  continue 
increase2: 
    inc  %r12     
    jmp  continue2 

そして

#include <stdio.h> 
#include <stdlib.h> 

extern long long max_1_ind(long long *tab, long long n, long long *even_cnt, long long *neg_cnt); 

int main(void) { 
    long long tab[4] = {6, 2, -20, 3}; 
    long long count = 4; 
    long long even_cnt[1] = {0}; 
    long long neg_cnt[1] = {0}; 
    max_1_ind(tab, count, even_cnt, neg_cnt); 
    printf("Result: %lld, %lld\n", *even_cnt, *neg_cnt); 
    return 0; 
} 
+0

あなたは 'INC%r8'どのくらいそれがR8に追加するんですか?長いロング・バリューはどれくらいですか? –

+1

デバッガでアセンブリコードをステップ実行する必要があります。あなたはコードをステップ実行するときにレジスタに何が入っているのかを見ることができます。 –

+0

私はそれがあなたの元々の問題の根源だと思うので、私はr8を言います。あなたの支店の指示にはまだ問題があります。あなたの質問のタイトルは、奇数を見つけることを言いますが、変数名は偶数を見つけることを示唆しています。 –

答えて

0

この関数を呼び出し、 "C" プログラムは、あなたの洞察に満ちた答えをいただき、ありがとうございます。はい、私はincと間違えました。今すぐコードが正しく動作します。

#include <stdio.h> 
#include <stdlib.h> 

extern long long max_1_ind(long long *tab, long long n, long long *even_cnt, long long *neg_cnt); 

int m(long long * tab, long long n, long long *even_cnt, long long *neg_cnt){ 
     int counter = n; 
    while(counter>-1){ 
      //printf("%lld \n",tab[counter]); 
     if(tab[counter]<0){ 
      neg_cnt[0]++; 
     } 
       if ((tab[counter] & 1) ==0){ 
      even_cnt[0]++; 
     } 
     counter--; 
    } 
     return 0; 
} 

int main(void) { 
    long long tab[4] = {6, 40, -20, -3}; 
    long long count = 4; 
    long long even_cnt[1] = {0}; 
    long long neg_cnt[1] = {0}; 
    max_1_ind(tab, count, even_cnt, neg_cnt); 
    printf("Wynik Asembler: %lld, %lld\n", *even_cnt, *neg_cnt); 
    return 0; 
} 

とアセンブリコード:

.type max_1_ind, @function 
#long long max_1_ind(long long *tab, long long n, long long *even_cnt, long long *neg_cnt); 
.global max_1_ind 

       # %rdi, %rsi, %rdx, %rcx, %r8 and %r9 


max_1_ind: 
    movq %rdi, %r8   
     xor  %r11, %r11 
     xor  %r12, %r12 
     movq %rsi, %rcx   
     xor  %r15, %r15 

loop: 
     movq (%r8), %r15 
     andq $1, %r15   
     jz  increase 

continue: 
     movq  (%r8), %r15 
     testq %r15, %r15 
     js  increase2 

continue2: 
     addq  $8, %r8     
     dec  %rcx 
     cmpq  $0, %rcx 
     jne  loop 

     movq  %r11, (%rdx) 
     movq  %r14, %rcx 
     movq  %r12, (%rcx) 

finish: 
     xor  %rax, %rax 
     ret 

increase: 
     inc  %r11     
     jmp  continue 

increase2: 
     inc  %r12     
     jmp  continue2 
関連する問題