首页 文章

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

提问于
浏览
0

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

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

  • -2

    我假设 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 会有什么 Value 呢?它可能也应该是

    mov b, eax
    

    update

    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
    
  • 0
    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
    

相关问题