⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 load.asm

📁 1、(1)32bit乘法的指令解释 (2)volume1的load.asm基础上实现一个 16bit数组的乘法累加的函数
💻 ASM
字号:

;void addarr3(int * arr1, int * arr2, int * arr3, int * arr4, int n);
;主函数传递参数     A4         B4           A6       B6         A8

;void addarr2(int * arr1, int * arr2, int * arr3, n);
;                   A4        B4         A6      B6 

;B3 保存返回地址
;堆栈指针SP=B15;数据页指针DP=B14
;主调保存 A0~A9 B0~B9  
;被调保存 A10~A15 B10~B15  

;注意堆栈  先进后出
;如何 push pop操作  B15=SP代表什么


       
       .global _addarr3
       .global _addarr2
       .text


_addarr3: ;push操作
          ;_addarr3的堆栈要自己管理: pop与push配对
          ;C函数_addarr2的堆栈,编译器管理 分配与回收恢复(B15)
          ;在调用_addarr2前,作为主调的_addarr3应保存A0~A9,B0~B9中的 _addarr2返回后 _addarr3还要用的部分
          
          STW .D2T2  B3,*B15--  ; _addarr3 返回地址的保护

          ; _addarr3 的参数的保存  在调用_addarr2前,主调_addarr3保存
          STW .D2T2  B6,*B15-- ; arr4
          STW .D2T1  A8,*B15-- ; n
          STW .D2T1  A6,*B15-- ; arr3

          
          ;_addarr3层次没有使用B10~B15,A10~A15, 不用压栈保存
          
          
          
;******调用C子函数 void addarr2(int * arr1, int * arr2, int * arr3, n);
       ;传递参数A4,B4,A6,B6
;void addarr2(int * arr1, int * arr2, int * arr3, n);
;                   A4        B4         A6      B6 

          ;A4  _addarr3的参数直传
          ;B4  _addarr3的参数直传
          MV   B6,A6   ;_addarr3的B6 (arr4)
          MV   A8,B6   ; _addarr3的A8 (n)
          MVKL    addarr2_out ,B3   ;传递返回地址
          MVKH    addarr2_out ,B3 
          MVKL  _addarr2,B0       ;C函数入口
          MVKH  _addarr2,B0
          B  B0                     ;Call C函数
          nop 5
                    
;********************************
          
addarr2_out: ;一系列pop操作
             ADD .L2 4,B15,B15             
             LDW .D2T1 *B15++,A6 ;arr3              A6
             LDW .D2  *B15++,B0 ;n                  A8-->B0 循环计数
             LDW .D2  *B15++,B6 ;arr4               B6
             LDW .D2  *B15++,B3 ;_addarr3的返回地址 B3
             NOP  4
             
                    
loop:      
             LDW  .D1    *A6++,A2   ;A2+A3
             LDW  .D2T1  *B6++,A3   ;目的/源寄存器在同一组的 LD /ST 不可并 
             NOP          4
             
             ADD  .L1  A3,A2,A3
             
             STW .D2T1   A3,*-B6[1]
           ||SUB .S2     B0,1,B0

           
        [B0] B   .S2   loop 
             
             nop 5  
                    
lend:   B B3    
        nop 5  ; return     
        .end 
        
                                                    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -