我这里有一个简单的程序,它被设置为产生输出,
The value of a is 2005
The value of b is 1959
The value of c is 1
The value of d is 0
The value of (a - b) * (c + d) is 46我正在寻找最好的方法来优化我的代码,我在大量地重复代码!是否可以直接从其他寄存器打印?例如SWI 0,但对于不在R0中的整数?
B main
aval DEFW 2005
bval DEFW 1959
cval DEFW 1
dval DEFW 0
valOf DEFB 'The value of \0'
isStr DEFB ' is \0'
lstStr DEFB 'The value of (a - b) * (c + d) is \0'
ALIGN
main ADR R0, valOf ;Value a
SWI 3
MOV R0, #97
SWI 0
ADR R0, isStr
SWI 3
LDR R0, aval
SWI 4
MOV R0, #10 ;print new line
SWI 0
ADR R0, valOf ;Value b
SWI 3
MOV R0, #98
SWI 0
ADR R0, isStr
SWI 3
LDR R0, bval
SWI 4
MOV R0, #10 ;print new line
SWI 0
ADR R0, valOf ;Value c
SWI 3
MOV R0, #99
SWI 0
ADR R0, isStr
SWI 3
LDR R0, cval
SWI 4
MOV R0, #10 ;print new line
SWI 0
ADR R0, valOf ;print 'value of '
SWI 3
MOV R0, #100
SWI 0
ADR R0, isStr ;
SWI 3
LDR R0, dval
SWI 4
MOV R0, #10 ;print new line
SWI 0
ADR R0, lstStr
SWI 3
LDR R3, aval
LDR R4, bval
LDR R5, cval
LDR R6, dval
SUB R1, R3, R4
SUB R2, R5, R6
MUL R0, R1, R2
SWI 4
SWI 2 ;exit任何非常感谢的想法:)
发布于 2012-10-20 15:49:53
我想问你是不是一定要用汇编语言写,但既然你用的是SWI (现在叫做SVC),显然你是在操作系统之上,很有可能是Linux。
你为什么不用C写呢?这对你来说应该容易得多,除非这仅仅是为了学习的目的,在这种情况下,为什么你会尝试学习这样的用法?
关于优化,当你坐在非实时操作系统之上并进行系统调用时,任何性能期望都会丢失。从软件中断的角度来看,内核可能会以不确定的方式延迟你的代码。
因此,在这种情况下,如果您正在考虑使应用程序变得更快,请尝试通过在用户空间中准备/缓存打印缓冲区来减少系统调用的数量,您可以在其中应用一些简单的C语言习惯用法。
发布于 2012-10-20 06:26:12
假设你对“优化”的定义是更少的代码(而不是速度),你可以从使用子例程来做繁重的工作开始考虑。这样,您可以将字符串加载到R0中,将值加载到R1中,然后调用子例程。
寄存器传输和各种swi调用等步骤将在一个点上完成(如果格式发生变化,也会使事情变得容易得多),并且主代码从大约10行减少到大约3行,用于每个输出(几次寄存器加载和一次调用)。
https://stackoverflow.com/questions/12983219
复制相似问题