我有一个小的汇编程序,我试图读入一个整数,并验证它是否在0-100,000之间。这目前不起作用。此时,一个有效的整数(例如10)将使程序跳转到invalidInput标签,然后程序退出。
我认为这个错误的原因是由于在跳转之前的比较。用户输入的整数是否有不同的比较方式?
我认为读入的值必须更改为整数(从“字符串”转换而来?)
这是我的第一个汇编程序,所以我还在学习基础知识。
section .bss
value: resb 4
section .data
prompt db 'Enter a integer between [0-100000]: ', 0xa
promptLen equ $-prompt
invalidMsg db 'Invalid data. Integers between [0-100000] are valid. Exiting.', 0xa
invalidMsgLen equ $-invalidMsg
section .text
global _start
_start:
; Display prompt
mov rdx, promptLen ; message length
mov rcx, prompt ; message to write
mov rbx, 1 ; file descriptor for stdout
mov rax, 4 ; system call for sys_write
int 0x80 ; call kernel
;Read the value and store it
mov rax, 3 ; sys_read
mov rbx, 0 ; descriptor value for stdin
mov rcx, value ; where to store the input
mov rdx, 5 ; 5 bytes
int 80h ; call kernel
mov edx, value ; move value to a register before comparing
cmp edx, 100000
jg invalidInput ; jump if the input is greater than 100000
cmp edx, 0
jl invalidInput ; jump if the input is less than 0
; Other instructions (that aren't important for now) here
invalidInput:
mov rdx, invalidMsgLen ; message length
mov rcx, invalidMsg ; message to write
mov rbx, 1 ; file descriptor for stdout
mov rax, 4 ; system call for sys_write
int 0x80 ; call kernel
mov rax, 1 ; exit
int 0x80 如何验证此输入?
发布于 2018-02-02 00:49:58
您读取的字符串必须转换为二进制值(您已经说过,您认为它应该转换为整数,这就是这样的二进制值),只有这样,您才能将其与另一个数字进行比较。因此,找到一个转换例程( web上和Stack Overflow上的许多示例)。
另外,如果您在NASM中编写
mov edx,num您正在将num的地址加载到edx中,然后将其与100000进行比较。该地址几乎肯定比100000大。但是您希望将值存储在那里,因此:
mov edx,[num]再试一次。这里假设num是存储转换后的(二进制)数字的地址。正如我所说的,与字符串进行比较是无用的。
https://stackoverflow.com/questions/48564820
复制相似问题