如何检查对用户输入的上下界进行纠错?NASM组装



我目前被困在我的代码的一部分,我需要向用户询问0到25之间的数字。如果超出了这个范围,我必须承认它,并要求用户请求另一个号码。这是在64位intel架构内完成的。

section .data
text1 db "Enter shift value: "
text2 db "Enter original message: "
text3 db "Current message: "
text4 db "Encryption: "
;lowBound dword 0
;upBound dword 25
section .bss
value resb 5
message resb 100
section .text
global main
main:
call _printText1
call _getVal
call _checkVal  
call _printText2
call _getMes
call _printText3
call _printMes

call _printText4
;call _printEncryp
mov rax, 60
mov rdi, 0
syscall
_printText1:
mov rax, 1
mov rdi, 1
mov rsi, text1
mov rdx, 19
syscall
ret
_getVal:
mov rax, 0
mov rdi, 0
mov rsi, value
mov rdx, 5
syscall
ret
_checkVal:
mov eax, value

ret

这是我目前所拥有的,_checkVal函数是我检查用户输入是否在0到25之间的地方。提前感谢!

_getVal传递的是一个以换行符结尾的字符串(希望是数字)。您需要使用转换例程将其转换为数字的值。下面是一个简化的示例,假设用户只输入有效数字,不输入其他内容。

_getVal:
xor   eax, eax
xor   edi, edi
mov   esi, value
mov   edx, 5
syscall
xor   eax, eax             ; Result = 0
mov   esi, value
jmp   .begin
.digit:
inc   esi                  ; Next character
lea   eax, [rax + rax * 4] ; Result = Result * 10 + NewDigit
lea   eax, [rdx + rax * 2]
.begin:
movzx edx, byte [rsi]      ; -> RDX = Newline or ["0","9"]
sub   edx, 48              ; -> RDX = {-38, 0, 1, ..., 9}
jnb   .digit
ret

现在重做如果值不在[0,25]

main:
call  _printText1
call  _getVal              ; -> RAX is value
cmp   eax, 26
jnb   main
...

相关内容

  • 没有找到相关文章

最新更新