这是任务:

下面是指向Irvine32库(必须使用的):http://programming.msjc.edu/asm/help/的文档的链接
现在,我只是在试验如何生成一个成功的模板提示符/输出,并从加法操作开始。我的问题是,当我试图使用WriteString (一个Irvine32过程)打印第一行响应输出时,会出现“写访问冲突”。它确实会在控制台上打印文本,但是在后面会立即出现错误。让我困惑的是,在程序的早期,我成功地将WriteString用于其他字符串;它在这里不起作用是很奇怪的。
下面是调试过程中显示的错误的屏幕截图:

这是我的代码:
.386
.MODEL flat,stdcall
.STACK 4096
ExitProcess PROTO,dwExitCode:DWORD
WriteString PROTO
ReadDec PROTO
.DATA
promptLineOne DB "1. X + Y 6. X and Y",13,10,0
promptLineTwo DB "2. X - Y 7. X or Y",13,10,0
promptLineThree DB "3. X * Y 8. not X",13,10,0
promptLineFour DB "4. X / Y 9. X xor Y",13,10,0
promptLineFive DB "5. X mod Y 10. Exit Program",13,10,0
adding DB "Adding X and Y; enter X, then enter Y",0
added DB "The sum of X and Y is: ",0
tryAgain DB "Try again",0
.CODE
prompt PROC
MOV ECX,5
MOV EAX,0
MOV EDI,OFFSET promptLineOne
L1:
MOV EDX,EDI
INVOKE WriteString
L2:
INC EDI
MOV AL,[EDI]
CMP EAX,0
JNZ L2
INC EDI
LOOP L1
RET
prompt ENDP
calculate PROC
MOV EDX,OFFSET adding
INVOKE WriteString
op1 DD ?
op2 DD ?
result DD ?
L1:
INVOKE ReadDec
JNC chastise
JC FirstPass
JNC L1
FirstPass:
MOV op1,EAX
L2:
INVOKE ReadDec
JNC chastise
JC SecondPass
JNC L2
SecondPass:
MOV op2,EAX
ADD EAX,op1
ADD EAX,op2
MOV result,EAX
MOV EDX,OFFSET added
INVOKE WriteString
MOV EDX,OFFSET result
INVOKE WriteString
RET
calculate ENDP
chastise PROC
MOV EDX,OFFSET tryAgain
INVOKE WriteString
RET
chastise ENDP
main PROC
INVOKE prompt
INVOKE ReadDec
INVOKE calculate
INVOKE ExitProcess,0
main ENDP
END main谢谢你看一看!)
发布于 2017-04-03 05:10:31
与c++不同,asm不允许您在代码中的任何点定义变量。如下所示:
calculate PROC
MOV EDX,OFFSET adding
INVOKE WriteString
op1 DD ?
op2 DD ?
result DD ?
L1:
INVOKE ReadDec
JNC chastise这将执行mov,执行invoke,然后尝试执行在op1中存在的任何指令。从那以后?意味着这个位置的内容没有定义,谁知道它包含什么?当然它不会按你的意愿去做。
在编译器知道数据和代码之间的区别的情况下,很容易习惯于高级语言。但是在asm中,如果你把它放在你的.code部分,那就是代码。
https://stackoverflow.com/questions/43176485
复制相似问题