gpt4 book ai didi

linux - 如何测试以确保只输入一个整数并确保在汇编中输入的长度为 5 个字节或更少?

转载 作者:太空宇宙 更新时间:2023-11-04 12:47:06 25 4
gpt4 key购买 nike

如何测试以确保仅输入整数并确保在以下代码中输入的长度不超过 5 个字节?

我想了解如何正确控制输入,以便在程序退出时不会将超过 5 个字节的输入输出到终端。

此外,我将如何测试以确保只输入一个字符串,最后在最后一个场景中,只输入一个 double 值?

*** 根据 x82 和 Peter C 的指导更新了代码。我做了一些 C disas 并且能够在下面修改我的原始代码。它仍然有一些缺陷,但你们都提供了很大的帮助!当输入超过 5 个整数字节时,我只是停留在它不会像我输入字符数据时那样重新提示,因为它继续将额外的字节数据转储到 tty。

SECTION .data                   ; initialized data section
promptInput db 'Enter Number: ', 0
lenPromptInput equ $ - promptInput
displayInput db 'Data Entered: ', 0
lenDisplayInput equ $ - lenDisplayInput

SECTION .bss ; uninitialized data section
number resb 1024 ; allocate 1024 bytes for number variable

SECTION .text ; code section
global _start ; linker entry point

_start:
nop ; used for debugging

Read:
mov eax, 4 ; specify sys_write call
mov ebx, 1 ; specify stdout file descriptor
mov ecx, promptInput ; display promptInput
mov edx, lenPromptInput ; length of promptInput
int 0x80 ; call sys_write

mov eax, 3 ; specify sys_read call
mov ebx, 0 ; specify stdin file descriptor
mov ecx, number ; pass address of the buffer to read to
mov edx, 1024 ; specify sys_read to read 1024 bytes stdin
int 0x80 ; call sys_read

cmp eax, 0 ; examine sys_read return value in eax
je Exit ; je if end of file

cmp byte [number], 0x30 ; test input against numeric 0
jb Read ; jb if below 0 in ASCII chart
cmp byte [number], 0x39 ; test input against numeric 9
ja Read ; ja if above 9 in ASCII chart

Write:
mov eax, 4 ; specify sys_write call
mov ebx, 1 ; specify stdout file descriptor
mov ecx, displayInput ; display displayInput
mov edx, lenDisplayInput ; length of displayInput
int 0x80 ; call sys_write

mov eax, 4 ; specify sys_write call
mov ebx, 1 ; specify stdout file descriptor
mov ecx, number ; pass address of the number to write
mov edx, 5 ; pass number of numbers to write
int 0x80 ; call sys_write

Exit:
mov eax, 1 ; specific sys_exit call
mov ebx, 0 ; return code 0 to OS
int 0x80 ; call sys_exit

最佳答案

(既然你接受了这个答案,我会指出这个关于在 TTY 上使用 read 的问题的实际答案是 my other answer on this question。)

这是您的 low-quality followup question 的答案当你删除它时我正要发布它。

请注意,我说的是“您可以在一个新问题中寻求调试帮助”,而不是说您应该在一个问题中提出 3 个不同的问题,然后重新发布几乎没有更改的整个代码,而不是认真尝试解决您自己的问题。让新问题成为问题仍然取决于您。

如果我一开始没有引导您发布它,我可能不会回答它。欢迎来到 StackOverflow,我很慷慨,因为你是新手,还不知道什么是好问题。


字符“0”到“9”的常用术语是“数字”,而不是“整数”。它更具体。

ensure only integers are inputted in the buffer

你不能。如果检测到此类输入,您必须决定要做什么。

Need help creating an array to loop through

您的缓冲区是一个字节数组。

你可以用类似的东西循环它

    # eax has the return value from the read system call, which you've checked is strictly greater than 0
mov esi, number ; start pointer

scan_buffer:
movzx edx, byte [esi]
# do something with the character in dl / edx
...

inc esi ; move to the next character

dec eax
jnz scan_buffer ; loop n times, where n = number of characters read by the system call.

ensure characters over the 1024 buffer do not send data to the tty

如果你担心 1024 对这个玩具程序来说不够大,那么使用 select(2)poll(2) 来检查是否有如果没有,则可以在不阻塞的情况下读取更多输入。

关于linux - 如何测试以确保只输入一个整数并确保在汇编中输入的长度为 5 个字节或更少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38423008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com