Assembly ist eine lustige Sprache zu lernen. Ich habe noch viel Raum für Verbesserungen. Ich versuche, ein einfaches Würfelspiel zu machen, das zufällige Würfel x Male basierend auf Benutzereingabe würfeln soll. Ich habe den Code wie folgt:x86 Irvine Assembly JMP + CMP und bedingte Schleifen - Craps Spiel
TITLE Program Template (main.asm)
INCLUDE Irvine32.inc
.data
diceOne DWORD ?
diceTwo DWORD ?
win DWORD 7, 11
lose DWORD 2, 3, 12
mark DWORD 4, 5, 6, 8, 9, 10
markCounter DWORD ?
userInput BYTE 'Enter integer: ', 0
numRolls DWORD ?
printWon BYTE 'Won: ', 0
wonCounter DWORD ?
printWin BYTE ' You win!', 0
printLost BYTE 'Lost: ', 0
lostCounter DWORD ?
printLose BYTE ' You lose!', 0
printTotal BYTE 'Total: ', 0
space DWORD ' ', 0
printPlus BYTE ' + ', 0
printMark BYTE ' Mark ', 0
.code
main PROC
call randomize ; set random seed
mov ecx, 6 ; counter set to 6
mov edx, offset userInput ; print string
call writeString
call readInt ; read input
mov numRolls, eax ; store input in variable
mov ecx, numRolls
mov eax, 0
mov edi, offset win
call gamesRolled
exit
main ENDP
;number of games rolled based on user input
gamesRolled PROC uses eax ecx
DICEROLLS:
call crlf
;diceOne roll
mov eax, 5 ;move value into eax to pass as parameter for randomrange
call randomRange ;randomrange stored in eax 0-5
inc eax
mov diceOne, eax ;mov the value of randomrange into variable
call writeDec
push edx ;push edx off stack to print space
mov edx, OFFSET printPlus
call writeString
pop edx
;diceTwo roll
mov eax, 6
call randomRange
inc eax
mov diceTwo, eax
call writeDec
add eax, diceOne ; add diceOne roll to diceTwo roll
cmp eax, win ; comp eax value to win
je wins
cmp eax, lose
je losses
cmp eax, mark
je marks
LOOP DICEROLLS
ret
gamesRolled ENDP
wins PROC uses edi ecx
mov edi, offset win
mov ecx, lengthof win
cmp eax, [edi]
add edi, type win
push edx
mov edx, offset printWin
call writeString
pop edx
jmp gamesRolled
ret
wins ENDP
losses PROC uses edi ecx
mov edi, offset lose
mov ecx, lengthof lose
cmp eax, [edi]
add edi, type lose
push edx
mov edx, offset printLose
call writeString
pop edx
jmp gamesRolled
ret
losses ENDP
marks PROC uses edi ecx
mov edi, offset lose
mov ecx, lengthof lose
cmp eax, [edi]
add edi, type lose
push edx
mov edx, offset printMark
call writeString
pop edx
jmp gamesRolled
ret
marks ENDP
END main
So scheint es einfach genug aus den Beispielen und Erklärungen, die ich gesehen habe. Ich benutze den Cmp/Je, um wie ein if-Statement zu arbeiten, während ich die Würfel rollen lasse. Die Idee ist, die Gewinne oder Verluste oder Marken zu erhöhen und alles auszudrucken. Es funktioniert gut ohne den CMP/Je Teil. Ich bin zwar in der Lage, zufällige Würfelröllchen zu drucken, aber sobald ich anfange, cmp/je zu versuchen, bekomme ich ein seltsames Einfrieren und manchmal einen Absturz. Ich versuche zu lernen, wie man besser in Assembler programmiert. Würden Sie mir bitte helfen, zu verstehen, warum das nicht so funktioniert, wie ich es mir vorgestellt habe? Ich dachte mir, wenn ich das EAX-Register, das die Summe von diceOne + diceTwo enthält, als die anderen Funktionen springen würde und in diesen Funktionen sollte edi wie ein Zähler sein, der während des Druckens einer Zeichenfolge, die einen Gewinn, Verlust oder Markierung angibt, zählt . So zum Beispiel:
Ich habe nicht zum letzten Teil noch, da ich Probleme mit dem Code habe, wie es ist. Schätze jede Hilfe damit. Ich bin ratlos, danke.
vergessen hat, ist dies ein tatsächliches Ergebnis hinzuzufügen, ich bin jetzt immer:
Enter integer: 5
3 + 2
3 + 5
2 + 5 You win!
3 + 6
5 + 5^C
Ich weiß, dass einige der Variablen nicht verwendet werden, bitte ignorieren Sie diese. – Alex
Ich habe die Regel (Tldr) nicht verstanden, aber was ich sehe, vergleichen Sie nur mit den Werten 7, 2 und 4, nicht mit allen Mitgliedern des Arrays. ist das beabsichtigt? – Tommylee2k
Zuerst 'call randomRange' wird Werte nur im 0-4 Bereich (' mov eax, 5' voraus) – Ped7g