a4q1.s
来自「ARM下 Implement matrix multiplication of 」· S 代码 · 共 456 行 · 第 1/2 页
S
456 行
; == Program Constants ==
.equ SWI_PrStr, 0x69
.equ SWI_PrInt, 0x6b
.equ SWI_Open, 0x66
.equ SWI_AlStr, 0x06
.equ SWI_Close, 0x68
.equ SWI_RdInt, 0x6c
.equ SWI_Exit, 0x11
.equ Console, 1
; == Code {Text} Segment ==
.text
.global _start
_start: ; == initialize values ==
;=================================
;open file for input
;=================================
ldr r0, =InputFileName ; set Name for input file
mov r1, #0 ; mode is input
swi SWI_Open ; open file for output
ldr r1, =InFileHandle ; load input file handle
str r0, [r1] ; save the file handle
;open file for output
ldr r0, =OutputFileName ; set Name for output file
mov r1, #1 ; mode is output
swi SWI_Open ; open file for output
ldr r1,=OutFileHandle ; load output file handle
str r0,[r1] ; save the file handle
;Welcome Message
ldr r1, =OutFileHandle ; parameter of output file handle
ldr r1, [r1]
ldr r2, =Welcome ; parameter of message pointer
stmfd sp!,{r1, r2} ; pass parameter to stack
bl PrintString ; PrintString(FileHandle,StringAddress),
passed by stack
add sp, sp, #8 ; clear stack
===Main Loop
;Main Loop
RS:
ldr r0, =InFileHandle ; load input file handle
ldr r0,[r0]
swi SWI_RdInt ; read the size
bcs Exit ; if reach the end of data then exit program
ldr r1, =Size ; store size to memory address =Size
str r0, [r1]
cmp r0, #0 ; if size is 0, print message and go to
beq Zero ; next RS
cmp r0, #5 ; if size is greater than 5, print message
bgt Big ; and ignore following 2*size*size integers
; and go to RS if not end of file.
;==========================
;read 1st matrix
;==========================
ldr r1, =InFileHandle ; parameter of input file handle
ldr r1, [r1]
ldr r2, =Size ; parameter of Size
ldr r2, [r2]
ldr r3, =MaxA ; parameter of pointer to storage matrix
stmfd sp!,{r1-r3} ; pass parameter to stack
bl ReadMat ; Get 1st Matrix from file
; ReadMat (FileHandle,Size,MatrixAddress) passed by stack
add sp, sp, #12 ; clear stack
;==========================
;read 2nd matrix
;==========================
ldr r3, =MaxB ; Address of 2nd matrix to be stored
stmfd sp!,{r1-r3} ; pass parameter to stack
bl ReadMat ; Get 2nd Matrix from file
; ReadMat (FileHandle,Size,MatrixAddress) passed by stack
add sp, sp, #12 ; clear stack
;==========================
;output header
;==========================
ldr r1, =OutFileHandle ; parameter of output file handle
ldr r1, [r1]
ldr r2, =Msg1 ; parameter of message pointer
stmfd sp!,{r1-r2} ; pass parameter to stack
bl PrintString ; PrintString(FileHandle,StringAddress),passed by stack
add sp, sp, #8 ; clear stack
;==========================
;output 1st matrix
;==========================
ldr r2, =MaxA ; parameter of 1st Matrix address
ldr r3, =Size ; parameter of matrix size
ldr r3, [r3]
stmfd sp!,{r1-r3} ; pass parameter to stack
bl PrintMat ; print 1st matrix
; PrintMat (FileHandle,MatrixAddress,Size) passed by stack
add sp, sp, #12 ; clear stack
;==========================
;output header
;==========================
ldr r2, =Msg2 ; parameter of message pointer
stmfd sp!,{r1-r2} ; pass parameter to stack
bl PrintString ; PrintString(FileHandle,StringAddress),passed by stack
add sp, sp, #8 ; clear stack
;==========================
;output 2nd matrix
;==========================
ldr r2, =MaxB ; parameter of 2nd Matrix address
stmfd sp!,{r1-r3} ; pass parameter to stack
bl PrintMat ; print 2nd matrix
; PrintMat (FileHandle,MatrixAddress,Size) passed by stack
add sp, sp, #12 ; clear stack
;==============================
;multiply matrix
;==============================
ldr r1, =MaxA ; parameter of address of matrix 1
ldr r2, =MaxB ; parameter of address of matrix 2
ldr r3, =MaxResult ; parameter of address of matrix result
ldr r4, =Size ; matrix size
ldr r4, [r4]
stmfd sp!,{r1-r4} ; pass parameters to stack
bl MatrixMultiply ; Multiply Matrix
; MatrixMultiply (M1,M2,M3,Size) passed by stack
add sp, sp, #16 ; clear stack
;==========================
;output result matrix
;==========================
ldr r1, =OutFileHandle ; parameter of output file handle
ldr r1, [r1]
ldr r2, =Msg3 ; parameter of message pointer
stmfd sp!,{r1,r2} ; pass parameter to stack
bl PrintString ; PrintString(FileHandle,StringAddress),passed by stack
add sp, sp, #8 ; clear stack
ldr r2, =MaxResult ; parameter of address of matrix result
ldr r3, =Size ; parameter of matrix size
ldr r3, [r3]
stmfd sp!,{r1-r3} ; pass parameter to stack
bl PrintMat ; print result matrix
; PrintMat (FileHandle,MatrixAddress,Size) passed by stack
add sp, sp, #12 ; clear stack
bal MainLoop ; Excute next matrix multiplication loop
;===========================Zero=========================================
;Zero
;after read a size of zero, this loop zero will be executed to output an
;error message and go to next read size loop
;========================================================================
Zero:
ldr r1, =OutFileHandle ; parameter of output file handle
ldr r1, [r1]
ldr r2, =MsgZero ; parameter of message pointer
stmfd sp!,{r1,r2} ; pass parameter to stack
bl PrintString ; PrintString(FileHandle,StringAddress),passed by stack
add sp, sp, #8 ; clear stack
bal RS ; read next Size
;===========================Big==========================================
;Big
;after read a size of greater than 5, this loop will be executed to output an
;error message and skip next 2*size*size integers, then go to next read size loop
;========================================================================
Big:
ldr r1, =OutFileHandle ; parameter of output file handle
ldr r1, [r1]
ldr r2, =MsgBig ; parameter of message pointer
stmfd sp!,{r1,r2} ; pass parameter to stack
bl PrintString ; PrintString(FileHandle,StringAddress),passed by stack
add sp, sp, #8 ; clear stack
ldr r1, =InFileHandle ; parameter of input file handle
ldr r1, [r1]
ldr r2, =Size ; parameter of matrix size
ldr r2, [r2]
stmfd sp!,{r1,r2} ; parameter pass to stack
bl SkipMatrix ; skip matrix
; SkipMatrix(FileHandle, Size) passed by stack
add sp, sp, #8 ; clear stack
bal RS ; go to next read size
;******** SkipMatrix *************************
; skip next 2*size*size integers from input file
; SkipMatrix(FileHandle, Size) passed by stack fp+8 fp+12
; r1= counter
; r2= output file handle
; r3= matrix size
; r4= 2*size*size (number of integers to be ignored)
SkipMatrix:
stmfd SP!, {r0-r10,FP,LR} ; store registers
add fp, sp, #44 ; set frame pointer
ldr r2, [fp, #8] ; r2=input file handle
ldr r3, [fp, #12] ; r3=size of skipped matrix
mul r4, r3, r3
mov r4, r4, lsl #1 ; r4=number of integers to be ignored(2*size*size)
mov r1, #0 ; r1 counter
SkipLoop:
mov r0, r2 ; input file handle
swi SWI_RdInt ; read the integer
bcs Exit ; reach the end of data, then exit program
add r1, r1, #1 ; update counter
cmp r4, r1 ; check if enough integers are skipped
bgt SkipLoop ; if not, skip next integer
ldmfd SP!, {r0-r10,FP,PC} ; otherwise return
;******** Exit *************************
; output exit message
; close output and input files
; exit program
Exit:
ldr r1, =OutFileHandle ; parameter of output file handle
ldr r1, [r1]
ldr r2, =MsgEnd ; parameter of message pointer
stmfd sp!,{r1,r2} ; pass parameter to stack
bl PrintString ; PrintString(FileHandle,StringAddress),passed by stack
add sp, sp, #8 ; clear stack
ldr r0, =OutFileHandle ; get output file handle
ldr r0, [r0]
swi SWI_Close ; close file
ldr r0, =InFileHandle ; get input file handle
ldr r0, [r0]
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?