Comment detail

アルファベットの繰り上がり (Nested Flatten)

Mac OS X (PowerPC 32bit) アセンブリで。あまりスマートではありませんが。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
;; ------------------------------------------------
;; alphanext.s for Mac OS X (PowerPC 32bit)
;; % as -o alphanext.o alphanext.s
;; % gcc alphanext.o -o alphanext
;; ------------------------------------------------

        .machine ppc
        .globl  _main
        
        ;; スタックにレジスタを退避するマクロ
        .macro  PUSH
                stwu    r3, -4(r1)
                stwu    r4, -4(r1)
                stwu    r5, -4(r1)
                stwu    r6, -4(r1)
                stwu    r7, -4(r1)
                stwu    r8, -4(r1)
                stwu    r9, -4(r1)
                stwu    r10, -4(r1)
                mflr    r15
                stwu    r15, -4(r1)
        .endmacro

        ;; スタックからレジスタを復帰するマクロ
        .macro  POP
                lwz     r15, 0(r1)
                mtlr    r15
                lwzu    r10, 4(r1)
                lwzu    r9, 4(r1)
                lwzu    r8, 4(r1)
                lwzu    r7, 4(r1)
                lwzu    r6, 4(r1)
                lwzu    r5, 4(r1)
                lwzu    r4, 4(r1)
                lwzu    r3, 4(r1)
                addi    r1, r1, 4
        .endmacro

        ;; スタック退避つきサブルーチン呼び出し
        .macro  CALL
                PUSH
                bl      $0
                POP
        .endmacro

;; r7: 表示する最大値
;; r8: 現在表示中の数値
;; r9: アルファベット
_main:
        li      r7, 100
        li      r8, 0
        li      r10, 26
        
_write_alpha:
        lis     r4, hi16(temp)
        addi    r4, r4, lo16(temp)
        li      r5, 1
        mr      r11, r4

        divw    r9, r8, r10     ; i / 26
        cmpli   cr7, r9, 0
        beq     cr7, _write_alpha_rest
        addi    r9, r9, 64      ; ASCII
        stb     r9, 0(r11)
        subi    r9, r9, 64
        addi    r11, r11, 1
        addi    r5, r5, 1

_write_alpha_rest:
        mullw   r9, r9, r10
        sub     r9, r8, r9
        addi    r9, r9, 65      ; ASCII
        stb     r9, 0(r11)

        ;; 出力
        PUSH
        li      r3, 1
        li      r0, 4           ; sys_write()
        sc
        POP
        
        ;; 繰り返し
        addi    r8, r8, 1
        cmpl    cr7, r7, r8
        ble     cr7, _write_end

        ;; 区切り文字
        li      r3, 1
        lis     r4, hi16(sep)
        addi    r4, r4, lo16(sep)
        li      r5, 2
        li      r0, 4           ; sys_write()
        PUSH
        sc
        POP
        
        b       _write_alpha

_write_end:
        li      r3, 1
        lis     r4, hi16(lf)
        addi    r4, r4, lo16(lf)
        li      r5, 1
        li      r0, 4           ; sys_write()
        sc

        ;; sys_exit()
        li      r3, 0
        li      r0, 1
        sc


        .data
        .align  2

temp:
        .asciz  "  "
        .align  2

sep:
        .asciz  ", "
        .align  2

lf:
        .asciz  "\n"
        .align  2

Index

Feed

Other

Link

Pathtraq

loading...