2016-10-11 73 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 

我有点觉得愚蠢现在只发布了这个问题与玩弄自己固定的代码结束。