⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dhry_2.s79

📁 ARM入门的好帮手.包含了从简单到相对较复杂的程序.
💻 S79
字号:
        NAME dhry_2

        RTMODEL "__code_model", "small"
        RTMODEL "__cpu_mode", "arm"
        RTMODEL "__data_model", "absolute"
        RTMODEL "__endian", "little"
        RTMODEL "__rt_version", "2"
        RTMODEL "__thumb_aware", "enabled"

        RSEG CSTACK:DATA:NOROOT(2)

        EXTERN Int_Glob
        EXTERN Ch_1_Glob

        PUBLIC Func_1
        FUNCTION Func_1,0203H
        PUBLIC Func_2
        FUNCTION Func_2,0203H
        LOCFRAME CSTACK, 8, STACK
        PUBLIC Func_3
        FUNCTION Func_3,0203H
        PUBLIC Proc_6
        FUNCTION Proc_6,0203H
        LOCFRAME CSTACK, 4, STACK
        PUBLIC Proc_7
        FUNCTION Proc_7,0203H
        PUBLIC Proc_8
        FUNCTION Proc_8,0203H
        LOCFRAME CSTACK, 16, STACK
; C:\At91\software\projects\bench\Source\dhry_2.c
;     1 /*
;     2  ****************************************************************************
;     3  *
;     4  *                   "DHRYSTONE" Benchmark Program
;     5  *                   -----------------------------
;     6  *
;     7  *  Version:    C, Version 2.1
;     8  *
;     9  *  File:       dhry_2.c (part 3 of 3)
;    10  *
;    11  *  Date:       May 25, 1988
;    12  *
;    13  *  Author:     Reinhold P. Weicker
;    14  *
;    15  ****************************************************************************
;    16  */
;    17 
;    18 #include "dhry.h"
;    19 #include <string.h>
;    20 
;    21 #ifndef REG
;    22 #define REG
;    23         /* REG becomes defined as empty */
;    24         /* i.e. no register variables   */
;    25 #endif
;    26 
;    27 extern  int     Int_Glob;
;    28 extern  char    Ch_1_Glob;
;    29 

        RSEG NEARFUNC_A:CODE:REORDER:NOROOT(2)
        
        CFI Names cfiNames0
        CFI StackFrame CFA SP HUGEDATA
        CFI Resource R0:32, R1:32, R2:32, R3:32, R4:32, R5:32, R6:32, R7:32
        CFI Resource R8:32, R9:32, R10:32, R11:32, R12:32, SP:32, LR:32
        CFI VirtualResource RET:32
        CFI EndNames cfiNames0
        
        CFI Common cfiCommon0 Using cfiNames0
        CFI CodeAlign 4
        CFI DataAlign 4
        CFI ReturnAddress RET CODE
        CFI CFA SP+0
        CFI R0 Undefined
        CFI R1 Undefined
        CFI R2 Undefined
        CFI R3 Undefined
        CFI R4 SameValue
        CFI R5 SameValue
        CFI R6 SameValue
        CFI R7 SameValue
        CFI R8 SameValue
        CFI R9 SameValue
        CFI R10 SameValue
        CFI R11 SameValue
        CFI R12 Undefined
        CFI LR Undefined
        CFI RET LR
        CFI EndCommon cfiCommon0
        
        CFI Block cfiBlock0 Using cfiCommon0
        CFI Function Func_3
   CODE32   
;    30 Boolean Func_3 (Enumeration Enum_Par_Val)
;    31 /***************************/
;    32     /* executed once        */
;    33     /* Enum_Par_Val == Ident_3 */
;    34 {
;    35     Enumeration Enum_Loc;
;    36 
;    37     Enum_Loc = Enum_Par_Val;
;    38     if (Enum_Loc == Ident_3)
Func_3:
   AND      R0,R0,#+0xFF       ;; Zero extend
   CMP      R0,#+0x2
;    39         return (true);
   MOVEQ    R0,#+0x1
   MOVEQ    PC,LR              ;; return
;    40     else /* not executed */
;    41         return (false);
   MOV      R0,#+0x0
   MOV      PC,LR              ;; return
        CFI EndBlock cfiBlock0
;    42 } /* Func_3 */
;    43 

        RSEG NEARFUNC_A:CODE:NOROOT(2)
        CFI Block cfiBlock1 Using cfiCommon0
        CFI Function Proc_6
   CODE32   
;    44 void Proc_6 ( Enumeration Enum_Val_Par, Enumeration *Enum_Ref_Par)
;    45 /*********************************/
;    46     /* executed once */
;    47     /* Enum_Val_Par == Ident_3, Enum_Ref_Par becomes Ident_2 */
;    48 {
Proc_6:
   STMDB    SP!,{LR}           ;; Push
        CFI RET Frame(CFA, -4)
        CFI CFA SP+4
;    49     *Enum_Ref_Par = Enum_Val_Par;
   STRB     R0,[R1, #+0]
;    50     if (! Func_3 (Enum_Val_Par))
   AND      R0,R0,#+0xFF       ;; Zero extend
   CMP      R0,#+0x2
;    51         /* then, not executed */
;    52         *Enum_Ref_Par = Ident_4;
   MOVNE    R2,#+0x3
   STRNEB   R2,[R1, #+0]
;    53     switch (Enum_Val_Par)
   CMP      R0,#+0x0
   BEQ      ??Proc_6_0
   CMP      R0,#+0x1
   BEQ      ??Proc_6_1
   CMP      R0,#+0x2
   BEQ      ??Proc_6_2
   CMP      R0,#+0x4
   BEQ      ??Proc_6_3
;    54     {
;    55         case Ident_1:
;    56             *Enum_Ref_Par = Ident_1;
;    57             break;
;    58         case Ident_2:
;    59             if (Int_Glob > 100)
;    60                 *Enum_Ref_Par = Ident_1;
;    61             else 
;    62                 *Enum_Ref_Par = Ident_4;
;    63             break;
;    64         case Ident_3: /* executed */
;    65             *Enum_Ref_Par = Ident_2;
;    66             break;
;    67         case Ident_4: 
;    68             break;
;    69         case Ident_5:
;    70             *Enum_Ref_Par = Ident_3;
;    71             break;
;    72     } /* switch */
;    73 } /* Proc_6 */
   LDMIA    SP!,{PC}           ;; return
??Proc_6_0:
   MOV      R0,#+0x0
   B        ??Proc_6_4
??Proc_6_1:
   LDR      R0,??Proc_6_5      ;; #Int_Glob
   LDR      R2,[R0, #+0]
   CMP      R2,#+0x65
   MOVGE    R0,#+0x0
   BGE      ??Proc_6_4
   MOV      R0,#+0x3
   B        ??Proc_6_4
??Proc_6_2:
   MOV      R0,#+0x1
   B        ??Proc_6_4
??Proc_6_3:
   MOV      R0,#+0x2
??Proc_6_4:
   STRB     R0,[R1, #+0]
   LDMIA    SP!,{PC}           ;; return
   DATA     
??Proc_6_5:
   DC32     Int_Glob
        CFI EndBlock cfiBlock1
;    74 
;    75 

        RSEG NEARFUNC_A:CODE:REORDER:NOROOT(2)
        CFI Block cfiBlock2 Using cfiCommon0
        CFI Function Proc_7
   CODE32   
;    76 void Proc_7 ( One_Fifty Int_1_Par_Val, 
;    77               One_Fifty Int_2_Par_Val, 
;    78               One_Fifty *Int_Par_Ref )
;    79 /**********************************************/
;    80     /* executed three times                                      */
;    81     /* first call:      Int_1_Par_Val == 2, Int_2_Par_Val == 3,  */
;    82     /*                  Int_Par_Ref becomes 7                    */
;    83     /* second call:     Int_1_Par_Val == 10, Int_2_Par_Val == 5, */
;    84     /*                  Int_Par_Ref becomes 17                   */
;    85     /* third call:      Int_1_Par_Val == 6, Int_2_Par_Val == 10, */
;    86     /*                  Int_Par_Ref becomes 18                   */
;    87 {
;    88     One_Fifty Int_Loc;
;    89 
;    90     Int_Loc = Int_1_Par_Val + 2;
;    91     *Int_Par_Ref = Int_2_Par_Val + Int_Loc;
Proc_7:
   ADD      R0,R0,R1
   ADD      R0,R0,#+0x2
   STR      R0,[R2, #+0]
;    92 } /* Proc_7 */
   MOV      PC,LR              ;; return
        CFI EndBlock cfiBlock2
;    93 
;    94 

        RSEG NEARFUNC_A:CODE:NOROOT(2)
        CFI Block cfiBlock3 Using cfiCommon0
        CFI Function Proc_8
   CODE32   
;    95 void Proc_8 ( Arr_1_Dim Arr_1_Par_Ref, 
;    96               Arr_2_Dim Arr_2_Par_Ref, 
;    97               int Int_1_Par_Val, 
;    98               int Int_2_Par_Val)
;    99 /*********************************************************************/
;   100     /* executed once      */
;   101     /* Int_Par_Val_1 == 3 */
;   102     /* Int_Par_Val_2 == 7 */
;   103 {
Proc_8:
   STMDB    SP!,{R4-R7}        ;; Push
        CFI R7 Frame(CFA, -4)
        CFI R6 Frame(CFA, -8)
        CFI R5 Frame(CFA, -12)
        CFI R4 Frame(CFA, -16)
        CFI CFA SP+16
;   104   REG One_Fifty Int_Index;
;   105   REG One_Fifty Int_Loc;
;   106 
;   107     Int_Loc = Int_1_Par_Val + 5;
   ADD      R2,R2,#+0x5
;   108     Arr_1_Par_Ref [Int_Loc] = Int_2_Par_Val;
   MOV      R4,R2, LSL #+2
   STR      R3,[R4, +R0]
;   109     Arr_1_Par_Ref [Int_Loc+1] = Arr_1_Par_Ref [Int_Loc];
   ADD      R3,R2,#+0x1
   LDR      R5,[R4, +R0]
   STR      R5,[R0, +R3, LSL #+2]
;   110     Arr_1_Par_Ref [Int_Loc+30] = Int_Loc;
   ADD      R5,R2,#+0x1E
   STR      R2,[R0, +R5, LSL #+2]
;   111     for (Int_Index = Int_Loc; Int_Index <= Int_Loc+1; ++Int_Index)
   MOV      R5,R2
   MOV      R6,#+0xC8
   MUL      R7,R2,R6
   ADD      R6,R7,R1
   ADD      R6,R4,R6
   MOV      R7,R3
   B        ??Proc_8_0
;   112         Arr_2_Par_Ref [Int_Loc] [Int_Index] = Int_Loc;
??Proc_8_1:
   STR      R2,[R6, #+0]
   ADD      R5,R5,#+0x1
   ADD      R6,R6,#+0x4
??Proc_8_0:
   CMP      R7,R5
   BGE      ??Proc_8_1
;   113     Arr_2_Par_Ref [Int_Loc] [Int_Loc-1] += 1;
   MOV      R3,#+0xC8
   MUL      R5,R2,R3
   ADD      R3,R5,R1
   SUB      R5,R2,#+0x1
   LDR      R6,[R3, +R5, LSL #+2]
   ADD      R6,R6,#+0x1
   STR      R6,[R3, +R5, LSL #+2]
;   114     Arr_2_Par_Ref [Int_Loc+20] [Int_Loc] = Arr_1_Par_Ref [Int_Loc];
   LDR      R3,[R4, +R0]
   ADD      R0,R2,#+0x14
   MOV      R2,#+0xC8
   MUL      R5,R0,R2
   ADD      R0,R5,R1
   STR      R3,[R4, +R0]
;   115     Int_Glob = 5;
   MOV      R0,#+0x5
   LDR      R1,??Proc_8_2      ;; #Int_Glob
   STR      R0,[R1, #+0]
;   116 } /* Proc_8 */
   LDMIA    SP!,{R4-R7}        ;; Pop
        CFI R4 SameValue
        CFI R5 SameValue
        CFI R6 SameValue
        CFI R7 SameValue
        CFI CFA SP+0
   MOV      PC,LR              ;; return
   DATA     
??Proc_8_2:
   DC32     Int_Glob
        CFI EndBlock cfiBlock3
;   117 
;   118 

        RSEG NEARFUNC_A:CODE:REORDER:NOROOT(2)
        CFI Block cfiBlock4 Using cfiCommon0
        CFI Function Func_1
   CODE32   
;   119 Enumeration Func_1 (Capital_Letter Ch_1_Par_Val, Capital_Letter Ch_2_Par_Val)
;   120 /*************************************************/
;   121     /* executed three times                                         */
;   122     /* first call:      Ch_1_Par_Val == 'H', Ch_2_Par_Val == 'R'    */
;   123     /* second call:     Ch_1_Par_Val == 'A', Ch_2_Par_Val == 'C'    */
;   124     /* third call:      Ch_1_Par_Val == 'B', Ch_2_Par_Val == 'C'    */
;   125 {
;   126     Capital_Letter        Ch_1_Loc;
;   127     Capital_Letter        Ch_2_Loc;
;   128 
;   129     Ch_1_Loc = Ch_1_Par_Val;
;   130     Ch_2_Loc = Ch_1_Loc;
;   131     if (Ch_2_Loc != Ch_2_Par_Val)
Func_1:
   AND      R2,R0,#+0xFF       ;; Zero extend
   AND      R1,R1,#+0xFF       ;; Zero extend
   CMP      R2,R1
;   132     /* then, executed */
;   133         return (Ident_1);
   MOVNE    R0,#+0x0
;   134     else  /* not executed */
;   135     {
;   136         Ch_1_Glob = Ch_1_Loc;
   LDREQ    R0,??Func_1_0      ;; #Ch_1_Glob
   STREQB   R2,[R0, #+0]
;   137         return (Ident_2);
   MOVEQ    R0,#+0x1
   AND      R0,R0,#+0xFF       ;; Zero extend
   MOV      PC,LR              ;; return
   DATA     
??Func_1_0:
   DC32     Ch_1_Glob
        CFI EndBlock cfiBlock4
;   138     }
;   139 } /* Func_1 */
;   140 
;   141 

        RSEG NEARFUNC_A:CODE:NOROOT(2)
        CFI Block cfiBlock5 Using cfiCommon0
        CFI Function Func_2
   CODE32   
;   142 Boolean Func_2 (Str_30  Str_1_Par_Ref, Str_30  Str_2_Par_Ref)
;   143 /*************************************************/
;   144     /* executed once */
;   145     /* Str_1_Par_Ref == "DHRYSTONE PROGRAM, 1'ST STRING" */
;   146     /* Str_2_Par_Ref == "DHRYSTONE PROGRAM, 2'ND STRING" */
;   147 
;   148 {
Func_2:
   STMDB    SP!,{R4,R5}        ;; Push
        CFI R5 Frame(CFA, -4)
        CFI R4 Frame(CFA, -8)
        CFI CFA SP+8
;   149     REG One_Thirty      Int_Loc;
;   150     Capital_Letter      Ch_Loc;
;   151 
;   152     Int_Loc = 2;
   MOV      R2,#+0x2
   B        ??Func_2_0
;   153     while (Int_Loc <= 2) /* loop body executed once */
;   154     if (Func_1 (Str_1_Par_Ref[Int_Loc],
;   155                 Str_2_Par_Ref[Int_Loc+1]) == Ident_1)
;   156     /* then, executed */
;   157     {
;   158         Ch_Loc = 'A';
;   159         Int_Loc += 1;
??Func_2_1:
   ADD      R2,R2,#+0x1
;   160     } /* if, while */
   CMP      R2,#+0x3
   BGE      ??Func_2_2
??Func_2_0:
   LDRB     R3,[R2, +R0]
   ADD      R4,R2,#+0x1
   LDRB     R5,[R4, +R1]
   CMP      R3,R5
   BNE      ??Func_2_1
   LDR      R4,??Func_2_3      ;; #Ch_1_Glob
   STRB     R3,[R4, #+0]
   B        ??Func_2_0
;   161 
;   162     if (Ch_Loc >= 'W' && Ch_Loc < 'Z')
;   163     /* then, not executed */
;   164     Int_Loc = 7;
;   165     if (Ch_Loc == 'R')
;   166     /* then, not executed */
;   167     return (true);
;   168     else /* executed */
;   169     {
;   170         if (strcmp (Str_1_Par_Ref, Str_2_Par_Ref) > 0)
??Func_2_2:
   LDRB     R4,[R1], #+1
   LDRB     R3,[R0], #+1
   CMP      R3,R4
   BNE      ??Func_2_4
   CMP      R3,#+0x0
   BNE      ??Func_2_2
   MOV      R5,#+0x0
   B        ??Func_2_5
??Func_2_4:
   SUB      R5,R3,R4
??Func_2_5:
   CMP      R5,#+0x1
   BLT      ??Func_2_6
;   171         /* then, not executed */
;   172         {
;   173             Int_Loc += 7;
;   174             Int_Glob = Int_Loc;
   ADD      R0,R2,#+0x7
   LDR      R1,??Func_2_3+4    ;; #Int_Glob
   STR      R0,[R1, #+0]
;   175             return (true);
   MOV      R0,#+0x1
   B        ??Func_2_7
;   176         }
;   177         else /* executed */
;   178             return (false);
??Func_2_6:
   MOV      R0,#+0x0
??Func_2_7:
   LDMIA    SP!,{R4,R5}        ;; Pop
        CFI R4 SameValue
        CFI R5 SameValue
        CFI CFA SP+0
   MOV      PC,LR              ;; return
   DATA     
??Func_2_3:
   DC32     Ch_1_Glob
   DC32     Int_Glob
        CFI EndBlock cfiBlock5
;   179     } /* if Ch_Loc */
;   180 } /* Func_2 */

        END
;   181 
;   182 
;   183 
; 
; 500 bytes in segment NEARFUNC_A
; 
; 500 bytes of CODE memory
;
;Errors: none
;Warnings: none

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -