Linux x86汇编语言-如何读取输入的字符数?
我知道如果你想输入两个字符,你会使用:Linux x86汇编语言-如何读取输入的字符数?,linux,assembly,x86,gnu,Linux,Assembly,X86,Gnu,我知道如果你想输入两个字符,你会使用: input_str: .ascii "??" 后来: mov $2, %edx 例如: .data input_str: .ascii "??" .text .global _start _start: mov $3, %eax # eax = 3 = function number for "read"
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
等等
但是如果你要求的是一个随机长度的句子呢?如何读取输入后的数据量?处理随机长度数据有不同的技巧,所有这些技巧都需要动态分配内存 在Linux中提供它的最简单方法是使用sys_brk函数,但它只允许分配一个内存块 有些库提供堆管理。其中一个完全用汇编语言编写的库是。另一个选项是链接到C标准库 然后,有两种情况可以读取动态分配的缓冲区中的数据,这取决于您是否提前知道数据长度(在运行时) 已知数据大小 它很简单-分配所需大小的缓冲区并完全读取数据 未知数据大小-所谓的流数据 先读后抄 读取内存中的流数据的唯一可能方法是读取固定的数据块,然后将其复制到动态分配的缓冲区中。当缓冲区被填满时,您需要以更大的大小重新分配它,然后继续,直到读取所有数据 请注意,内存重新分配是一项昂贵的操作,因此最好分配比所需内存更多的内存。常见的算法是每次重新分配时将分配的内存大小增加一倍。就我个人而言,我认为这一策略过于激进,经常使用1.5倍的规模 根本不要读取全部数据
通常可以不读取内存中的全部数据,而是在小的固定块中读取数据时动态处理数据。这种方法需要稍微复杂一点的算法,但其最大的优点是使用非常小的内存,不需要动态分配内存,并避免在多个内存位置之间复制数据。汇编中只有两种类型的错误-注释不描述预期行为,以及不符合评论要求的说明。我修复了你例子中的6个错误。你怎么知道这个句子作为输入结束了?通常会有人点击该键,该键将显示在输入流中。或者你可以根据标点符号,比如“.”、“?”、“!”,等等。不管怎样,你都不知道提前多长时间。您寻找一个标识符,让您知道它已完成。