📄 load.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 + -