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;
}
あなたは 'INC%r8'どのくらいそれがR8に追加するんですか?長いロング・バリューはどれくらいですか? –
デバッガでアセンブリコードをステップ実行する必要があります。あなたはコードをステップ実行するときにレジスタに何が入っているのかを見ることができます。 –
私はそれがあなたの元々の問題の根源だと思うので、私はr8を言います。あなたの支店の指示にはまだ問題があります。あなたの質問のタイトルは、奇数を見つけることを言いますが、変数名は偶数を見つけることを示唆しています。 –