|
发表于 2023-2-4 19:50:48
|
显示全部楼层
首先,自己的作业应该自己做
这个题目我比较感兴趣,就写了一下
如果你是为了交作业的话,估计不会直接复制粘贴这个答案
不过这可以给你一个参考答案,你可以参考这个程序,然后自己写一个
- 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$
复制代码 |
|