1

x86 アセンブリ言語で、レジスタの最初のビットを取得することは可能ですか? eaxレジスタの最初のビットを取得して に移動したいのですがebx、これを行う方法がまだわかりません。

.stack 2048

.data

ExitProcess proto, exitcode:dword 

.code
start:
mov eax, 3;
;now I want to move the first bit of eax into ebx. How can I obtain the first bit from eax?
invoke  ExitProcess, 0
end start
4

5 に答える 5

13

「最初のビット」が最下位ビットを意味する場合は、次を試してください。

 ...
 mov   ebx, eax
 and   ebx, 01

命令が名前付きレジスタのすべてのビットを一度に操作し、「and」命令がオペランドをビットごとに結合することを理解していないようです。

次も機能し、間違いなくリクエストのより直接的な解釈です(「eaxの最初のビットを取得してからEBXに入れる」)が、EAXの内容を破壊します:

 ...
 and   eax, 1
 mov   ebx, eax

アセンブリ コードでは、レジスタがほとんどないため、それらの内容が貴重になる傾向があるため、新しい結果を計算する際に 1 つのレジスタの内容を破棄することは通常避けられます。(できないときはできないが、この場合は避けやすい)。

最後に、次のように記述できます。

 ...
 mov   ebx, 1
 and   ebx, eax

これは問題なく動作し、他の 2 つと同じくらい高速です。私が最初に言及することによって、私が気にかけている値 (EAX の内容) を強調するので、私は最初のものを好みます。この種のスタイルはあまり重要ではないように思えるかもしれませんが、多くのコード、特にアセンブラーなどの難解なものを書く場合、後で読みやすくするためにそれを行うことは非常に価値があります。

Intel のリファレンス マニュアルを見つけて注意深く読んで、各マシン命令が何をするかを理解することは、あなたの苦労の価値があります。それは大きな本なので、大変な作業のように思えます。最初に必要と思われる指示に集中してください。

于 2013-03-06T05:26:29.437 に答える
5

レジスタからビットを取得するandには、対象のビット位置に1があり、他のすべてのビットに0があるマスクを使用した操作が必要です。次に、オプションで、arotate rightまたはarotate leftを使用して、ビットを結果の目的の位置に移動します。

于 2013-03-06T03:44:46.940 に答える
-2

...最初のビットで:

test eax, 1
setz ebx

ダーク

于 2013-03-28T07:10:08.177 に答える