3: 2007-11-27 (火) 13:55:43 |
現: 2024-01-06 (土) 22:37:41 |
| [[FrontPage]] | | [[FrontPage]] |
| | | |
- | 比較を行う | + | 比較を行う。~ |
| 比較の結果は各フラグで判定できる | | 比較の結果は各フラグで判定できる |
| | | |
- | CMP AX,BX ;AXの内容とBXの内容を比較する | + | *できること [#p6f6d78f] |
| + | CMP AX,BX ;レジスタとレジスタを比較する |
| + | |
| + | CMP AX,[0x200] ;レジスタとメモリの内容を比較する |
| + | |
| + | CMP AX,0x3F ;レジスタと即値を比較する |
| + | |
| + | CMP [0x200],0x3F ;メモリの内容と即値を比較する |
| + | |
| | | |
| + | *できないこと [#x91ab0f2] |
| + | CMP [0x200],[0x250] ;メモリの内容同士を直接比較する |
| + | |
| + | CMP 0x3F,0xA8 ;即値同士を直接比較する |
| + | |
| + | CMP ES,[0x250] ;セグメントレジスタが絡む比較 |
| | | |
| + | ---- |
| + | -CMPで比較を行っても値はまったく変化しない。FLAGSのレジスタが変化するだけである。 |
| | | |
- | *結果 [#i071c2c0] | + | -比較した後は各種ジャンプ命令で条件分岐を行う。詳しくは[[こちら>NASK/条件分岐]]を。 |
- | -同じだった!!! | + | |
- | MOV AX,0x20 | + | |
- | MOV BX,0x20 | + | |
- | CMP AX,BX | + | |
| | | |
- | 結果、各種フラグがセットされますのでそのすぐ下で条件ジャンプをします。 | + | *ウンチク [#hd8d5049] |
| + | 以下は知らなくても実用上はあまり問題ではない話。 |
| | | |
- | *単純な比較 [#b4dedf8a] | |
- | JZ xxxxH ;AXとBXが同じだったらジャンプ! | |
- | JE xxxxH ;AXとBXが同じだったらジャンプ! | |
| | | |
- | JNZ xxxxH ;AXとBXが違っていたらジャンプ! | + | CMP命令はSUBと同じ法則でFLAGSを変化させる。いうなれば''値が変化しない引き算''と言える。 |
- | JNE xxxxH ;AXとBXが違っていたらジャンプ! | + | |
| | | |
| | | |
- | *符号なし整数比較 [#a5818235] | + | 具体的には以下のように各フラグが変化する。 |
- | 頭のビットを符号としないで比較する。Cの変数でいえばunsignedで宣言した変数のようなもの | + | |
| | | |
- | JA xxxxH ;AXのほうが大きかった( AX > BX )らジャンプ! | |
- | JNBE xxxxH ;AXのほうが大きかった( AX > BX )らジャンプ! | |
| | | |
- | JB xxxxH ;BXのほうが大きかった( AX < BX )らジャンプ! | |
- | JNAE xxxxH ;BXのほうが大きかった( AX < BX )らジャンプ! | |
| | | |
- | JAE xxxxH ;AXがBX以上( AX >= BX )ならジャンプ! | + | CMP AX,BX |
- | JNB xxxxH ;AXがBX以上( AX >= BX )ならジャンプ! | + | |
| | | |
- | JBE xxxxH ;AXがBX以下( AX <= BX )ならジャンプ! | + | | |>|>|>|>|>|>|>|>|>|>|>|>|>|>|CENTER:FLAGS|h |
- | JNA xxxxH ;AXがBX以下( AX <= BX )ならジャンプ! | + | |~CMP結果|~ |~NT|~IOPL|~0F|~DF|~IF|~TF|~SF|~ZF|~ |~AF|~ |~PF|~ |~CF| |
- | | + | | AX > BX|-|-|-|-|-|-|-|-|0|-|-|-|-|-|0| |
- | | + | | AX = BX|-|-|-|-|-|-|-|-|1|-|-|-|-|-|0| |
- | *符号あり整数比較 [#fad58d64] | + | | AX < BX|-|-|-|-|-|-|-|-|0|-|-|-|-|-|1| |
- | 頭のビットを符号として比較する。 | + | |
- | | + | |
- | JG xxxxH ;AXのほうが大きかった( AX > BX )らジャンプ! | + | |
- | JNLE xxxxH ;AXのほうが大きかった( AX > BX )らジャンプ! | + | |
- | | + | |
- | JL xxxxH ;BXのほうが大きかった( AX < BX )らジャンプ! | + | |
- | JNGE xxxxH ;BXのほうが大きかった( AX < BX )らジャンプ! | + | |
- | | + | |
- | JGE xxxxH ;AXがBX以上( AX >= BX )ならジャンプ! | + | |
- | JNL xxxxH ;AXがBX以上( AX >= BX )ならジャンプ! | + | |
- | | + | |
- | JLE xxxxH ;AXがBX以下( AX <= BX )ならジャンプ! | + | |
- | JNG xxxxH ;AXがBX以下( AX <= BX )ならジャンプ! | + | |
- | | + | |
- | *符号とは? [#obc13660] | + | |
- | レジスタにセットされた16進数の値を、符号付き変数とするか符合なし変数と捕らえるか。(これは最後はプログラマの判断になる) | + | |
- | | + | |
- | たとえば、AXレジスタに0xFFをセットしたとする。この0xFFを符号なしと捕らえると、255という値になるが、符号付だと解釈すると-1という扱いになる。 | + | |
- | | + | |
- | これを意識せずに比較を行うとおかしくなってしまうわけ。 | + | |
- | | + | |
- | そのため、比較命令はおのおの、符号ありと符号なしに分かれて別々に用意されている。 | + | |