📄 dotprod_func.asm
字号:
///////////////////////////////////////////////////////////////////////////////
//
// FILE: dotprod_func.asm
//
// A hand-tuned assembly version of a_dot_c
//
///////////////////////////////////////////////////////////////////////////////
#define N 20
.section/data data1;
.var saveI7; // memory location to save off i7
.global saveI7;
.GLOBAL _a_dot_c_asm;
.section/code my_asm_section;
_a_dot_c_asm:
DM(saveI7) = i7; // i7 is preserved, must save/restore
ax1 = dm(1, i4); // fetch a[] pointer from stack
i7 = ax1; // assign i7 as a[] pointer
reg(b7) = ax1; // set base register of i7 for circular buffering
ax1 = dm(2, i4); // fetch c[] pointer from stack
i0 = ax1; // assign i0 as c[] pointer
reg(b0) = ax1; // set base register of i6 for circular buffering
l7 = 0; // clear the l7 length register
l0 = 0; // clear the l0 length register
M7 = 1; // set modify reg to 1 so that we can pull each element of a[] out of memory
M0 = 1; // set modify reg to 1 so that we can pull each element of c[] out of memory
MR = 0; // make sure MR is cleared before we use it
MX0 = DM(I0,M0); // put first element in a[] into MX0
MY0 = PM(I7,M7); // put first element in b[] into MY0
CNTR=N;
DO dploop UNTIL CE;
dploop: MR=MR+MX0*MY0(ss), MX0=DM(I0,m0), MY0=PM(I7,m7); // multiply our 2 array values and add to MR,
// then get our next array values
RTS(db); // return from subroutine, you can do exactly 2 instructions after this
i7 = DM(saveI7); // restore value in i7
ax1 = mr0; // our return value is expected to be in ax1 if returning a WORD
asm_end:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -