GNU as(AT&Tアセンブリ)のtest命令の意味や使い方についてまとめる
GNU as(AT&Tアセンブリ)の勉強をしているとtest
命令というのが出てきたので、これを機に調べたことをまとめていく。
testとは何か?
test
とは、2つのオペランド(引数)を論理和(AND)で計算して、結果が0であればZEROフラグを0にし、結果が1であればZEROフラグに1を立てる。
また、この論理和の計算結果は計算に使ったレジスタには影響を与えない。つまり、test
はcmp
の論理和に特化した命令だと言える。
test
の具体的な使い方は下記のコードのようになる。
mov $0x03, %rax
mov $0x01, %rcx
test %rcx, %rax
je test_ok
上記のコードではrax
レジスタに3を代入しrcx
レジスタに1を代入している。そして、三行目のtest
で論理和を行なっているが、この論理和の計算結果は0にはならない。
よって4行目のje test_ok
は行われない、という処理になっている。
最初はtest
の挙動を頭の中で整理するのは大変だが、慣れの問題だと思う。
testの具体的な使い方
では、実践的にはtestはどのように使われるかと言うと、「これまで計算した結果が0かどうかで処理を変えたい」という時に役立つ。
例えば、下記のように最終的な計算結果をrax
に収める、という風に処理すると決める。
; たくさんの計算
mov %rcx, %rax ; 計算結果をraxへ
test %rax, %rax
je test_ng
jne test_ok
特徴的なのは3行目のtest %rax, %rax
の部分。raxで論理和をすることで、raxが0だったらZEROフラグが立ち、0以外だとZEROフラグが立たない、という風にしている。