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

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

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


我假设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 ,但是这次把eax移到b 。 我会认为readint返回eax的值,对(你没有提供代码)? 那么在第一次通话时ebx会有什么价值? 它可能应该也是

mov b, eax

更新

mov edx,offset prompt1
call writestring
call readint
mov a,eax

mov edx,offset prompt2
call writestring
call readint
mov b,eax

mov eax, a
mov ebx, b

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
链接地址: http://www.djcxy.com/p/89849.html

上一篇: I am trying to program finite state machine in assembly language but i am stuck

下一篇: how can i convert decimal to hex using assembly language x86 masm