어셈블리는 재미있는 학습 언어입니다. 나는 여전히 개선의 여지가 많다. 나는 임의의 주사위 롤을 x 번 사용자 입력을 기반으로해야하는 간단한 크랩 게임을 만들기 위해 노력하고 있습니다. 나는 다음과 같은 코드를 가지고있다 :x86 Irvine 어셈블리 jmp + cmp 및 조건부 루프 - 크랩 게임
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
그래서 예제와 설명에서 충분히 간단 해 보인다. 주사위를 굴릴 때 if 문처럼 작동하도록 cmp/je를 사용하고 있습니다. 아이디어는 승리 또는 손실 또는 점수가 증가하고 모든 것을 인쇄하는 것입니다. 그것은 cmp/je 부분없이 잘 동작합니다. 나는 무작위 주사위 굴림을 인쇄 할 수 있지만 일단 cmp/je하려고하면 이상한 동결과 때로는 충돌이 발생합니다. 어셈블리를 더 잘 코딩하는 법을 배우려고합니다. 왜 내가 이것이 그렇게 생각하는 방식으로 작동하지 않는지 이해할 수 있도록 도와 주시겠습니까? 나는 만약 dpiOne + dice의 합계가 포함 된 eax 레지스터를 다른 함수들과 그 함수들로 뛰어 넘어야한다고 생각했다. edi는 win, lose 또는 mark를 나타내는 문자열을 출력하는 동안 카운터가되어야한다. . 따라서 예를 들면 다음과 같습니다.
Enter integer: 5
2 + 3 Mark
1 + 5 Mark
5 + 6 You win!
5 + 1 Mark
2 + 6 Mark
Wins: 1 Losses: 0 Marks: 4
나는 코드에 문제가있는 것이므로 아직 마지막 부분을 얻지 못했습니다. 어떤 도움을 주셔서 감사합니다. 나는 잃어 버렸어, 고마워.
이 내가 지금지고있어 실제 결과 추가하는 것을 잊었다 :
Enter integer: 5
3 + 2
3 + 5
2 + 5 You win!
3 + 6
5 + 5^C
일부 변수는 사용되지 않는 것으로 알고 있습니다. 무시하십시오. – Alex
나는 규칙 (tldr)을 이해하지 못했지만 배열의 모든 구성원이 아닌 값 7, 2 및 4 만 비교합니다. 이게 의도 된거야? – Tommylee2k
첫 번째'randomRange'는 0-4 범위의 값만 출력합니다. ('mov eax, 5' ahead) – Ped7g