2016-10-11 62 views
-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

您未能以我們可以回答的問題的形式陳述您的困惑。告訴我們你的代碼現在在做什麼,包括實際的錯誤信息,你已經做了什麼來解決它,以及你不明白的東西。 「難道我做錯了什麼?」不是一個好的SO問題。 –

+0

好的,我真的知道我做錯了什麼。顯然,我不能一次打印超過1個變量而沒有疊加。因此,我不想用提示1打印出number1,我必須在提示1下面定義數字1.我仍然有問題。我正在嘗試存儲我正在提示的號碼,但現在不會打印出正確的輸入。如果我放入數字9,它會說我的整數是2.對於前任和後繼者,它會說1.我來回更改變量以及事物如何存儲,但仍然沒有運氣。 –

回答

0

甚至沒有看到什麼在io.h包括文件,我發現你正在使用的AToI宏以錯誤的方式!你不應該在兩種情況下指定2個參數

AToI String 

AToI Number1 

什麼是下一個指令在這裏做。這似乎很無用!
爲什麼宏名後的逗號?

IToA, Number1, Ax 

我覺得你根本看不到數字的價值之間的差額,它的文字表述。你的代碼表明你認爲你可以使用兩個變量來代替這兩個變量。你不能!由於Number1被定義爲單詞它可以只存儲該值。

0

在玩過一些遊戲後,我發現嘗試使用輸出的命令並沒有使我獲得任何地方。所以我必須按順序定義我想要打印的標籤。所以如果我想打印Sum,然後是一個標籤。我必須首先定義總和然後標籤,並在最後放置一個停止代碼。仍然無法打印某些變量的問題,我發現Bx和Cx不能用於算術。爲了得到一個特定的數字,再打印一些標籤,例如「x的前任是y」,我必須爲3個標籤中的每一個在3個不同位置存儲x的值。所以這是我的最終代碼:

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 

我有點覺得愚蠢現在只發布了這個問題與玩弄自己固定的代碼結束。