2017-09-16 10 views
2

このCプログラムをどのようにしてアセンブリコードに正確に変換できますか?私は、unsigned intの操作を理解するのに苦労しています。C関数をARMアセンブリ言語に変換する

unsigned int sum(unsigned int n){ 
    if(n==0) return 0; 
    else return n+sum(n-1); 
    } 

私はunsigned int型のために考えることint型 .Howを考慮すれば、私はこれを行っていますか?

sum: 
SUB sp, sp, #8 
STR lr, [sp,#4] 
STR r0, [sp,#0] 
CMP r0,#0 
BGE L1 
MOV r0, #0 
ADD sp, sp, #8 
MOV pc, lr 
L1: SUB r0, r0, #1 
BL sum 
MOV r12, r0 
LDR r0, [sp,#0] 
LDR lr, [sp,#4] 
ADD sp, sp, #8 
ADD r0, r0, r12 
MOV pc, lr 
+2

さて、あなたはコンパイラをとり、いくつかのフラグを付けてこのプログラムを渡します。 clangの場合、 'clang -march arm -S yourprogram.c'のようなものです。 – arrowd

+0

@arrowd 'clang -target arm -S yourprogram.c'が正しいです。 – fuz

答えて

1

unsigned intの命令では、ADDとSUBが両方とも正しく動作するため、命令は重要ではありません。

一部のISAでは、MIPSとして符号なしADDおよびSUB(ADDUおよびSUBU)が提供されていますが、オーバーフロー動作のみが異なります。

関連する問題