使用Irvine32库在MASM中编写“32位整数的简单计算器”。如何修复此“写入访问冲突”错误?

时间:2017-04-03 04:27:49

标签: assembly masm irvine32

以下是作业: Here is the assignment

以下是Irvine32库(我必须使用)的文档链接:http://programming.msjc.edu/asm/help/

现在我正在尝试如何成功地创建模板提示/输出,并且我将从添加操作开始。我的问题是,当我尝试使用WriteString(一个Irvine32程序)来打印第一行响应输出时,我得到了“写访问冲突”。它会在控制台上打印文本,但错误会立即出现。令我困惑的是,在程序的早期我成功地将WriteString用于其他字符串;它在这里不起作用很奇怪。

以下是调试期间显示错误的屏幕截图:

enter image description here

这是我的代码:

.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

谢谢你看看! :)

1 个答案:

答案 0 :(得分:2)

与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部分,那就是代码。