Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux x86汇编语言-如何读取输入的字符数?_Linux_Assembly_X86_Gnu - Fatal编程技术网

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个错误。你怎么知道这个句子作为输入结束了?通常会有人点击该键,该键将显示在输入流中。或者你可以根据标点符号,比如“.”、“?”、“!”,等等。不管怎样,你都不知道提前多长时间。您寻找一个标识符,让您知道它已完成。