我试图用汇编语言编写有限状态机,但我被卡住了

时间:2013-12-07 07:22:04

标签: assembly x86 masm state-machine irvine32

有许多有限状态机问的问题,但都与我的问题无关。

我需要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

2 个答案:

答案 0 :(得分:0)

我认为ab是您的州?所以你在那里存储状态,但是你在中间调用函数,所以我会假设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