我目前被困在我的代码的一部分,我需要向用户询问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
...