我试图提示用户输入一个长度为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
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 个字符。mov byte ptr [id + ebx], 0
是不明智的。
尔湾图书馆帮助:
您希望将输入限制为 30 个字符。因此指定 ECX=0 并准备一个 31 字节的缓冲区。您不需要将自己归零。 EAX 将保存 0 到 30 之间的值。ReadString 从标准输入读取最多包含 ECX 非空字符的字符串,当用户按 Enter 键时停止。 输入字符后会存储一个空字节,但尾随的回车符和换行符不会放入缓冲区。
ECX 应始终小于缓冲区大小(永远不等于缓冲区大小),因为空字节可能是存储的第 (ECX+1) 个字符。
调用args:EDX指向输入缓冲区,ECX要读取的最大非空字符数
返回arg:EAX = 输入字符串的大小。
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