次のようなレジスタに 16 進値が格納されています。
mov ax,1234h
各文字 (1,2,3,4) を 10 進値と比較する必要があります。理想的には、レジスタ内の文字/数字をループしますが、それぞれを指す方法や、可能かどうかさえわかりません。これはどのように行うことができますか?
これはアセンブリ言語であるため、この操作のすべてを実行する 1 つの命令はありません。いくつかのステップがあります。おそらく、最も時間効率の良い方法は次のように説明されます。最初のステップは、必要に応じて値を保存することです。これは、コードの残りの部分が値を破棄するためです。これらの手順は少し不正確ですが、一般的なアルゴリズムを示します。
チェックしたい値 (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 ビット部分を分離する方法も示します。