0

次のようなレジスタに 16 進値が格納されています。

mov ax,1234h

各文字 (1,2,3,4) を 10 進値と比較する必要があります。理想的には、レジスタ内の文字/数字をループしますが、それぞれを指す方法や、可能かどうかさえわかりません。これはどのように行うことができますか?

4

2 に答える 2

1

これはアセンブリ言語であるため、この操作のすべてを実行する 1 つの命令はありません。いくつかのステップがあります。おそらく、最も時間効率の良い方法は次のように説明されます。最初のステップは、必要に応じて値を保存することです。これは、コードの残りの部分が値を破棄するためです。これらの手順は少し不正確ですが、一般的なアルゴリズムを示します。

  1. 元の番号をどこかに保存します(保存したい場合)
  2. 左に 4 ビット回転 (ROL 命令 - ビットは左に移動し、右から折り返します)
  3. 回転した値を保存
  4. 下位 4 ビットをマスク (AND と $F)
  5. テスト値に対して結果を確認します
  6. 一致する場合は何かを行います
  7. 最後に回転した値を取得する
  8. 2 ~ 7 をあと 3 回繰り返します (単語の残りの 3 つのニブルをキャプチャするため)。

チェックしたい値 (1234h) がレジスタ AX にあり、テスト値が DX にあるとします。次に、可能なプログラムは次のようになります。

    push   ax        ; save the original value
    mov    cx,4      ; set main loop count (how many nibbles we want to check)
mainloop:
    rol    ax,4      ; rotate left 4 bits [puts the top 4 bits into the low 4 bits]
    mov    bx,ax     ; save the rotated value
    and    ax,000Fh  ; mask off bottom 4 bits
    cmp    ax,dx     ; check against our test value
    je     found     ; jump if we found it
    mov    ax,bx     ; retrieve the last rotated value for the next nibble check
    loop   mainloop  ; decrement CX and loop if not zero    

    ... do some things here for "not found" case
    jmp    done
found:
    ... do some things here for "found" case

done:

そんな感じ。元の値を保持するかどうか、一致が見つかった場合と見つからなかった場合の処理​​、すべての出現を一致させるか 1 つだけを一致させるかなど、指定する必要がある条件がいくつかあります。上記は、少なくとも 1 つの一致があったことを示しています。また、ビット操作を使用して値の 4 ビット部分を分離する方法も示します。

于 2013-06-28T23:55:55.497 に答える