2017-11-08 4 views
-1

私はしばらくの間、自分のコードを修正しようとしていましたが、私はwork.Itにそれを得るように見えることはできませんエラーを教えてください:COMファイルを生成することはできません。どのように私はこれを修正することができる任意のアイデア?「エラー:COMファイルを生成できません、スタックセグメントが存在しません」を修正するには?

.model small 
.386 
.stack 100h 
.data 
    inpM db "Input string: $" 
    input db 19    ; max allowed 20 
       db ?    ; # char entered 
       db 19 dup(0) ; chars entered 
    output db 19 dup("$") 
.code 
start: mov ax, @data 
      mov ds, ax 

      mov ah, 9    ; print inpM 
      lea dx, inpM 
      int 21h 

      mov ah, 0Ah   ; get input 
      lea si, input 
      mov dx, si 
      int 21h 

      mov cl, [si+1]  ; reverse 
      mov ch, 0 
      add si, cx 
      inc si 
      lea di, output 

rev:  mov al, [si] 
      mov [di], al 
      dec si 
      inc di 
      loop rev 

again: mov ah, 6   ; clrscr 
      mov al, 0 
      mov cl, 0 
      mov ch, 0 
      mov dl, 4Fh 
      mov dh, 18h 
      mov bh, 0Fh 
      int 10h 

      mov ah, 0 
      mov bh, 0 
      mov dl, 27h   ; column 
      mov dh, 0    ; row 

      mov ah, 9    ; print output 
      lea dx, output 
      int 21h 

      mov bx, 20000  ; delay 
l1:  mov cx, 0Fh 

l2:  dec bx 
      loop l2 
      jnz l1 

      add dh, 1    ; adds 1 to row 

      loop again 

      mov ah, 4Ch 
      int 21h 
end start 

追加情報:

は、ここに私のコードです私のコードは、文字列の入力を反転させる遅延を持つ行に表示します。どのようなエラーの原因と私はそれを修正することができるでしょう見つけることを願っています。

答えて

4

私はTASMとTLINKをEXEではなく.COMプログラムとしてビルドする際にエラーが発生したと仮定しています。あなたが知っておく必要があるもの:

  • COMプログラムがtinyモデル、ないsmallを使用する必要があります。
  • COMプログラムは、.codeセグメントを開始した後、100時間のORGで開始する必要があります。
  • COMプログラムのスタックは、コードが実行されているセグメントの先頭から開始されるため、スタックサイズの設定を削除する必要があります。
  • COMプログラムでCS = DS = ES = SSであるため、EXEファイルを作成するときと同じようにDSを設定する必要はなくなりました。心の中でそれらのもので

、あなたはこのように表示されるように、あなたのコードの先頭を変更することができます。

.model tiny 
.386 
.data 
    inpM db "Input string: $" 
    input db 19    ; max allowed 20 
       db ?    ; # char entered 
       db 19 dup(0) ; chars entered 
    output db 19 dup("$") 
.code 
org 100h 
start: 
     mov ah, 9    ; print inpM 
     lea dx, inpM 
     int 21h 

     ... 

あなたは、その後でそれを構築することができます:

tasm myprg.asm 
tlink /t myprg.obj 
+1

なぜ私が求めることができます'CS = DS = ES = SS'リストから' ES'を削除しましたか? .COMファイルの場合、4つのセグメントレジスタはすべてDOSで同じに設定されます。 – Fifoernik

+1

@Fifoernik:良い質問です。数年前、私はCOMプログラムをロードするときにESを設定しなかったDOSのバージョンがあったというジャーナル(Dr Dobbs?)の脚注を思い出してしまったように思えるかもしれません。大量の注意の中から誰かが私に電話をかけたときにそれを削除しました。私は例外を探しに行くことを決めたので、それを見つけることができませんでした。私の想像力だったかもしれない)。私は「PC Interns」がすべて私のために十分なPSPセグメントがロードされている状態であるため、それを戻しました。 –

関連する問題