我用FizzBuzz编写了一个arm64程序;我用十六进制而不是十进制来打印值。这是我做的第一个arm64程序,我正在寻找如何改进它的建议。
打印寄存器的代码取自教材:64位ARM汇编语言编程: Raspberry Pi的单板计算机开发和Stephen的移动设备。
//
// 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"发布于 2021-06-18 07:26:26
在udiv中使用试分割并不是FizzBuzz的最佳算法。维护一对计数器更容易;一个计数器数到3并重置,另一个计数器重新设置。如果我们愿意,我们可以将其合并成一个计数器(最多15个)。
范围是非常有限的-当我们达到255,它似乎我们重置为0。这个限制应该被记录下来!
https://codereview.stackexchange.com/questions/263170
复制相似问题