2017-11-07 12 views
0

私は、ファイルを分析し、その情報(名前とサイズ)をファイルに出力するアセンブラプログラムを作成しています。私は基本的に4Ehと4Ehの割り込みを使用してファイルを検索しています。それらは両方とも、そのファイルに関する情報に基づいてDTAオブジェクトを返します。32ビットのファイルサイズと16ビットのユーザー入力を比較しますか?

16ビットのユーザー入力サイズと比較する必要がある32ビットファイルサイズを戻します(指定されたユーザー入力サイズより大きい場合はファイル情報のみを出力する必要があります)。

ここで明白な問題は、32ビットの数値を16ビットの数値に変換する方法がわからないことです。そうでなければ、私はそれらを比較できないためです。たぶん、誰かがこの変換を実行する方法を知っているか、この比較を実装する方法に関する他のアイデアがありますか?

可能な場合は、多分誰かがあなたが逆方向にそれについて考えているTASMインテルのx86アセンブリのコード例

+0

ファイルサイズの上位16ビットがゼロ以外の場合は、明らかにユーザー入力よりも大きな数値です。それらがゼロの場合は、比較できる2つの16ビット数値があります。簡単です。 – Jester

+0

範囲0..65535の値は16ビットに収まります(上位16ビットはゼロになります)。 65536+の値は、上位16ビットにゼロ以外のビットがあります。あなたのアプリが入力として16ビットの値(0..65535)しか取らない場合は、最初に、上位16ビットをチェックして長さが65536以上であるかどうかを調べることができます。 – Ped7g

答えて

0

を提供することができます。

16ビットの数値を32にゼロ拡張し、32ビットの比較を行いたいとします。

Jesterが説明しているように、これは、ユーザー入力の上位16が常にゼロであることを意味しています(つまり、Cでは、異なるタイプの操作は、 extended-precision/BigIntegerの比較の上半分を行うことは、ファイルサイズの上半分が非ゼロであることを単純にチェックすることです。次に、ファイルサイズが16ビットユーザー入力を下回るように十分に小さい場合は、下半分をしきい値と比較します。


またより少なくより拡張精度の減算をやっことによってのみ、1分岐命令とを確認することができます。

file_loop:    ; do { 
    load a new file size 

    ;; file size in dx:ax, threshold in cx 
    cmp ax, cx  ; low half (non-destructive: cmp = sub but without writing ax) 
    sbb dx, 0   ; high half. (destructive) 
    ; ZF reflects only the high-half compare result 
    ; CF is useful (and so are SF/OF for signed compare). 
    ; Avoid JCC conditions that depend on ZF, like JA. 
    jnb file_loop ; } while(CF==0); (JNB = JNC) 

;;; dx:ax < 0:cx unsigned was true. 
;;; So we know the original DX was 0 (and is now 0xFFFF) 
;;; AX = the file size (which we didn't destroy), and we know it fits in 16 bits. 

    do something with this file 
    jmp file_loop 

これは素晴らしく、コンパクト、しかしcmp/jzよりも、おそらく特に良いとは限りませんcmp/jb、特に32ビットの数値がメモリ内にある場合(。あなたは、メモリの先でsbbを使用しない、それはあまり効率的です)


> 16 32の変換簡単です:ちょうど上位16ビットを無視して切り捨てます。しかし、あなたはそれがあなたが望むことをしないことをすでに認識したようです。

dx:axの32ビット整数をcxの16ビット整数に変換するには、次の命令を使用します。mov cx, ax

+0

同じ意味で8bitと32bitの数値を比較できますか?私は32ビット数を4つの8ビット数(2つのハイパーツ、2つのローパーツ)に分割すると、ハイパーツまたはローパーツのいずれかにゼロ以外の数字があると仮定することができます任意の8ビット番号よりも。それ以外の場合は、32ビットの右端から8ビットの数字までを比較することができます。 –

+0

@JonasPetraška:はい、ただし、8086は16ビットアーキテクチャなので、1ステップで32ビットの数値の上位16を確認できます。'movzx'(386)や' xor ax、ax'/'mov al、single_byte'を使って8ビットの数値をゼロに拡張して16にすることもできます。 32ビットの数値。 –

+0

@PeterCorder:ありがとうございました! –

関連する問題