• x86---32汇编(2)---局部变量


      在C/C++编程中,我们经常会用到局部变量,笔者想知道在汇编语言中是

    如何使用局部变量的,根据《X86汇编语言》中的例子,才弄懂了汇编是如何

    分配局部变量。用栈指针减去一个值(需要分配的内存大小)。

     代码:

    #include <stdio.h>
    #include <tchar.h>
    
    
    extern "C" void CalculateSums_(int a, int b, int c, int *s1, int *s2, int *s3);
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        
        int a = 3, b = 5, c = 8;
        int s1a, s2a, s3a;
    
        CalculateSums_(a, b, c, &s1a, &s2a, &s3a);
    
        //compute the sums again so we can verify the results
        //of CalculateSums_()
    
        int s1b = a + b + c;
        int s2b = a * a + b * b + c * c;
        int s3b = a * a*a + b * b*b + c * c*c;
    
        printf("Input:a:%4d b:%4d c:%4d
    ", a, b, c);
        printf("Output:s1a:%4d s2a:%4d s3a:%4d
    ", s1a, s2a, s3a);
        printf("s1b:%4d s2b:%4d s3b:%4d
    ",s1b,s2b,s3b);
    
    
        return 0;
    }
    main
        .model flat,c
        .code
    
    ; extern "C" void CalculateSums_(int a, int b, int c, int* s1, int* s2, int* s3);
    ;
    ; Description: This function demonstrates a complete assembly
    ; language prolog and epilog.
    ;
    ; Returns: None.
    ;
    ; Computes: *s1 = a + b + c
    ; *s2 = a * a + b * b + c * c
    ; *s3 = a * a * a + b * b * b + c * c * c
    
    CalculateSums_ proc
    
    ;Function prolog
        push ebp
        mov ebp,esp
        sub esp,12                ;Allocate local storage space
        push ebx
        push esi
        push edi
    
    ;Load arguments
        mov eax,[ebp+8]            ;eax="a"
        mov ebx,[ebp+12]        ;ebx='b'
        mov ecx,[ebp+16]        ;ecx='c'
        mov edx,[ebp+20]        ;edx='s1'
        mov esi,[ebp+24]        ;esi='s2'
        mov edi,[ebp+28]        ;edi='s3'
    
    ;Compute 's1'
        mov [ebp-12],eax
        add [ebp-12],ebx
        add [ebp-12],ecx        ;final 's1' result
    
    ;Compute 's2'
        imul eax,eax
        imul ebx,ebx
        imul ecx,ecx
        mov [ebp-8],eax
        add [ebp-8],ebx
        add [ebp-8],ecx            ;final 's2' result
    
    ;Compute 's3'
        imul eax,[ebp+8]
        imul ebx,[ebp+12]
        imul ecx,[ebp+16]
        mov [ebp-4],eax
        add [ebp-4],ebx
        add [ebp-4],ecx            ;final 's3' result
    
    ;Save 's1','s2','s3'
        mov eax,[ebp-12]
        mov [edx],eax            ;save 's1'
    
        mov eax,[ebp-8]            
        mov [esi],eax            ;save 's2'
    
        mov eax,[ebp-4]            
        mov [edi],eax            ;save 's3'
    
    ;Function epilog
        pop edi
        pop esi
        pop ebx
        mov esp,ebp
        pop ebp
        ret
    CalculateSums_ endp
        end
    func

    在vs2017上的运行效果:

  • 相关阅读:
    重构原则
    【重构:改善既有代码的设计】读书笔记——开篇
    C#值参数和引用参数
    使用Aspose.Cells利用模板导出Excel(C#)
    在MVC中使用rdlc格式的报表
    程序员如何高效学习
    IT 圈里有哪些经常被读错的词?
    VS2017生成解决方案报错,提示对路径的访问被拒绝
    JavaScript中的数值转换
    Xadmin的配置及使用
  • 原文地址:https://www.cnblogs.com/xuelanga000/p/13197117.html
Copyright © 2020-2023  润新知