有许多有限状态机问的问题,但都与我的问题无关。
我需要5种方法
S0 S1 S2 S3 and read the input
我们从
开始S0
我们要打印状态→0和输出0→
阅读输入 首先是ebx,第二个是eax
. If (ebx ==0&&eax==0)
Call S0
.elseif (ebx==1)&&(eax==1)
Call S1
.else
Call S2
.endif
完成整个计划
这是我的代码: 这里的问题是输入不起作用。如果我输入00,01,11 - >这一切都给了我相同的输出,这是不对的。我想输入00并拨打S0,输入11呼叫S1。这不是我没有做到的原因。 任何人都可以搞清楚。
TITLE finite state machine INCLUDE Irvine32.inc E = 13 .data invalidMsg BYTE 'Ivalid input',0 a DWORD ? b DWORD ? count dword ? prompt1 byte 'Enter 0 or 1: ',0 prompt2 byte 'Enter 0 or 1: ',0 num1 byte 'The output is now 1 ',0 num2 byte 'The ouput is now 0',0 num3 byte 'The state is now 0 ',0 num4 byte 'The state is now 1 ',0 num5 byte 'The state is now 2 ',0 num6 byte 'The state is now 3 ',0 .code main PROC call clrscr mov edx,offset prompt1 call writestring call readint mov a,ebx mov edx,offset prompt2 call writestring call readint mov b,eax .if(ebx ==0 && eax == 0) call S0 .elseif(ebx == 1 && eax == 1) call S1 .elseif(ebx == 0 && eax == 1) call S2 .else call S3 .endif exit main ENDP S0 proc mov edx,offset num3 call writestring call crlf mov edx,offset num2 call writestring call readint ret S0 endp S1 proc mov edx,offset num4 call writestring call crlf mov edx,offset num2 call writestring ret S1 endp S2 proc mov edx,offset num5 call writestring call crlf mov edx,offset num1 call writestring call crlf ret S2 endp S3 proc mov edx,offset num6 call writestring call crlf mov edx,offset num1 call writestring ret S3 endp END main
答案 0 :(得分:0)
我认为a
和b
是您的州?所以你在那里存储状态,但是你在中间调用函数,所以我会假设ebx
在你检查之前被删除了。
call writestring
call readint
mov a,ebx
mov edx,offset prompt2
call writestring
call readint
mov b,eax
所以在这里你需要至少恢复ebx
才能进行检查(eax已经包含了值)。
mov a, ebx
不确定a
是否应该在eax
,因此您可能也需要更换它们。
xchg eax, ebx
我有点惊讶你打电话给readint
并将ebx
移到a
并在你再次拨打readint
之后,但这次移动{{1到eax
。我认为b
会返回readint
中的值,对(您没有提供代码)?那么第一次通话eax
会有什么价值?它可能也应该
ebx
<强>更新强>
mov b, eax
答案 1 :(得分:-2)
TITLE Finite State Machine (Finite.asm)
; This program implements a finite state machine that
; accepts an integer with an optional leading sign.
INCLUDE Irvine32.inc
ENTER_KEY = 13
.data
InvalidInputMsg BYTE "Invalid input",13,10,0
.code
main PROC
call Clrscr
StateA:
call Getnext ; read next char into AL
cmp al,'+' ; leading + sign?
je StateB ; go to State B
cmp al,'-' ; leading - sign?
je StateB ; go to State B
call IsDigit ; ZF = 1 if AL contains a digit
jz StateC ; go to State C
call DisplayErrorMsg ; invalid input found
jmp Quit
StateB:
call Getnext ; read next char into AL
call IsDigit ; ZF = 1 if AL contains a digit
jz StateC
call DisplayErrorMsg ; invalid input found
jmp Quit
StateC:
call Getnext ; read next char into AL
call IsDigit ; ZF = 1 if AL contains a digit
jz StateC
cmp al,ENTER_KEY ; Enter key pressed?
je Quit ; yes: quit
call DisplayErrorMsg ; no: invalid input found
jmp Quit
Quit:
call WaitMsg
call Crlf
exit
main ENDP
;-----------------------------------------------
Getnext PROC
;
; Reads a character from standard input.
; Receives: nothing
; Returns: AL contains the character
;-----------------------------------------------
call ReadChar ; input from keyboard call WriteChar ; echo on screen
ret
Getnext ENDP
;-----------------------------------------------
DisplayErrorMsg PROC
;
; Displays an error message indicating that
; the input stream contains illegal input.
; Receives: nothing.
; Returns: nothing
;-----------------------------------------------
push edx
mov edx,OFFSET InvalidInputMsg
call WriteString
pop edx
ret
DisplayErrorMsg ENDP
END main