-1

次のコードがあります。そして、以下に示すようにアセンブリ コードを完成させたいと考えています。

int main(void)
{
    int x = 10;

    int i=0;
    label1:


    asm (.....) // code to add here: if i>=x then jump to label2

    printf("%d\n",i);

    i++;
    asm (.....) // code to add here: jump to label 1
    label2:

    printf("out\n");
}

私のマシンは x86 で、オペレーティング システムは Ubuntu 12 です。

4

3 に答える 3

5

まず、オンラインで簡単に見つけられるはずの x86 オペコードのリストを入手してください。

関数は次のasm()順序に従います。

asm ( "assembly code"
           : output operands                  /* optional */
           : input operands                   /* optional */
           : list of clobbered registers      /* optional */
);

次に、C ラベルに「ジャンプ」できないという大きな問題があります。ラベルを「アセンブリ」ラベルにしてジャンプできるようにする必要があります。元:

int main()
{
  asm("jmp .end");    // make a call to jmp there
  printf("Hello ");
  asm(".end:");       //make a "jumpable" label
  printf("World\n");
  return 0;
}

このプログラムの出力は、「Hello」を飛び越えたように、単純に「World」です。これは同じ例ですが、比較ジャンプがあります。

int main()
{
    int x = 5, i = 0;
    asm(".start:");
    asm("cmp %0, %1;"   // compare input 1 to 2
        "jge .end;"     // if i >= x, jump to .end
        :               // no output from this code
        : "r" (x), "r" (i));  // input's are var x and i
    printf("Hello ");
    i++;
    asm("jmp .start;");    
    asm(".end:");
    printf("World\n");
    return 0;
}
于 2013-01-25T14:30:01.693 に答える
2

ここでアセンブリを使用することに本当に縛られていない場合は、C をより簡単に使用でき、少なくともアセンブリ バージョンと同じくらい効率的です。

int x = 10;
int i = 0;
while(i < x) {
  printf("%d\n",i);
  i++;
}
printf("out\n");

(forループも適しています)

于 2013-01-25T14:09:54.333 に答える
0

c 内でアセンブラを使用するセマンティクスは覚えていませんが、通常、アセンブラで数値を比較する場合、数値を互いに減算します。それらが同じ数だった場合、ゼロビットが設定されるため、条件付きジャンプを実行できます。int のサイズに一致する正しいレジスタを使用してください。

非常に大まかなコード例 (これは私の頭の中で思い浮かびません。アセンブラーを書いてから何年も経ちます):

#load value to compare against into BX
#load number to check into AX
CMP AX, BX
JE label

更新: @harold の提案に従って SUB を CMP に変更

于 2013-01-25T14:24:42.203 に答える