我正在尝试调用isdigit,为此,我需要缓冲区的第一个字节,其定义如下。
...
.equ ARRAYSIZE, 20
.section ".bss"
buffer:
.skip ARRAYSIZE
...
input:
pushl $buffer
pushl $scanFormat
call scanf
addl $8, %esp
因此,为缓冲区分配了20个字节的内存空间,然后使用scanf来输入一些值,如输入所示。
现在,我想访问前4个字节以调用isdigit。如何访问它们?
我最初的猜测是使用movl缓冲区%eax,因为eax寄存器的大小为4字节,并将前4个字节存储在缓冲区中。但是我不确定这是如何工作的。
请告诉我我是否只能访问缓冲区的前4个字节,或者是否有其他方法将isdigit应用于前四个字节。谢谢。
答案 0 :(得分:2)
您将要分别对这4个字节应用 isdigit 。您可以使用执行4次迭代的循环从缓冲区中一次获取它们。在%ecx
寄存器中设置计数器,在%esi
寄存器中设置指向缓冲区的指针。
movl $4, %ecx ; Counter
movl $buffer, %esi ; Pointer
More:
movsbl (%esi), %eax ; Get next byte sign-extending it
push %eax
call isdigit
addl $4, %esp
...
incl %esi ; Advance the pointer
decl %ecx ; Decrement the counter
jnz More ; Continu while counter not exhausted
或者
xorl %esi, %esi ; Offset start at 0
More:
movsbl buffer(%esi), %eax ; Get next byte sign-extending it
push %eax
call isdigit
addl $4, %esp
...
incl %esi ; Advance the offset
cmpl $4, %esi ; Test for max offset
jb More ; Continu while offset not max-ed