• x86---32汇编(1)---乘除法


      最近想优化一下代码的运行速度,笔者就想着汇编的效率比较高,所以就看网上的一些书籍,

    练习了一下汇编,乘除法的指令imul和idiv。

    代码:

    #include <stdio.h>
    #include <tchar.h>
    
    
    extern "C" int IntegerMulDive_(int a, int b, int *prod, int *quo, int *rem);
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        int a = 21, b = 9;
        int prod = 0, quo = 0, rem = 0;
        int rc;
        rc = IntegerMulDive_(a, b, &prod, &quo, &rem);
        printf("Input1-a:%4d b:%4d
    ", a, b);
        printf("Output1-rc:%4d prod:%4d
    ",rc,prod);
        printf("quo:%4d rem:%4d
    
    ", quo, rem);
    
        a = -29;
        prod = quo = rem = 0;
        rc = IntegerMulDive_(a, b, &prod, &quo, &rem);
        printf("Input2-a:%4d b:%4d
    ", a, b);
        printf("Output-2-rc:%4d prod:%4d
    ",rc,prod);
        printf("quo:%4d rem:%4d
    
    ", quo, rem);
    
        b = 0;
        prod = quo = rem = 0;
        rc = IntegerMulDive_(a, b, &prod,&quo, &rem);
        printf("Input3-a:%4d b:%4d
    ", a, b);
        printf("Output3-rc:%4d prod:%4d
    ", rc, prod);
        printf("quo:%4d rem:%4d
    
    ", quo, rem);
    
    
        return 0;
    }
    main
        .model flat,c
        .code
    
    ; extern "C" int IntegerMulDiv_(int a, int b, int* prod, int* quo, int*rem);
    ; Description: This function demonstrates use of the imul and idiv
    ; instructions. It also illustrates pointer usage.
    ;
    ; Returns: 0 Error (divisor is zero)
    ; 1 Success (divisor is zero)
    ;
    ; Computes: *prod = a * b;
    ; *quo = a / b
    ; *rem = a % b
    
    IntegerMulDive_ proc
    ;Function prolog
        push ebp
        mov ebp,esp
        push ebx
    
    ;Make sure the divisor is not zero
        xor eax,eax            ;set error return code
        mov ecx,[ebp+8]        ;ecx='a'
        mov edx,[ebp+12]    ;edx='b'
        or edx,edx
        jz InvalidDivisor    ;jump if 'b' is zero
    
    ;Calulate product and save result
        imul edx,ecx        ;edx='a'*'b'
        mov ebx,[ebp+16]    ;ebx='prod'
        mov [ebx],edx        ;save product
    
    ;Calculate quotient and remainder,save results
        mov eax,ecx            ;eax='a'
        cdq                    ;edx:eax contains dividend
        idiv dword ptr [ebp+12]        ;eax=quo,edx=rem
    
        mov ebx,[ebp+20]            ;ebx='quo'
        mov [ebx],eax                ;save quotient
        mov ebx,[ebp+24]            ;ebx='rem'
        mov [ebx],edx                ;save remainder
        mov eax,1                    ;set success return code
    
    ;Function epilog
    InvalidDivisor:
        pop ebx
        pop ebp
        ret
    IntegerMulDive_ endp
        end
    View Code

    运行效果:

  • 相关阅读:
    MysqlServer如何实现成功卸载,并成功安装
    win7安装xampp,提示windows找不到-n文件(安装成功后,443端口占用,apache服务器无法正常启动)
    (JS实现顾客商品浏览记录以及购物车)Cookie的保存与删除
    (转)SVN 服务端、客户端安装及配置、导入导出项目
    正则表达式详解
    Struts2.3.4+Hibernate4.2.4+Mysql6.0整合
    CSS中TRBL和position关系
    const typedef #define
    数组的替代品
    输入
  • 原文地址:https://www.cnblogs.com/xuelanga000/p/13194088.html
Copyright © 2020-2023  润新知