1

作成するアセンブリプログラムがあります。AXレジスタをチェックする必要があります。AXレジスタが0より大きい場合は、BXで+1を移動し、AXレジスタの値が0未満の場合は、BXで-1を移動します。それ以外の場合、AX = 0の場合は、BXで0を移動します。私はそれを行う次のコードを持っていますが、私は別の解決策を探しています。手伝ってください。ありがとう

CMP AX, 0
JG GREATER
JL LESS
MOV BX, 0
GREATER:
MOV BX, 1
LESS:
MOV BX, -1
4

2 に答える 2

3

指定したコードは常に-1を返します。これを試して:

CMP AX, 0
JG GREATER
JL LESS
MOV BX, 0
JMP END
GREATER:
MOV BX, 1
JMP END
LESS:
MOV BX, -1
END:
于 2012-05-01T15:37:55.797 に答える
1

これを試してください。これには、単一の条件付きブランチのみが必要であり、無条件のジャンプは必要ありません。

    mov     bx, ax      // copy ax to bx
    sarw    bx, 15      // arithmetic shift - any -ve => -1, 0 or +ve => 0
    cmp     ax, 0       // compare original number to zero
    jle     end         // if it's <=, we're done
    mov     bx, 1       // else bx = 1
end:

注意-私のx86コードは非常に錆びています。また、そのバージョンはsar8086にはありませんでしたが、286以降にあり、80386まで特に高速になりませんでした。

編集私はブランチのない386+のより良いバージョンを見つけたと思います:

    mov     bx, ax     // copy ax to bx      
    sarw    bx, 15     // arithmetic shift - any -ve => -1, 0 or +ve => 0
    cmp     ax, 0      // compare original to zero
    setg    bl         // if it was greater, bl = 1 (bh already == 0 from above)
于 2012-05-01T16:04:26.440 に答える