2016-10-11 8 views
-1

私は次のコードを使って数字の入力を促し、同じ数字を1つの文字列に、同じ数字を別の文字列の前の数字とその後継者だが、私が何をするにしても、私はいつも何も返さない。このコードでは、4回に渡ってパス依存の構造が発生するという警告が表示されます。私は何か間違っているのですか?それとも私のDOSエミュレータの問題ですか?DOSから返された値と3つの警告を受け取ることができません

INCLUDE io.h 

Cr  EQU 0DH  ; carriage return 
Lf  EQU 0AH  ; line feed 

TheStack SEGMENT STACK 
      DW 100H DUP (?) 
TheStack ENDS 

Data  SEGMENT 
Number1 DW ? 
Number2 DW 1 
Prompt1 DB 'Please enter an integer of your choice: ', 0 
Prompt2 DB Cr, Lf, 'Enter second number: ', 0 
String DB 40 DUP (?) 
Label1 DB Cr, Lf, 'Your integer is ' 
Label2 DB Cr, Lf, ' is the sucessor of ' 
Label3 DB Cr, Lf, 'the predecessor of ' 
Label4 DB Cr, Lf, 'is ' 
Diff  DB 6 DUP (?) 
      DB Cr, Lf 
Sum1  DB 6 DUP (?) 
      DB Cr, Lf, 0 
Sum2  Db 6 DUP (?) 
      DB Cr, Lf, 0 

Data  ENDS 

Code  SEGMENT 
      ASSUME Cs:Code, Ds:Data 

Start: Mov Ax, SEG Data ; Load Data Segment Number. 
      Mov Ds, Ax 

Prompt: Output Prompt1  ; Prompt for first number. 
      Inputs String, 40 ; Read the ASCII characters.  
     AToI String   
     Mov Ax, Number1 
    IToA, Number1, Ax 
      Output Label1 
     Output Number1  ; Output label and sum. 

      AToI Number1 

      Mov Ax, Number1 
     Sub Ax, Number2  ; Store second number. 
     IToA Sum1, Bx 
     output Sum1, Label2, Number1, stop 
      Sub Ax, Number2  ; subtract second number. 
      IToA Diff, Ax 
     IToA Number1 
     Mov Bx, Number1  ; Load first number in accumulator. 
     Add Bx, Number2 
     IToA Diff, Bx 
      Output Label3 and Diff and Label4 and stop ; Output label and sum. 


Quit:  Mov Al, 0   ; Put return code of zero in Al. 
      Mov Ah, 4CH   ; Put DOS function call in Ah. 
      int 21H    ; Call DOS 

Code  ENDS 
      END Start 
+0

私たちが答えることができる質問の形であなたの混乱を述べることに失敗しました。実際のエラーメッセージ、解決するために行ったこと、正確に理解できないことなど、コードが現在何をしているのかを教えてください。 「何か間違っているの?」良いことではありません。 –

+0

さて、私は間違っていたことを実際に考え出しました。どうやら、積み重ねることなく、一度に1つ以上の変数を印刷することはできません。だから、プロンプト1で数字1を印刷したいのではなく、数字1をプロンプト1の下に定義する必要があります。私はまだそれに問題があります。私はプロンプトを出している番号を保存しようとしていますが、今は正しい入力をプリントアウトしていません。私が9を入れると、私の整数は2であると言い、前任者と後継者の両方に対して、それは1と言うでしょう。私は変数を変えたり、物事をどのように保存しているか、 。 –

答えて

0

でもio.hに何があるか見てないファイルが含まれ、私はあなたが間違った方法でAToIマクロを使用していることがわかりました!両方の場合にの2つの引数をに指定しないでください。

AToI String 

とも

AToI Number1 

次の命令はここで何をやっています。それは全く役に立たないようです!
また、マクロ名の後のコンマはなぜですか?

IToA, Number1, Ax 

私は基本的に数の値の差が表示されていないと、それはテキストの表現だと思います。あなたのコードは、Number1変数を両方に使用できると考えていることを示しています。できません! 番号1という単語で定義されていたので、値に値を格納するだけで済みます。

0

いくつか再生した後、私は出力とコマンドを試してみるとどこにも届かないということを発見しました。だから私は、ラベルで印刷したいものを順番に定義しなければならなかった。だから、私はSumを印刷して、ラベルを印刷したければ。最初に合計を定義してからラベルを作成し、最後に停止コードを入れなければなりませんでした。まだいくつかの変数を印刷できないという問題は、BxとCxを算術演算に使用できないことを発見しました。そして、「xの前身はyです」というようなラベルを使ってもう一度印刷するには、xの値を3つのラベルのそれぞれに3つの異なる場所に保存しなければなりませんでした。だから、これは私の最終的なコードです:

INCLUDE io.h 

Cr  EQU 0DH  ; carriage return 
Lf  EQU 0AH  ; line feed 

TheStack SEGMENT STACK 
      DW 100H DUP (?) 
TheStack ENDS 

Data  SEGMENT 
Number1 DW ? 
Number2 DW '1' 
Prompt1 DB 'Please enter an integer of your choice: ', 0 
String DB 40 DUP (?) 
Label1 DB 'Your integer is: ' 
Int1  DB 6 DUP (?) 
Stop1  DB '.' 
     DB Cr, Lf, 0 
Label3 DB Cr, Lf, 'The predecessor of ' 
Int3  DB 6 DUP (?) 
Label4 DB ' is ' 
Diff  DB 6 DUP (?) 
Stop2  DB '.', 0 
Sum DB 6 DUP (?) 
Label2 DB ' is the sucessor of ' 
Int2  DB 6 DUP (?) 
Stop3  DB '.', 0 

Data  ENDS 

Code  SEGMENT 
      ASSUME Cs:Code, Ds:Data 

Start: Mov Ax, SEG Data ; Load Data Segment Number. 
      Mov Ds, Ax 

Prompt: Output Prompt1  ; Prompt for first number. 
      Inputs String, 40 ; Read the ASCII characters.  
     AToI String  
      Mov Number1, Ax 
     IToA Int1, Ax 
     IToA Int2, Ax 
     IToA Int3, Ax 
     Output Label1 
      AToI Number2 
     Mov Number2, Ax 
      Mov Ax, Number1 
     Add Ax, Number2  
     IToA Sum, Ax 
     Output Sum  
      Mov Ax, Number1 
     Sub Ax, Number2 
     IToA Diff, Ax   
      Output Label3 ; Output label and sum. 


Quit:  Mov Al, 0   ; Put return code of zero in Al. 
      Mov Ah, 4CH   ; Put DOS function call in Ah. 
      int 21H    ; Call DOS 

Code  ENDS 
      END Start 

私はちょっとだけ遊んでコードを自分自身を固定になってしまうために、この質問を投稿するために、今愚かな感じ。

関連する問題