Доступ к первому байту буфера в сборке? - PullRequest
2 голосов
/ 19 мая 2019

Я пытаюсь вызвать 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 к этим первым 4 байтам. Спасибо.

1 Ответ

2 голосов
/ 19 мая 2019

Вы хотите применить isdigit к этим 4 байтам отдельно.Вы можете получить их из буфера один за другим, используя цикл, который выполняет 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...