質問:
このアセンブリは何をしているのですか?
Jez
2019-02-25 23:07:25 UTC
view on stackexchange narkive permalink

DOSゲームの一部のアセンブリを理解しようとしていますが、4つのレジスタすべてを使用して呼び出され続ける操作があります。各行が何をしているのかはわかりますが、すべてのコードが一緒になって何をしているのかを一生理解することはできません。

誰か私にアイデアを教えてもらえますか?

コードは次のとおりです。

  seg000:3825 some_math_op_on_regs proc far;コード外部参照:sub_72C6 + 19FPseg000:3825; sub_72C6 + 1DDP ... seg000:3825 cmp cl、10hseg000:3828 jnb short loc_383A; CF = 0seg000:382A mov bx、dx;の場合にジャンプします。 cレジスタは<16です。 dをbseg000:382C shr ax、clに移動します。 c(論理)seg000:382E sar dx、cl;の値で右にシフトします。 c(算術)seg000:3830 negclの値でdを右にシフトします。ネゲートc(2の補数)seg000:3832 cl、10hを追加; cseg000:3835 shl bx、clに16を追加します。 c(論理)seg000:3837またはax、bxの値でbを左にシフトします。またはaとb、結果をaseg000:3839 retfseg000:383Aに格納します。 -------------------------------------------------- ------------------ seg000:383Aseg000:383A loc_383A :;コード外部参照:some_math_op_on_regs + 3jseg000:383A sub cl、10h; cレジスタは> = 16です。 cseg000:383D xchg ax、dxから16を引きます。 aとdseg000:383Ecwdの値を切り替えます。単語をdoublewordseg000:383F sar ax、clに変換します。 c(算術)seg000:3841 retfseg000:3841 some_math_op_on_regs endp  
の値で右にシフトします。
二 答え:
Igor Skochinsky
2019-02-26 02:35:42 UTC
view on stackexchange narkive permalink

これは、32ビットの右シフトコンパイラヘルパーのように見えます。 16ビット時代では、32ビットの数値はレジスタのペア(この場合は ax:dx )で表されていました。 16のチェックは最適化です。シフトが16を超えると、低レジスタ値は完全に失われるため、破棄して dx>>(shift-16)に置き換えることができますが、高レジスタは cwd 命令の結果として符号ビットで埋められます。ボーランドCランタイムライブラリからの(軽く)コメントされたソースコードは、あなたのものと一致しているようです:

 ; [] ----------------- ------------------------------------------------ [] ; | H_LRSH.ASM--右に長くシフト|; [] -------------------------------------- --------------------------- [] ;; C / C ++ランタイムライブラリ-バージョン5.0; ; Copyright(c)1987、1992 by Borland International;全著作権所有。; INCLUDERULES.ASI_TEXTセグメントパブリックバイト 'CODE'はcs:_TEXT public LXRSH @ public F_LXRSH @ public N_LXRSH @ N_LXRSH @:popbx;を修正します。 small mov bx、dx;上位ビットを保存しますshrax、cl;ここで、各半分のsar dx、cl ;;をシフトします。これで、AXに穴ができました。 DXはシフトされるべきでした。だから私たちは私たちを取る必要があります。 DXのコピーを作成し、リバースシフトを実行して適切なものを取得します。 AXにまたは 'されるビット。; neg cl add cl、16 shl bx、clまたはax、bx retflsh @ small:sub cl、16; 15を超えるシフトの場合は、これを実行します。短いシーケンス。 xchg ax、dx;
cwd;これで16シフトしました。sarax、cl;残りをシフトします。 retf_TEXTは終了します 
Johann Aydinbas
2019-02-26 02:33:47 UTC
view on stackexchange narkive permalink

dx:ax で提供される32ビット数の32ビット右シフトのようであり、 cl はシフトするビット数です。

cl が16を超えると仮定した場合、16ビットを超える右シフトは dx に格納されている上位16ビットのみを考慮する必要があります。とにかく下位16ビットがシフトアウトされるためです。

これが、2番目のブロックが行うこととまったく同じです。 cl が16より大きい場合は、 dx (上位16ビット)を ax に移動し、32ビット数に変換して、 cl これは、下位16ビットを無視することによって暗黙的に行われるため、上位部分( cwd のおかげで dx:ax になりました)を次のようにシフトします。その数。

上部を理解しようとはしませんでしたが、16ビット未満のシフト幅でもまったく同じであると想定しています。

基本的には、32ビットです。 16ビットアーキテクチャで行われる右シフト。



このQ&Aは英語から自動的に翻訳されました。オリジナルのコンテンツはstackexchangeで入手できます。これは、配布されているcc by-sa 4.0ライセンスに感謝します。
Loading...