以下是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
谢谢你看看! :)
答案 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部分,那就是代码。