首先,自己的作业应该自己做
这个题目我比较感兴趣,就写了一下
如果你是为了交作业的话,估计不会直接复制粘贴这个答案
不过这可以给你一个参考答案,你可以参考这个程序,然后自己写一个
sh-5.1$ cat main.c
#include <stdio.h>
#include <stdint.h>
typedef struct {
uint64_t pn, nn, zo;
} number_type_count_t;
void count(const char *data, size_t size, number_type_count_t *ntc) {
asm volatile("xorq %%rax, %%rax\n\t"
"movq %%rax, (%2)\n\t"
"movq %%rax, 8(%2)\n\t"
"movq %%rax, 16(%2)\n\t"
"movq %0, %%rdi\n\t"
"addq %1, %%rdi\n\t"
"1:cmpq %%rdi, %0\n\t"
"jge 5f\n\t"
"lodsb\n\t"
"testb %%al, %%al\n\t"
"jnz 2f\n\t"
"incq 16(%2)\n\t"
"jmp 4f\n\t"
"2:jns 3f\n\t"
"incq 8(%2)\n\t"
"jmp 4f\n\t"
"3:incq (%2)\n\t"
"4:jmp 1b\n\t"
"5:nop"
::"S"(data), "c"(size), "r"(ntc)
:"rax", "rdi");
}
int main(void) {
char data[10] = {1, 3, -9, -7, -8, -5, 0, 1, -1, 0};
number_type_count_t ntc;
count(data, 10, &ntc);
printf("%lu %lu %lu\n", ntc.pn, ntc.nn, ntc.zo);
return 0;
}
sh-5.1$ gcc -g -Wall -o main main.c
sh-5.1$ ./main
3 5 2
sh-5.1$
|