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 + -
显示快捷键?