我知道如果你想要输入两个字符,你可以使用:
input_str: .ascii "??"
然后再说:
mov $2, %edx
如:
.data
input_str: .ascii "??"
.text
.global _start
_start:
mov $3, %eax # eax = 3 = function number for "read"
mov $0, %ebx # ebx = 0 = file descriptor (stdin)
mov $input_str, %ecx # ecx = address of input buffer
mov $2, %edx # edx = buffer maximum size
int $0x80 # Call Linux kernel API
# eax = error code or number of bytes read
等等......
但是,如果你要求一个随机长度的句子怎么办?你如何阅读输入后有多少?
答案 0 :(得分:1)
处理随机长度数据有不同的技巧,所有这些都需要动态分配的内存。
在Linux中提供它的最简单方法是使用 sys_brk 函数,但它只允许分配一个内存块。
有些库提供堆管理。一个这样的库,完全使用汇编语言FreshLib。另一个选择是链接C标准库。
然后,有两种情况可以读取动态分配的缓冲区中的数据,具体取决于您是否事先知道数据长度(在运行时)。
很简单 - 分配具有所需大小的缓冲区并完全读取数据。
在内存中读取流数据的唯一可能方法是读取此数据的固定块,然后将其复制到动态分配的缓冲区中。当缓冲区被填满时,您需要以更大的大小重新分配它,然后继续直到读取所有数据。
请注意,内存重新分配是昂贵的操作,因此最好分配超过所需的内存。通用算法是在每次重新分配时将分配的内存大小加倍。就个人而言,我认为这种策略过于激进,通常会使用大小乘以1.5;
通常可能无法读取内存中的整个数据,而是在小型固定块中读取时动态处理它。这种方法需要更复杂的算法,但是使用非常小的内存具有很大的优势,不需要动态分配内存,并且避免了在多个内存位置之间复制数据。