ics Lab04

把一段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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容