我做了以下代码来提示输入一个数字,然后在一个字符串中返回相同的数字,在前一个字符串的另一个字符串中返回相同的数字,以及给定的数字及其后继数,但无论我做什么,我总是没有任何回报。代码给了我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
答案 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
我现在觉得很愚蠢,因为发布这个问题只是为了通过玩游戏自己来修复代码。