无法从DOS返回值和3个警告

时间:2016-10-11 00:57:53

标签: assembly dos

我做了以下代码来提示输入一个数字,然后在一个字符串中返回相同的数字,在前一个字符串的另一个字符串中返回相同的数字,以及给定的数字及其后继数,但无论我做什么,我总是没有任何回报。代码给了我4个不同时间遇到的依赖于传递的构造的警告。难道我做错了什么?或者这是我的DOS模拟器的问题吗?

    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

2 个答案:

答案 0 :(得分:0)

甚至没有看到io.h包含文件中的内容,我发现您以错误的方式使用AToI宏!在两种情况下都不应该指定 2个参数吗?

AToI String

以及

AToI Number1

下一条指令在这里做了什么。这似乎没用!! 也为什么宏名后的逗号?

IToA, Number1, Ax

我认为你从根本上看不到数字的价值与其文字表示之间的区别。您的代码显示您认为可以使用 Number1 变量。你不能!由于 Number1 被定义为,因此它只能存储该值。

答案 1 :(得分:0)

在玩了一些游戏之后,我发现尝试使用输出的命令并没有让我到任何地方。因此,我必须按顺序定义我想要打印的标签。所以,如果我想打印Sum然后是标签。我必须首先定义总和然后标签,并在结尾处设置一个停止代码。仍然无法打印某些变量的问题,我发现Bx和Cx不能用于算术。并且要使用某些标签(例如&#34)再次打印一定数量; x的前身是y"对于3个标签中的每一个,我必须将x的值存储在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

我现在觉得很愚蠢,因为发布这个问题只是为了通过玩游戏自己来修复代码。