2016-06-17 18 views
0

我希望得到一些幫助下面給出的代碼。該代碼應該爲表格引用一個參考,對象的數量並計算有多少個負值和奇數值。 然後它應該將負數值發送到存儲器中的一個表中,並將奇數值發送到存儲器中的另一個表中。 我試圖比較零,我試圖找到最後一點,我試圖XOR的註冊表,沒有任何工作。所有值都是長長類型是重要的。大會64位氣體,計數奇數和負數

.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 

而 「C」 程序調用該函數

#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

謝謝您的見解的答覆。是的,我與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