📄 asm_dct.s
字号:
AREA DCT_DATA,DATA,READWRITE
origin_array SPACE 4096 ;存放原始矩阵
xishu_array SPACE 4096 ;存放系数矩阵
xishu_array_t SPACE 4096 ;存放系数矩阵的转置
middle_array SPACE 16384 ;存放系数矩阵和原始矩阵的乘积结果
result_array SPACE 16384
final_array SPACE 4096 ;存放最终的结果
AREA DCT_CODE,CODE,READONLY
ENTRY
start
;矩阵的转置
LDR R0,=xishu_array ;系数矩阵的首地址
LDR R1,=xishu_array_t ;转置矩阵的首地址
MOV R3,#0 ;x
loopx
MOV R4,#0 ;y
loopy
MOV R5,R4,LSL #6
ADD R6,R5,R3
LDRSB R7,[R0,R6]
MOV R8,R3,LSL #6
ADD R9,R8,R4
STRB R7,[R1,R9]
ADD R4,R4,#1
CMP R4,#64
BNE loopy
ADD R3,R3,#1
CMP R3,#64
BNE loopx
;系数矩阵与源矩阵相乘
LDR R0,=xishu_array
LDR R1,=origin_array
LDR R2,=middle_array
MOV R3,#0 ;i
row1
MOV R4,#0 ;l
colum1
MOV R11,#0 ;保存结果矩阵的每个元素值
MOV R5,#0 ;j
mul1
MOV R6,R3,LSL #6 ;保存第一个数组的元素
ADD R6,R6,R5
LDRSB R7,[R0,R6]
MOV R8,R5,LSL #6 ;保存第二个数组的元素
ADD R8,R8,R4
LDRB R9,[R1,R8]
MUL R10,R7,R9 ;每个元素相乘,保存到R9中
ADD R11,R11,R10
ADD R5,R5,#1
CMP R5,#64
BNE mul1
STR R11,[R2],#4 ;保存求得第一个元素值
ADD R4,R4,#1
CMP R4,#64
BNE colum1
ADD R3,R3,#1
CMP R3,#64
BNE row1
;中间结果矩阵与系数转置矩阵相乘
LDR R0,=middle_array
LDR R1,=xishu_array_t
LDR R2,=result_array
MOV R3,#0 ;i
row2
MOV R4,#0 ;l
colum2
MOV R11,#0 ;保存结果矩阵的每个元素值
MOV R5,#0 ;j
mul2
MOV R6,R3,LSL #6 ;保存第一个数组的元素
ADD R6,R6,R5
LDR R7,[R0,R6,LSL #2]
MOV R8,R5,LSL #6 ;保存第二个数组的元素
ADD R8,R8,R4
LDRSB R9,[R1,R8]
MUL R10,R7,R9 ;每个元素相乘,保存到R9中
ADD R11,R11,R10
ADD R5,R5,#1
CMP R5,#64
BNE mul2
STR R11,[R2],#4 ;保存求得第一个元素值
ADD R4,R4,#1
CMP R4,#64
BNE colum2
ADD R3,R3,#1
CMP R3,#64
BNE row2
LDR R0,=result_array
LDR R1,=final_array
MOV R10,#0 ;计数器
MOV R9,#0
MOV R8,#255
begin
LDR R2,[R0],#4
MOV R3,R2,ASR #14
CMP R3,R9
BLT loop1
CMP R3,R8
BGT loop2
STRB R3,[R1],#1
B result
loop1
STRB R9,[R1],#1
B result
loop2
STRB R8,[R1],#1
B result
result
ADD R10,R10,#1
CMP R10,#4096
BNE begin
stop
MOV r0,#0x18 ; angel_SWIreason_ReportException
LDR r1,=0x20026 ; ADP_Stopped_ApplicationExit
SWI 0x123456 ; ARM semihosting SWI
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -