访问汇编中缓冲区的第一个字节?

时间:2019-05-19 14:11:41

标签: assembly x86

我正在尝试调用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应用于前四个字节。谢谢。

1 个答案:

答案 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