Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 汇编语言中的TIC-TAC-TOE_Arrays_Loops_Assembly_X86 - Fatal编程技术网

Arrays 汇编语言中的TIC-TAC-TOE

Arrays 汇编语言中的TIC-TAC-TOE,arrays,loops,assembly,x86,Arrays,Loops,Assembly,X86,我正在尝试用汇编语言制作TIC-TAC-TOE。我在使用cmp时遇到问题。我希望当用户选择1时,它应该跳转到标签1,然后在屏幕上仅将字符“1”替换为“X”,但它将所有九个数字替换为“X”。 这是我的密码: .686 .MODEL flat, stdcall .STACK INCLUDE Irvine32.inc .data tic BYTE "TIC TAC TOE GAME" player BYTE "PLAYER 1 (X) : PLAYER 2 (O)" myarray1 BYTE '

我正在尝试用汇编语言制作TIC-TAC-TOE。我在使用
cmp
时遇到问题。我希望当用户选择1时,它应该跳转到标签1,然后在屏幕上仅将字符“1”替换为“X”,但它将所有九个数字替换为“X”。
这是我的密码:

.686 
.MODEL flat, stdcall
.STACK
INCLUDE Irvine32.inc

.data
tic BYTE "TIC TAC TOE GAME"
player BYTE "PLAYER 1 (X) : PLAYER 2 (O)"
myarray1 BYTE '1' , ' ' , '|' , ' ' , '2' , ' ' , '|' ,' ' ,'3'
myarray2 BYTE '4' , ' ' , '|' , ' ' , '5' , ' ' , '|' ,' ' ,'6'
myarray3 BYTE '7',  ' ' , '|' , ' ' , '8' , ' ' , '|' ,' ' ,'9'
position BYTE "Select You Position: ",0
choise BYTE 'X','O'
turn BYTE 0
info byte ?

.code 
main PROC
mov bl,turn
mov ecx,9
L13:
call clrscr
call BOARD
call GAME
loop L13



BOARD proc


;TO DISPLAY TIC TAC TOE GAME
mov ecx, LENGTHOF tic
mov esi,Offset tic
L0:
mov al,[esi]
call writechar
inc esi
loop l0
call crlf
call crlf


;TO DISPLAY PLAYER INFO
mov ecx,LENGTHOF player
mov esi,OFFSET player
l6:
mov al,[esi]
call writechar
inc esi
loop L6
call crlf
call crlf


;LOOP TO DISPLAY FIRST ARRAY
mov ecx,LENGTHOF myarray1
mov esi,OFFSET myarray1
L1:
mov al,[esi]
call writechar
inc esi
loop L1
call crlf

;LOOP TO DISPLAY SECOND ARRAY
mov ecx,LENGTHOF myarray2
mov esi,OFFSET myarray2
L2:
mov al,[esi]
call writechar
inc esi
loop L2
call crlf

;LOOP TO DISPLAY THIRD ARRAY
mov ecx,LENGTHOF myarray3
mov esi,OFFSET myarray3
L3:
mov al,[esi]
call writechar
inc esi
loop L3
call crlf
call crlf 

mov ecx,LENGTHOF position
mov esi,OFFSET position

L4:
mov al,[esi]
call writechar
inc esi
loop L4
call crlf
ret
BOARD endp

GAME proc

L60: 
call readint
mov al,info

cmp al,1
je one

cmp al,2
je two

cmp al,3
je three

cmp al,4
je four

cmp al,5
je five

cmp al,6
je six

cmp al,7
je seven

cmp al,8
je eight

cmp al,9
je nine

one:
mov al,choise
xchg al,[myarray1]

two:
mov al,choise
xchg al,[myarray1+4]


three:
mov al,choise
xchg al,[myarray1+8]

four:
mov al,choise
xchg al,[myarray2]

five:
mov al,choise
xchg al,[myarray2+4]

six:
mov al,choise
xchg al,[myarray2+8]

seven:
mov al,choise
xchg al,[myarray3]

eight:
mov al,choise
xchg al,[myarray3+4]

nine:
mov al,choise
xchg al,[myarray3+8]
ret
GAME endp

exit
main endp
end main
此主循环将失败,因为对BOARD的调用将修改
ECX
中的循环控制变量。你需要保存它

mov ecx,9
L13:
push ecx         <<<<<<
call clrscr
call BOARD
call GAME
pop ecx          <<<<<<
loop L13
在这些指令之间,您缺少一个正确的程序出口,或者您最好编写省略号(…),这样我们就可以知道这里有更多您认为不需要包含的代码

loop L13

...

BOARD proc


通常readint会在
EAX
中给出一个结果。然后你可以复制一份,但这意味着要写
mov-info,al
,与你写的相反!请记住,目的地在左侧,来源地在右侧。

您的分支彼此交叉。在每次
xchg
之后,您需要跳转(或
ret
)。(C中的
中断
,如果你知道C)PS:学习使用调试器。作为一种礼貌,如果你看到你的代码被链接和代码按钮破坏,请努力格式化你的代码。没有任何其他位置我甚至看不到您的
readint
在哪里,以及发生了什么变化
info
。我说过你应该学习使用调试器吗?
    ...
    cmp al,9
    je nine
    RET                  <<<<<< What if choice was invalid ?
one:
    mov al,choise
    xchg al,[myarray1]
    RET                  <<<<<<
two:
    mov al,choise
    xchg al,[myarray1+4]
    RET                  <<<<<<
    ...
loop L13



BOARD proc
loop L13

...

BOARD proc
call readint
mov al,info