2016-11-12 11 views
-1

アセンブリを学ぶことにしました(emu8086を使用しています)、配列を逆にする方法を学びたいと思います。 だから、私はCからのアセンブリにこのコードをtranferたい:アセンブリのx86の配列を逆転

void reverse(int len, char *str) 
    { 
     int i; 
     char temp; 

     for (i=len-1; i >= len/2; i--) 
     { 
     temp = str[i]; 
     str[i] = str[len-1-i]; 
      str[len-1-i] = temp; 
     } 
    } 

これはこれはこれまでのところ、私はそれに対処することができ、メイン

mov ax, offset chrs 
    push ax 
    push 9 
    call reverse 

配列

chrs db 'A','N','E','X','A','M','P','L','E','$' 

をです私がループ部分に着くまで、私自身で。 シンプルなループを書く方法を学びましたが、私もこれを使いました - While, Do While, For loops in Assembly Language (emu8086)

私の主な問題は、逆の働きをしていることです。私はそれをどのように使用するか教えていただけますか?おかげさまで

答えて

0

どのようにしてC言語で別の方法で書くことができるかを説明します。私が何をしたのか分かっていれば、コンピュータのメモリ設計やCPUの使い方に少し慣れたら、後でasmループを実行できるはずです。

void reverse(int len, char *str) { 
    char *bptr = str; 
    char *eptr = str+len-1; 
    char temp; 

    while (bptr < eptr) { 
     temp = *bptr; 
     *bptr = *eptr; 
     *eptr = temp; 
     ++bptr; 
     --eptr; 
    } 
} 

このCのループ本体は、ライン毎に正確に一つのx86命令を使用してASMに変換することができ、初期whileは前方ループ本体と次々命令の2つの命令を使用して行うことができます。

あなただけmovincdeccmpjaeretleaまたはaddでこのすべてを書くことができる必要があります。 ASMを知りたい場合


ところで、暗記しない命令で「ループを作成する方法」、ソースリストのいくつかの種類のように、それは完全に役に立たないのです。それぞれの命令が正確に何をしているのかを暗記する必要があり、ループがどのようにそれによって達成されるのかを理解する必要があります。

CPUは確定的なステートマシンであり、各命令は単純な決定論的な方法でその状態を変更します。だから、あなたはある状態のCPUとある状態のメモリ(おそらくいくつかの入力データと命令=コードを含む)を持っていて、最後にどの状態を達成したいのかを知っている(CPUとメモリの両方の状態コンテンツ)。また、その初期状態を終了状態に変更するための指示を使用するだけです。

あなたの初期状態はaxが値5が含まれている、とあなたはax含む値6で終了したいということですたとえば場合、あなたはそれを達成する方法を、いくつかの方法があり、短いものは、(それぞれが単一の命令があります)ビーイング:

  • mov ax,6
  • mov al,6
  • inc ax
  • inc al

とんでもない方法で多くの命令を無駄にすることができます:「リスト」を暗記することは無用である理由です

xor ax,ax 
dec ah 
shr ax,14 
add ax,ax 

、どのようにあなたが望む状態を達成するために多くの多くの方法があります。

(1)私はまだASMを書くたびにIntelの命令リファレンスガイドをチェックしています.20年以上も経ってもx86 ASMを知っています。多くの場合、細部が重要なので、私は命令が私がそれが期待するものを正確に行うことを確かめなければなりません。