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

私は自分のコードを最適化するための最良の方法を探しています、私はコードALOTを繰り返しています!他のレジスタから直接印刷することは可能ですか?例: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と呼ばれています)、明らかにOS、可能性の高いLinuxの上に座っています。

なぜあなたはCで書いていないのですか?これが学習目的のみである場合を除いて、それはあなたにとってはるかに簡単なはずです。その場合、なぜあなたはそのような使用法を学ぼうとするのでしょうか?

最適化については、非リアルタイムOSの上に座ってシステムコールを行うと、パフォーマンスの期待が失われます。ソフトウェア割り込みの観点から、カーネルはコードを変動的かつ保証されていない方法で遅延させる可能性があります。

したがって、この場合、アプリケーションを高速化することを検討している場合は、プレーンで簡単なCイディオムを適用できるユーザースペースで印刷バッファーを準備/キャッシュすることにより、システムコールの数を減らすようにしてください。

于 2012-10-20T07:49:52.767 に答える
0

'optimize'の定義が(たとえば速度ではなく)コードが少ないと仮定すると、サブルーチンを使用してうなり声を上げる可能性を検討することから始めることができます。このようにして、文字列をR0にロードし、値をR1にロードしてから、サブルーチンを呼び出すことができます。

レジスタ転送やさまざまなswi呼び出しなどの手順は、一度に実行され(フォーマットが変更された場合にも、処理がはるかに簡単になります)、メインコードは出力ごとに約10行から約3行に削減されます(カップルレジスタロードとコールの)。

于 2012-10-19T22:26:11.667 に答える