Написание обработчика команд в программе masm, включая файлы lrvine с языка ассемблера для процессоров x86, автор Kip Irvine - PullRequest
0 голосов
/ 20 февраля 2020

Это код, который у меня есть, очевидно, он еще не завершен. Я не могу получить строку для чтения для сравнения и ветвления. Я пробовал значения ASCII, десятичные значения и сравнения символов. Кажется, я не могу получить с операторами. Я знаю, что мне нужно сделать преобразование из двоичного в десятичное после команды "parsedecimal32" из библиотеки Irvine32.


SPACE_KEY = 20
PWORD  TYPEDEF PTR DWORD
.data
prompt BYTE "Enter desired input:", 13,10,0
errormsg BYTE "Invalid input", 13,10,0
sa BYTE "At stateA", 13,10,0
I BYTE "At addition", 13,10,0
II BYTE "At subtraction", 13,10,0
III BYTE "At multiplication", 13,10,0
IV BYTE "At division", 13,10,0
V BYTE "At Digit", 13,10,0
process dword null
null EQU 0
buffersize EQU 41
buffer BYTE buffersize DUP(0)
ptr1 PWORD process

.code
main PROC
    call Clrscr

StateA:
    cmp al,SPACE_KEY        ; SPACE key pressed?
    je  Quit                ; yes: quit
    MOV edx, OFFSET sa
    call WriteString
    call    Getnext             ; read next char into AL
L1:    
    mov edi,ptr1 
    cmp edi,'+'         ; leading + sign?
    je  addi         
    cmp edi, '-'            ; leading - sign?
    je  subt        
    cmp edi, '*'
    je multi
    cmp edi, '/' 
    je divi
    call parsedecimal32
    jmp digit
    call    DisplayErrorMsg     ; invalid input found
    jmp Quit

digit:

    MOV edx, OFFSET V
    call WriteString
    inc edi
    jmp StateA

addi:
    MOV edx, OFFSET I
    call WriteString
    ;call   DisplayErrorMsg     ; no: invalid input found

    jmp StateA
subt:
MOV edx, OFFSET II
    call WriteString
    jmp StateA
multi:
MOV edx, OFFSET III
    call WriteString
    jmp StateA
divi:
MOV edx, OFFSET IV
    call WriteString
    jmp StateA
Quit:
    call    Crlf
    exit
main ENDP

;-----------------------------------------------
Getnext PROC
;
; Reads a character from standard input.
; Receives: nothing
; Returns: AL contains the character
;-----------------------------------------------    
     MOV edx, OFFSET prompt
     call WriteString
     MOV edx, OFFSET buffer
     MOV ecx, buffersize
     call ReadString        ; input from keyboard
     call WriteString
     mov process, eax


     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 errormsg
     call  WriteString
     pop      edx
     ret
DisplayErrorMsg ENDP
END main`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...