首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Irvine32库在MASM中编写一个“32位整数的简单计算器”。如何修复这个“写访问冲突”错误?

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

Stack Overflow用户
提问于 2017-04-03 04:27:48
回答 1查看 1.4K关注 0票数 1

这是任务:

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

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

下面是调试过程中显示的错误的屏幕截图:

这是我的代码:

代码语言:javascript
复制
.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

谢谢你看一看!)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-03 05:10:31

与c++不同,asm不允许您在代码中的任何点定义变量。如下所示:

代码语言:javascript
复制
calculate PROC
  MOV EDX,OFFSET adding
  INVOKE WriteString
  op1 DD ?
  op2 DD ?
  result DD ?
  L1:
    INVOKE ReadDec
    JNC chastise

这将执行mov,执行invoke,然后尝试执行在op1中存在的任何指令。从那以后?意味着这个位置的内容没有定义,谁知道它包含什么?当然它不会按你的意愿去做。

在编译器知道数据和代码之间的区别的情况下,很容易习惯于高级语言。但是在asm中,如果你把它放在你的.code部分,那就是代码。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43176485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档