2

この C コードをアセンブリ コードに変換する必要があります。

 #include <stdio.h>

 int main(){

 int a, b,c;
 scanf("%d",&a);
 scanf("%d",&b);
 if (a == b){
   b++;
 } 
 if (a > b){
  c = a;
  a = b;
  b = c;    
 }
 printf("%d\n",b-a);
 return 0;
 }  

私のコードは以下で、不完全です。

    rdint %eax        # reading a
    rdint %ebx        # reading b
    irmovl $1, %edi

    subl %eax,%ebx
    addl %ebx, %edi
    je Equal


    irmov1 %eax, %efx  #flagged as invalid line
    irmov1 %ebx, %egx
    irmov1 %ecx, %ehx
    irmovl $0, %eax
    irmovl $0, %ebx
    irmovl $0, %ecx

    addl %eax, %efx    #flagged as invalid line
    addl %ebx, %egx
    addl %ecx, %ehx



    halt

基本的にはほぼ完了していると思いますが、実行しようとしたときに無効とフラグが立てられた2行の横にコメントしましたが、なぜ無効なのかわかりません。また、a > b の if ステートメントを実行する方法もわかりません。y86 アセンブリ言語について知っている人からの提案を使用できます。

4

2 に答える 2

4

私がオンラインで見つけたもの ( 1、2 )から、サポートされている唯一のレジスタは、、、、、、、、およびです。eaxecxedxebxesiediespebp

存在しないレジスタ (efxおよびそれ以上) を要求しています。

またirmov、即値オペランド(読み取り:定数数値)をレジスタオペランドに移動するためのものですが、レジスタオペランドirmov1 %eax, %efxは2つあります。

最後に、コンピュータ ソフトウェアでは、数字の「1」を表す文字と文字の「L」を表す文字には大きな違いがあります。1 と l に注意してください。私はirmov1対を意味しirmovlます。

于 2012-07-10T22:34:30.797 に答える
0

ジェンス、

まず、Y86 には efx、egx、および ehx レジスタがありません。そのため、コードを YAS に渡すと無効な行が表示されます。

次に、subl 命令を使用して 2 つのレジスタを減算し、jxx 命令を介して Y86 ALU によって設定された条件コードにジャンプすることにより、条件付き分岐を作成します。

詳細については、http: //y86tutoring.wordpress.comで私のブログを確認してください。

于 2012-11-06T22:02:17.850 に答える