当前位置: 首页 > 知识库问答 >
问题:

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

宰父学
2023-03-14

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

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

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个答案

段铭晨
2023-03-14
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
向杜吟
2023-03-14

我假设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

不确定是否应该eax中,因此您可能还必须交换它们。

 xchg eax, ebx

另外,我有点惊讶你调用读音并将ebx移动到a,然后在你再次调用读音之后,但这次将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
 类似资料:
  • 为了更加深入理解C语言的本质,我们需要学习一些汇编相关的知识。作为最基本的编程语言之一,汇编语言虽然应用的范围不算很广,但是非常重要。因为它能够完成许多其它语言所无法完成的功能。就拿 Linux 内核来讲,虽然绝大部分代码是用 C 语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码,其中主要是在 linux 的启动部分。由于这部分代码与硬件的关系非常密切,即使是 C 语言也会有些力不从心,而

  • 机器语言 机器语言是指令的集合。 汇编语言 汇编语言的主体是汇编指令。 存储器 随机存储器RAM,可读可写,必须带电存储,关机后存储的内容丢失 只读存储器ROM,只读,关机后其中的内容不丢失 装有 BIOS (基本输入输出设备)的ROM 接口卡上的RAM:显存 外存(storage,磁盘)和内存(memory,主存,高速缓存) 内存地址空间 存储单元:1个字节(byte) 总线 地址总线:CPU是

  • 问题内容: 我知道供应商有自己的原始SQL语言子集,这些子集用C(类似于Postgre SQL)或MS-SQL Server(C ++)等编写。 那么,原始的SQL是用C编写的,还是在Assembly中创建的呢?我真的找不到关于其原始语言根源的明确答案(除了历史等) 问题答案: 在Oracle上进行的快速历史搜索得出: 在70年代后期,Ingres刚开始在加州大学伯克利分校工作时,三个从事CIA合

  • 是否可以在x86汇编语言中模拟if-statment(使用masm语法)?我想在x86汇编语言中做这样的事情,但我不确定应该使用哪个运算符来模拟if-ore语句。我应该使用指令,还是指令,还是其他指令?

  • 程序员用各种编程语言编写指令,有些是计算机直接理解的,有些则需要中间翻译(tranlation)的步骤。如今使用的计算机语言有几百种,可以分为三大类: 机器语言 汇编语言 高级语言 任何计算机只能直接理解本身酌机器语言(machine language)。机器语言是特定计算机的自然语言,由计算机的硬件设计定义。机器语言通常由一系列数字组成(最终简化0和1),让计算机一次一个地执行最基本的操作。机器

  • 《汇编语言》(Assembly Language)是计算机专业中一门重要的基础课程,是一种面向机器的低级语言。它依赖于硬件,能通过巧妙的程序设计充分发挥硬件的潜力。汇编语言程序产生的代码运行效率高。因此,到目前为止,许多软件系统(例如操作系统等)的核心部分仍然用汇编语言来编写。