Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 如何比较菜单的无效输入_Visual Studio_Assembly_X86_Irvine32 - Fatal编程技术网

Visual studio 如何比较菜单的无效输入

Visual studio 如何比较菜单的无效输入,visual-studio,assembly,x86,irvine32,Visual Studio,Assembly,X86,Irvine32,我在getcombo函数中遇到问题。我想检查用户输入的值是否在菜单选项范围(1-4)内。因此,我将用户输入的值与整数值(如1、2、3和4)与if-else语句进行比较。但即使用户输入正确的值,程序仍会要求用户再次输入值 INCLUDE Irvine32.inc .data MAX = 80 userInput BYTE MAX+1 DUP (?) msgName BYTE 'Enter Your Name : ' ,0 msgPass BYTE 'E

我在
getcombo
函数中遇到问题。我想检查用户输入的值是否在菜单选项范围(1-4)内。因此,我将用户输入的值与整数值(如1、2、3和4)与
if-else
语句进行比较。但即使用户输入正确的值,程序仍会要求用户再次输入值

INCLUDE Irvine32.inc

.data

MAX = 80                    
userInput BYTE MAX+1 DUP (?)

msgName BYTE 'Enter Your Name : ' ,0
msgPass BYTE 'Enter Your Password : ' , 0

comboTitle BYTE'COMBO Meals',0
line1 BYTE'==================',0
line2 BYTE'==================',0

comboMeal1 BYTE '1) Chicken Burger      + Coca Cola    + Cheesy Wedges   | RM 15.00',0
comboMeal2 BYTE '2) Grilled Beef Burger + Pepsi        + French Fries    | RM 17.00',0
comboMeal3 BYTE '3) Spicy Korean Wings  + Coca Cola    + salad           | RM 10.00',0
comboMeal4 BYTE '4) Chicken Pizza       + mountain dew + minched Potato  | RM 20.00',0

selectedCombo BYTE ' ',0


prompt1 BYTE 'Please select a Combo Meal : ',0

mealPrice1 dword 15.00
mealPrice2 dword 17.00
mealPrice3 dword 10.00
mealPrice4 dword 20.00

invalidLogin BYTE 'Invalid' , 0
invalidSelection BYTE'Please select within given menu option',0
validPass BYTE 'Valid Password' , 0

loginPassword BYTE "123" , 0
loginName BYTE "bob" , 0


.code
main PROC

Login :

    ;---------------- Display "Enter Your Name"
    mov edx,OFFSET msgName  
        call WriteString
    ;---------------- Get name input 
    call GetInput
    ;---------------- compare user input and name
    mov ebx , OFFSET loginName
    .IF eax == [ebx] 
    ;--------------- Correct input

        ;---------------- Display "Enter Your Password"
        mov edx,OFFSET msgPass  
        call WriteString
        ;---------------- Get password input 
        call GetInput
        ;--------------- compare user input and password
        mov ebx , OFFSET loginPassword
        .IF eax == [ebx] 
        ;--------------Correct input
        jmp displayMenu
        .ELSE 
        ;--------------- Incorrect input
        jmp InvalidInput
        .ENDIF

    ;---------------
    .ELSE 
    ;-------------- Incorrect input
        jmp InvalidInput
    .ENDIF


InvalidInput :
    ;---------------Display "Invalid"
    mov edx,OFFSET invalidLogin  
    call WriteString
    call Crlf
    ;--------------- Repeat process
    jmp Login

invalidMenuSelect:
  xor edx,edx
  mov edx, OFFSET invalidSelection
  call WriteString
  call Crlf

  jmp getCombo

display:
    mov edx,OFFSET validPass  
    call WriteString

displayMenu :
   mov edx,OFFSET line1
    call WriteString
    call Crlf
    xor edx,edx

    mov edx,OFFSET comboTitle
    call WriteString
    call Crlf
    xor edx,edx

    mov edx,OFFSET line1
    call WriteString
    call Crlf
    xor edx,edx

    mov edx,OFFSET comboMeal1
    call WriteString
    call Crlf
    xor edx,edx

    mov edx,OFFSET comboMeal2
    call WriteString
    call Crlf
    xor edx,edx

    mov edx,OFFSET comboMeal3
    call WriteString
    call Crlf
    xor edx,edx

    mov edx,OFFSET comboMeal4
    call WriteString
    call Crlf
    xor edx,edx

    call Crlf
    mov edx,OFFSET prompt1
    call WriteString
    call Crlf
    xor edx,edx

    jmp getCombo
    exit

getCombo :
call GetInput

.IF eax == '1' 
xor edx,edx
mov edx, OFFSET comboMeal1
;mov selectedCombo , edx

.ELSEIF eax == '2'
xor edx,edx
mov edx, OFFSET comboMeal2
;mov selectedCombo , edx

.ELSEIF eax == '3'
xor edx,edx
mov edx, OFFSET comboMeal3
;mov selectedCombo , edx

.ELSEIF eax == '4'
xor edx,edx
mov edx, OFFSET comboMeal4
;mov selectedCombo , edx

.ELSE
jmp invalidMenuSelect

.ENDIF
main ENDP



GetInput PROC 
;-------------
;Get User input
;-------------
    xor eax,eax
    mov  edx,OFFSET userInput
    mov  ecx,MAX            
    call ReadString
    mov eax,[edx]
    ret
GetInput ENDP

END main

代码的问题在于,用于输入的ReadString函数正在向eax寄存器添加新行馈送字符。要解决您的问题,您只需检查
。如果al==“1”
,依此类推。更好的方法是使用Irvine库函数
ReadChar
,然后检查al寄存器


您的
GetInput
处理4个字节的字符串,而不是1。这与。它远远不是最小的,充满了臃肿的菜单打印代码。您可以将整个内容放在一个包含换行符的大字符串中,也可以在数组上循环。(并使用同一数组,使用整数索引而不是if/else链进行菜单选择)。让两个单独的
line1
line2
具有相同的内容也是毫无意义的。无论如何,请使用调试器并检查寄存器的值。请以代码的形式提供代码,而不是以屏幕截图的形式提供代码。有关详细信息,请参见和。谢谢。你的意见帮助我解决了我的问题。