汇编语言中用户输入的字符数

问题描述 投票:0回答:1

我试图提示用户输入一个长度为1到30个字符的ID,它可以是字母和数字,但限制为30个字符。下面是我的代码,它在我输入的任何 ID 中显示错误(就像如果我输入 123helo,它会显示错误)。

INCLUDE Irvine32.inc 

.data
IDprompt BYTE " ENter ID: ",0
InvalidId BYTE " ID you entered is not valid ",0


.code 
Main Proc 
call ID_check

exitProgram:
exit 
Main ENDP

ID_check PROC
    Mov edx, OFFSET newline
    call WriteString 
    mov edx, OFFSET IDprompt   ; Display prompt for student ID
    call WriteString
    
    mov edx, OFFSET id  ; Buffer for student ID
    mov ecx, 31         ; Maximum characters to read including null terminator 
    call ReadString 
             
    cmp byte ptr [id], 0       ; Check for null input and re-prompt if empty
    je  ID_check               ; Ask to enter ID again if left null
    
    ; Null-terminate the ID buffer after reading
    movzx ebx, byte ptr [id]   ; Get the length of the input
    mov byte ptr [id + ebx], 0 ; Null-terminate the string
    
    cmp ebx, 1    ; Check if input is less than 1 character
    jl id_invalid
    cmp ebx, 30   ; Check if input is more than 30 characters (including null terminator)
    jg  id_invalid 
            
    ret

id_invalid:
    Mov edx, OFFSET newline
    call WriteString 
    mov edx, OFFSET invalidId
    call WriteString
    jmp ID_check

ID_check  ENDP

END Main 

assembly
1个回答
0
投票
cmp byte ptr [id], 0       ; Check for null input and re-prompt if empty
je  ID_check               ; Ask to enter ID again if left null

; Null-terminate the ID buffer after reading
movzx ebx, byte ptr [id]   ; Get the length of the input
mov byte ptr [id + ebx], 0 ; Null-terminate the string

cmp ebx, 1    ; Check if input is less than 1 character
jl id_invalid
cmp ebx, 30   ; Check if input is more than 30 characters (including null terminator)
jg  id_invalid 

即使您相信 ReadString 返回的长度存储在第一个字节中,那么:

  • cmp ebx, 1
    将是一个冗余操作,因为第一个字节已经建立为包含 1 或更多。
  • cmp ebx, 30
    是多余的,因为您已经将输入限制为 31 个(包括终止符),因此永远不要超过 30 个字符。
    请注意,如果您对此不信任ReadString,那么在您自己进行测试之前
    mov byte ptr [id + ebx], 0
    是不明智的。
来自

尔湾图书馆帮助

ReadString 从标准输入读取最多包含 ECX 非空字符的字符串,当用户按 Enter 键时停止。 输入字符后会存储一个空字节,但尾随的回车符和换行符不会放入缓冲区。
ECX 应始终小于缓冲区大小(永远不等于缓冲区大小),因为空字节可能是存储的第 (ECX+1) 个字符。

调用args:EDX指向输入缓冲区,ECX要读取的最大非空字符数
返回arg:EAX = 输入字符串的大小。

您希望将输入限制为 30 个字符。因此指定 ECX=0 并准备一个 31 字节的缓冲区。您不需要将自己归零。 EAX 将保存 0 到 30 之间的值。

mov edx, OFFSET id ; Buffer for student ID mov ecx, 30 ; Max chars to read EXCLUDING null terminator call ReadString test eax, eax ; Check for null input and re-prompt if empty jz ID_check ; Ask to enter ID again if left null
    
© www.soinside.com 2019 - 2024. All rights reserved.