C与ASM汇编实践

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/RGBMarco/article/details/81840979