Как проверить, что конец пользовательского ввода заканчивается на "?""." "!" - PullRequest
1 голос
/ 19 октября 2019

Получите новое сообщение от пользователя. Проверьте сообщение, чтобы убедиться, что оно начинается с заглавной буквы и заканчивается точкой ('.'), Вопросительным знаком ('?') Или восклицательным знаком ('!'). Если ввод неверен, отклоните его с сообщением об ошибке пользователю (продолжайте использовать предыдущее сообщение вместо этого). В противном случае, если действительно, замените исходное сообщение.

Я проверяю первый символ, который работает, теперь, чтобы проверить конец строки, я добавляю длину входного символа к входу минус 1., но это меняет значениепервого символа пользовательского ввода.

section .data
        text1 db "ENTER TEXT: "
        len equ $ - text1
        text2 db "THIS IS WHAT YOU ENTERED: "
        text3 db "invalid message, keeping curent "


section .bss
        character resb 255

section .text
        global main

main:
        mov r11, text2

        mov rax, 1
        mov rdi, 1
        mov rsi, text1
        mov rdx, 12
        syscall
        call validate


validate:

         mov rax, 0
        mov rdi, 0
        mov rsi, character
        mov rdx, 10
        syscall                                                                                                                                                                
        mov r8, rax

        mov rdi, character
        mov al, [character]
        mov ah, 'A'
        cmp al, ah
        jl invalid

        cmp al, 90
        jg invalid

        add rax, r8             ;                                                                                                                                                                           
        sub rax, 1

        cmp rax, '!'
        je valid
        cmp rax, '.'
        je valid
        cmp rax, '?'
        je valid
valid:

        mov r11, character

        mov rax, 1
        mov rdi, 1
        mov rsi, r11
        mov rdx, r8
        syscall
        jmp exit

invalid:

        mov rax, 1
        mov rdi, 1
        mov rsi, text3
        mov rdx, 12
        syscall
        jmp exit

exit:

        mov rax, 60
        xor rdi, rdi
        syscall

1 Ответ

2 голосов
/ 19 октября 2019

Рассмотрите возможность упрощения вашего кода и в то же время не изменяйте вход пользователя. SYSCALL уже вернул количество введенных вами символов, и RSI не изменился.

mov  cl, [rsi]      ; RSI already points to first character
cmp  cl, 'A'
jb  invalid
cmp  cl, 'Z'
ja  invalid

mov  al, [rsi+rax-2]    ; RAX = # of characters entered

cmp  al, '.'
jz  valid
cmp  al, '?'
jz  valid
cmp  al, '!'
jnz Error

Теперь ведущий символ не был изменен и экономит несколько байтов, не устанавливая другие указатели без необходимости.

...