2017-01-03 7 views
3

私はMS-DOSのためのいくつかの小さなツールを書いています。現在、私はShutdown.comを書いています。Windows XP以上のようです。私はすでにコード全体を書いていますが、今度はDOSから引数を渡すだけです。16ビットアセンブリプログラムでDOSコマンドラインパラメータを渡す/取得する方法は?

シャットダウンするには、パラメータ "-r"を再起動し、 "-s"を渡す必要があります。

どうすればいいですか?

私は、Windows98上でTASM(Turbo Assembler 4.1)を使用してリンクしてコンパイルしています。私はそれを行うための非常に簡単な方法を探しています、そして可能であれば、まだ.COMプログラム。私はすでにどのように知っていることを覚えておいてください

  • shutdown -r

  • shutdown -sがシャットダウンを再起動します...正確にC言語からARGVとARGC等が挙げられるが、議会の16ビットを探しています再起動し、PCをシャットダウンする方法を説明します。
    MS-DOSコマンドラインのパラメータを自分のプログラムに渡す方法を知りたいだけです。

  • +0

    あなたはどの団体に電話していますか?もう一つのプログラム? BIOS?アセンブリプログラムは、パラメータが渡されることをどのように期待していますか? – wallyk

    +0

    私はMS-DOSシェルで、shutdown.comを呼び出しています。私がMOVE、FORMAT、FDISKのような他のプログラムを呼び出すように。 – MendaxRox

    +0

    'shutdown.com'はコマンドラインプログラムですか?つまり、コマンドラインから使用するには 'shutdown -r'と打つことができますか? – wallyk

    答えて

    6

    MS-DOSでコマンドラインを取得するためのAPIはありません。代わりに、Program Segment Prefix (PSP)の適切なオフセットから値を読み取る必要があります。これは、DOSがプログラム固有のデータを格納するために使用するデータ構造です。

    オフセット80hには、コマンドライン引数の長さを示す1バイトの値があります。実際のコマンドライン引数文字列は、オフセット81hで始まり、最大127バイトの長さにすることができます。オフセット80hの値に基づいてどのくらいの時間がかかっているかわかりますが、キャリッジリターン(0Dh)で終了します。

    プログラムを初めて実行するときに、DSレジスタのポインタを基準にして、これらのオフセットを使用できます。それ以外の場合は、AH62hに設定してINT 21hと呼んで、BXレジスタの現在のPSPへのポインタを取得します。 (機能62hにはDOS 3以降が必要です; DOS 2では、文書化されていない機能51hを使用できます)。

    総会のランドールハイドのアートの古い、16ビットDOSバージョンは(HTMLPDF形式で)無料オンラインで利用可能です。 Chapter 13では、13.3.11節でPSPについて説明し、次の2つのセクション(13.3.12-13)では、サンプルコードを含むコマンドラインパラメータにアクセスして解析する方法について説明します。

    6

    this siteによれば、コマンドラインの長さはDS:80h(1バイト)に格納され、実際のコマンドライン自体はDS:81hで始まります。この記事のコマンドラインを出力するコード例をいくつか示します。

    ; ---------------------------------------------------------------------------- 
    ; echo.asm 
    ; 
    ; Echoes the command line to standard output. Illustrates DOS system calls 
    ; 40h = write to file, and 4ch = exit process. 
    ; 
    ; Processor: 386 or later 
    ; Assembler: MASM 
    ; OS: DOS 2.0 or later only 
    ; Assemble and link with "ml echo.asm" 
    ; ---------------------------------------------------------------------------- 
    
         .model small 
         .stack 64      ; 64 byte stack 
         .386 
         .code 
    start: movzx cx,byte ptr ds:[80h] ; size of parameter string 
         mov  ah, 40h     ; write 
         mov  bx, 1     ; ... to standard output 
         mov  dx, 81h     ; ... the parameter string 
         int  21h      ; ... by calling DOS 
         mov  ah, 4ch 
         int  21h 
         end  start    
    
    +0

    dxでASCII文字を比較しようとすると問題が発生します。どのようにしてチャートを比較できますか? – MendaxRox

    +0

    @MendaxRox - 最初に ' - 'をループで調べるか、またはrepne scasb(cx = count、di = address)を使用して、次の文字が 'r'か 'R'か 's'または 'S'(*または* 020hで 'r'または 's'を確認できます)。 – rcgldr

    +0

    どうすればいいですか?私はここで少し実験を試みたが、IDは動作しません。 – MendaxRox

    関連する問題