0

我这里有一个简单的程序,它被设置为产生输出,

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

任何想法都非常感谢:)

4

2 回答 2

1

我正要问你是否必须用汇编语言编写,但由于你正在使用SWI(现在它被称为SVC),显然你正坐在操作系统之上,很有可能是 Linux。

为什么你不用C写?这对你来说应该容易得多,除非这只是为了学习目的,在这种情况下你为什么要尝试学习这种用法?

关于优化,当您坐在非实时操作系统之上并进行系统调用时,任何性能预期都会丢失。从软件中断的角度来看,内核可能会以可变且无保证的方式延迟您的代码。

因此,在这种情况下,如果您正在考虑使您的应用程序快速运行,请尝试通过在用户空间中准备/缓存打印缓冲区来减少系统调用的数量,您可以在其中应用一些简单明了的 C 习惯用法。

于 2012-10-20T07:49:52.767 回答
0

假设您对“优化”的定义是更少的代码(而不是速度),您可能会首先考虑使用子例程来完成繁重的工作的可能性。这样,您可以将字符串加载到 R0 中,将值加载到 R1 中,然后调用子例程。

诸如寄存器传输和各种 swi 调用之类的步骤将同时完成(如果要更改格式,这也会使事情变得容易得多),并且每个输出的主代码从大约十行减少到大约三行(一对夫妇寄存器加载和调用)。

于 2012-10-19T22:26:11.667 回答