2017-04-03 5 views
1

ist die Zuordnung: Here is the assignmentSchreiben eines "einfachen Rechners für 32-Bit-Ganzzahlen" in MASM mit der Irvine32-Bibliothek. Wie kann ich diesen "Schreibzugriffsverletzung" -Fehler beheben? Hier

Hier ist der Link zu der Dokumentation der Irvine32 Bibliothek (die ich verwenden müssen): http://programming.msjc.edu/asm/help/

Im Moment bin ich nur das Experimentieren mit, wie man Machen Sie eine erfolgreiche Vorlage prompt/output, und ich beginne mit der Addition. Mein Problem ist, dass ich eine "Schreibzugriffsverletzung" bekomme, wenn ich versuche, WriteString (eine Irvine32-Prozedur) zu verwenden, um die erste Zeile der Antwortausgabe auszugeben. Es wird der Text auf der Konsole gedruckt, aber der Fehler tritt unmittelbar danach auf. Was mich verwirrt ist, dass ich früher im Programm WriteString für andere Strings erfolgreich benutze; Es ist seltsam, dass es hier nicht funktioniert.

Hier ist ein Screenshot von den während der Fehlersuche angezeigt Fehler:

enter image description here

Hier ist mein Code:

.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 

Vielen Dank für einen Blick! :)

Antwort

2

Im Gegensatz zu C++ erlaubt asm nicht die Definition von Variablen zu irgendeinem Zeitpunkt in Ihrem Code. Wie folgt aus:

calculate PROC 
    MOV EDX,OFFSET adding 
    INVOKE WriteString 
    op1 DD ? 
    op2 DD ? 
    result DD ? 
    L1: 
    INVOKE ReadDec 
    JNC chastise 

Dies tut die mov, nicht die invoke, dann versuchen, was Anweisung an op1 lebt auszuführen. Seit der ? bedeutet, dass der Inhalt dieses Ortes nicht definiert ist, wer weiß, was es enthält? Sicher wird es nicht tun, was Sie vorhaben.

Es ist leicht, sich an High-Level-Sprachen zu gewöhnen, bei denen der Compiler den Unterschied zwischen Daten und Code kennt. Aber in asm, wenn Sie es in Ihre .code-Sektion einfügen, ist es Code.

+0

Vielen Dank! Ich konnte das ganze Labor mit deiner Hilfe beenden. Diese kleinen Unterschiede sind Dinge, auf die ich wachsam achten muss – jollypop

Verwandte Themen