x86汇编语言 - 如何读取输入的字符数?

时间:2013-03-14 22:57:35

标签: 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"
    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
等等......

但是,如果你要求一个随机长度的句子怎么办?你如何阅读输入后有多少?

1 个答案:

答案 0 :(得分:1)

处理随机长度数据有不同的技巧,所有这些都需要动态分配的内存。

在Linux中提供它的最简单方法是使用 sys_brk 函数,但它只允许分配一个内存块。

有些库提供堆管理。一个这样的库,完全使用汇编语言FreshLib。另一个选择是链接C标准库。

然后,有两种情况可以读取动态分配的缓冲区中的数据,具体取决于您是否事先知道数据长度(在运行时)。

已知数据大小

很简单 - 分配具有所需大小的缓冲区并完全读取数据。

未知数据大小 - 所谓的流数据

阅读然后复制

在内存中读取流数据的唯一可能方法是读取此数据的固定块,然后将其复制到动态分配的缓冲区中。当缓冲区被填满时,您需要以更大的大小重新分配它,然后继续直到读取所有数据。

请注意,内存重新分配是昂贵的操作,因此最好分配超过所需的内存。通用算法是在每次重新分配时将分配的内存大小加倍。就个人而言,我认为这种策略过于激进,通常会使用大小乘以1.5;

根本不读取整个数据

通常可能无法读取内存中的整个数据,而是在小型固定块中读取时动态处理它。这种方法需要更复杂的算法,但是使用非常小的内存具有很大的优势,不需要动态分配内存,并且避免了在多个内存位置之间复制数据。