把一段c语言(?)代码转成汇编:
typedef int i16;
typedef unsigned int u16;
i16 func(i16 n, i16 a, i16 b, i16 c, i16 d, i16 e, i16 f){ //Lots of arguments
i16 t = GETC() - '0' + a + b + c + d + e + f;
if(n > 1){
i16 x = func(n - 1, a, b, c, d, e, f);
i16 y = func(n - 2, a ,b, c, d, e, f);
return x + y + t - 1;
}else{
return t;
} }
i16 main(void){
i16 n = GETC() - '0';
return func(n, 0, 0, 0, 0, 0, 0);
}
_Noreturn void __start(){
/*
Here is where this program actually starts executing.
Complete this function to do some initialization in your compiled assembly.
TODO: Set up C runtime.
*/
u16 __R0 = main(); //The return value of function main() should be moved to R0.
HALT();
}
帧指针:相当于stack的迭代器。
.ORIG x3000
START AND R0,R0,#0 ;初始化寄存器
AND R1,R1,#0
AND R2,R2,#0
AND R3,R3,#0
AND R4,R4,#0
AND R5,R5,#0
AND R6,R6,#0
AND R7,R7,#0
LD R6,STACK ;初始化栈指针
ADD R5,R6,#0 ;初始化帧指针
JSR MAIN
DONE HALT
MAIN ST R7,SaveR7
JSR TEST_OVERFLOW
LD R7,SaveR7
ADD R6,R6,#1 ;返回地址进栈
STR R7,R6,#0
GETC ;n=GETC()-'0'
JSR TEST_NUM
LD R1,ZERO
ADD R1,R0,R1
JSR TEST_OVERFLOW
ADD R6,R6,#1 ;帧指针进栈
STR R5,R6,#0
JSR TEST_OVERFLOW
ADD R6,R6,#1 ;预留返回值空间
JSR TEST_OVERFLOW
LD R0,F ;f-a进栈
ADD R6,R6,#1
STR R0,R6,#0
JSR TEST_OVERFLOW
LD R0,E
ADD R6,R6,#1
STR R0,R6,#0
JSR TEST_OVERFLOW
LD R0,D
ADD R6,R6,#1
STR R0,R6,#0
JSR TEST_OVERFLOW
LD R0,C
ADD R6,R6,#1
STR R0,R6,#0
JSR TEST_OVERFLOW
LD R0,B
ADD R6,R6,#1
STR R0,R6,#0
JSR TEST_OVERFLOW
LD R0,A
ADD R6,R6,#1
STR R0,R6,#0
JSR TEST_OVERFLOW
ADD R6,R6,#1 ;n进栈
STR R1,R6,#0
ADD R5,R6,#0 ;设置新的帧指针
JSR FUNC
ADD R6,R6,#-7 ;参数出栈
LDR R0,R6,#0 ;返回值出栈,赋给R0
ADD R6,R6,#-1
LDR R5,R6,#0 ;帧指针出栈,赋给R5
ADD R6,R6,#-1
LDR R7,R6,#0 ;返回地址出栈,赋给R7
ADD R6,R6,#-1
RET
;R1=t,R2=x,R3=y
FUNC ST R7,SaveR7
JSR TEST_OVERFLOW
LD R7,SaveR7
ADD R6,R6,#1 ;返回地址入栈
STR R7,R6,#0
GETC ;t=GETC()
JSR TEST_NUM
LD R1,ZERO ;-'0'
ADD R1,R1,R0
LDR R0,R5,#-1 ;a
ADD R1,R1,R0
LDR R0,R5,#-2 ;b
ADD R1,R1,R0
LDR R0,R5,#-3 ;c
ADD R1,R1,R0
LDR R0,R5,#-4 ;d
ADD R1,R1,R0
LDR R0,R5,#-5 ;e
ADD R1,R1,R0
LDR R0,R5,#-6 ;f
ADD R1,R1,R0
LDR R4,R5,#0 ;if(n>1)
ADD R4,R4,#-1
BRnz ELSE
;x=func(n-1)
JSR TEST_OVERFLOW
ADD R6,R6,#1 ;帧指针进栈
STR R5,R6,#0
JSR TEST_OVERFLOW
ADD R6,R6,#1 ;t进栈
STR R1,R6,#0
JSR TEST_OVERFLOW
ADD R6,R6,#1 ;预留返回值空间
JSR TEST_OVERFLOW
LDR R0,R5,#-6 ;f-a进栈
ADD R6,R6,#1
STR R0,R6,#0
JSR TEST_OVERFLOW
LDR R0,R5,#-5
ADD R6,R6,#1
STR R0,R6,#0
JSR TEST_OVERFLOW
LDR R0,R5,#-4
ADD R6,R6,#1
STR R0,R6,#0
JSR TEST_OVERFLOW
LDR R0,R5,#-3
ADD R6,R6,#1
STR R0,R6,#0
JSR TEST_OVERFLOW
LDR R0,R5,#-2
ADD R6,R6,#1
STR R0,R6,#0
JSR TEST_OVERFLOW
LDR R0,R5,#-1
ADD R6,R6,#1
STR R0,R6,#0
JSR TEST_OVERFLOW
ADD R0,R4,#0 ;n-1进栈
ADD R6,R6,#1
STR R0,R6,#0
ADD R5,R6,#0 ;设置新的帧指针
JSR FUNC
ADD R6,R6,#-7 ;参数出栈
LDR R2,R6,#0 ;返回值出栈,赋给R2
ADD R6,R6,#-1
LDR R1,R6,#0 ;t出栈
ADD R6,R6,#-1
LDR R5,R6,#0 ;帧指针出栈,赋给R5
ADD R6,R6,#-1
;y=func(n-2)
JSR TEST_OVERFLOW
ADD R6,R6,#1 ;帧指针进栈
STR R5,R6,#0
JSR TEST_OVERFLOW
ADD R6,R6,#1 ;t,x进栈
STR R1,R6,#0
JSR TEST_OVERFLOW
ADD R6,R6,#1
STR R2,R6,#0
JSR TEST_OVERFLOW
ADD R6,R6,#1 ;预留返回值空间
JSR TEST_OVERFLOW
LDR R0,R5,#-6 ;f-a进栈
ADD R6,R6,#1
STR R0,R6,#0
JSR TEST_OVERFLOW
LDR R0,R5,#-5
ADD R6,R6,#1
STR R0,R6,#0
JSR TEST_OVERFLOW
LDR R0,R5,#-4
ADD R6,R6,#1
STR R0,R6,#0
JSR TEST_OVERFLOW
LDR R0,R5,#-3
ADD R6,R6,#1
STR R0,R6,#0
JSR TEST_OVERFLOW
LDR R0,R5,#-2
ADD R6,R6,#1
STR R0,R6,#0
JSR TEST_OVERFLOW
LDR R0,R5,#-1
ADD R6,R6,#1
STR R0,R6,#0
JSR TEST_OVERFLOW
LDR R4,R5,#0
ADD R4,R4,#-2 ;n-2进栈
ADD R6,R6,#1
STR R4,R6,#0
ADD R5,R6,#0 ;设置新的帧指针
JSR FUNC
ADD R6,R6,#-7 ;参数出栈
LDR R3,R6,#0 ;返回值出栈,赋给R3
ADD R6,R6,#-1
LDR R2,R6,#0 ;x,t出栈
ADD R6,R6,#-1
LDR R1,R6,#0
ADD R6,R6,#-1
LDR R5,R6,#0 ;帧指针出栈,赋给R5
ADD R6,R6,#-1
ADD R1,R1,R2 ;return x+y+t-1
ADD R1,R1,R3
ADD R1,R1,#-1
ELSE STR R1,R5,#-7 ;return t
LDR R7,R6,#0 ;返回地址出栈,赋给R7
ADD R6,R6,#-1
RET
TEST_OVERFLOW ;Error handling:检测栈是否溢出
ST R0,SaveR0
LD R0,MAX
NOT R0,R0
ADD R0,R0,#1
ADD R0,R0,R6
BRn #3
LEA R0,ERROR1
PUTS
LEA R7,DONE
LD R0,SaveR0
RET
TEST_NUM ;Error handling:检测输入的字符是不是0-9
ST R1,SaveR1
LD R1,ZERO
ADD R1,R0,R1
BRn STOP
ADD R1,R1,#-10
BRp STOP
LD R1,SaveR1
RET
STOP LEA R0,ERROR2
PUTS
LEA R7,DONE
RET
STACK .FILL x3112
ZERO .FILL #-48
A .FILL #0
B .FILL #0
C .FILL #0
D .FILL #0
E .FILL #0
F .FILL #0
RES .FILL #0
SaveR0 .BLKW 1
SaveR1 .BLKW 1
SaveR7 .BLKW 1
ERROR1 .STRINGZ "The stack overflowed!"
ERROR2 .STRINGZ "The input is not a number!"
MAX .FILL x7FFD
.END