版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/RGBMarco/article/details/81840979
在c里嵌入汇编玩玩,实现方式也多种多样,细究也会发现效率也千变万化,gcc不同的优化程度也的确很赞,省了好多汇编代码,下面用c和asm汇编实现一个两个无符号64位数的除法,来熟悉下操作,下面上代码!
#include <stdio.h>
#include <stdlib.h>
/*
* x in %rdi y in %rsi qp in %rdx rp in %rcx
* //operateion of 被除数
* movq %rdx, %r1
* movq %rdi, %rax
* cqto
* divq %rsi
* movq %rax, (%r1)
* movq %rdx, (%rcx)
* */
void uremdiv(unsigned long x,unsigned long y,unsigned long* qp,unsigned long* rp)
{
unsigned long q = x / y;
unsigned long r = x % y;
*qp = q;
*rp = r;
}
void asm_uremdiv(unsigned long x,unsigned long y,unsigned long* qp,unsigned long* rp)
{
__asm__ __volatile__ (
"movq %rdx, %r8; \
movq %rdi, %rax; \
cqto; \
divq %rsi; \
movq %rax, (%r8); \
movq %rdx, (%rcx)"
);
}
void dummy_asm_uremdiv(unsigned long x,unsigned long y,unsigned long* qp,unsigned long* rp)
{
__asm__ __volatile__ (
"movq %%rdx, %%r8\n\t"
"movq %2, %%rax\n\t"
"cqto\n\t"
"divq %3\n\t"
"movq %%rax, (%%r8)\n\t"
"movq %%rdx, %1\n\t"
: "=r" (qp), "=r" (*rp)
: "r" (x), "r" (y)
);
}
int main()
{
unsigned long qutoient;
unsigned long remainder;
uremdiv(6,5,&qutoient,&remainder);
printf("6 / 5 after uremdiv: qutoient: %lu remainder: %lu\n",qutoient,remainder);
asm_uremdiv(10,4,&qutoient,&remainder);
printf("10 /4 after asm_uremdiv: qutoient: %lu remainder: %lu\n",qutoient,remainder);
dummy_asm_uremdiv(40,3,&qutoient,&remainder);
printf("40 / 3 after dummy_asm_uremdiv: qutoient: %lu remainder: %lu\n",qutoient,remainder);
return 0;
}