首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FizzBuzz in arm64

FizzBuzz in arm64
EN

Code Review用户
提问于 2021-06-18 00:27:28
回答 1查看 211关注 0票数 2

我用FizzBuzz编写了一个arm64程序;我用十六进制而不是十进制来打印值。这是我做的第一个arm64程序,我正在寻找如何改进它的建议。

打印寄存器的代码取自教材:64位ARM汇编语言编程: Raspberry Pi的单板计算机开发和Stephen的移动设备。

代码语言:javascript
复制
//
// FizzBuzz
//

.global _start

// 
// x0-x2 & x8 - linux shit
// x3 - loop counter
// x4 - variable
// x5 - dividend
// x6 - divisor

_start:     mov x3, #100    // instantiate x3
    
loop:       subs    x4, x3, #101    // subtract x3 by 101
        mvn x4, x4      // multiply x4 by -1 (bug: x4 is getting set to 0)
        add x4, x4, #1
        // if x4 % 15 == 0 then goto divby15
        // r = j - qk (took this divisibility checker from number theory)
        mov x6, #15
        udiv    x5, x4, x6
        msub    x5, x5, x6, x4
        cmp x5, #0
        b.eq    divby15
        // if x4 % 3 == 0 then goto divby3
        mov x6, #3
        udiv    x5, x4, x6
        msub    x5, x5, x6, x4
        cmp x5, #0
        b.eq    divby3
        // if x4 % 5 == 0 then goto divby5
        mov x6, #5
        udiv    x5, x4, x6
        msub    x5, x5, x6, x4
        cmp x5, #0
        b.eq    divby5
        // print x

// 
// Prints the register value
//
// Registers:
// x1 - byte address
// w5 - loop index
// w6 - current character
// x7 - register to print
// x8 - linux shit
//
        mov x7, x4

        ldr x1, =hexstr
        add x1, x1, #3
        mov w5, #2

loop2:      and w6, w7, #0xF
        cmp w6, #10
        b.ge    letter
        add w6, w6, #'0'
        b   cont

letter:     add w6, w6, #('A'-10)

cont:       strb    w6, [x1]
        sub x1, x1, #1
        lsr x7, x4, #4
        subs    w5, w5, #1
        b.ne    loop2

        mov x0, #1
        ldr x1, =hexstr
        mov x2, #6
        mov x8, #64
        svc 0

/////////////////////////////////////////////
/////////////////////////////////////////////
/////////////////////////////////////////////

        // repeat if x3 isn't equal to 0
inc:        sub x3, x3, #1
        cmp x3, #0
        b.ne    loop
        b   end

divby3:     mov x0, #1
        ldr x1, =fizz
        mov x2, #5
        mov x8, #64
        svc 0
        b   inc

divby5:     mov x0, #1
        ldr x1, =buzz
        mov x2, #5
        mov x8, #64
        svc 0
        b   inc

divby15:    mov x0, #1
        ldr x1, =fizzbuzz
        mov x2, #9
        mov x8, #64
        svc 0
        b   inc

end:        mov x0, #0
        mov x8, #93
        svc 0

.data
fizz:       .ascii  "fizz\n"
buzz:       .ascii  "buzz\n"
fizzbuzz:   .ascii  "fizzbuzz\n"
hexstr:     .ascii  "0xFF\n"
EN

回答 1

Code Review用户

发布于 2021-06-18 07:26:26

udiv中使用试分割并不是FizzBuzz的最佳算法。维护一对计数器更容易;一个计数器数到3并重置,另一个计数器重新设置。如果我们愿意,我们可以将其合并成一个计数器(最多15个)。

范围是非常有限的-当我们达到255,它似乎我们重置为0。这个限制应该被记录下来!

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/263170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档