У меня проблема при передаче параметра в сборке GAS x86 - PullRequest
0 голосов
/ 02 декабря 2018

Я пытаюсь настроить два параметра для функции compare(int x, int y), но когда я передаю их, я не получаю ожидаемых результатов, и когда я проверяю регистры с помощью gdb, кажется, что они не имеютправильные значения в них.

Я устанавливаю параметры и вызываю функцию следующим образом:

movl    $10, (%esp)
movl    $10, 8(%esp)
call    compare

И эта функция возвращает 1, если x==y, и 0, если x!=y

compare:
    pushl   %ebp
    movl    %esp, %ebp
    movl    (%ebp), %eax
    movl    8(%ebp), %edx
    cmpl    %eax, %edx
    jne .L28
.L29:
    movl    $1, %eax
    jmp .L30
.L28:
    movl    $0, %eax
    jmp .L30
.L30:
    popl    %ebp
    ret

Я устанавливаю обе переменные равными 10 для целей тестирования, но я все еще получаю результат 0

Ответы [ 2 ]

0 голосов
/ 02 декабря 2018

Спасибо @Jester за объяснение моей ошибки.

Вот правильная реализация:

movl    $10, (%esp)
movl    $10, 4(%esp)
call    compare

Функция:

    compare:
    pushl   %ebp
    movl    %esp, %ebp
    movl    8(%ebp), %eax
    movl    12(%ebp), %edx
    cmpl    %eax, %edx
    jne .L28
.L29:
    movl    $1, %eax
    jmp .L30
.L28:
    movl    $0, %eax
    jmp .L30
.L30:
    popl    %ebp
    ret
0 голосов
/ 02 декабря 2018

Посмотрим, каково состояние стека до того, как ebp используется в compare().

Вызов compare():

movl    $10, (%esp)
movl    $10, 8(%esp)
call    compare

и нажатие ebp в compare, то есть:

pushl   %ebp

оставить стек в следующем состоянии:

      Values           Address

------------------
|      10        |
------------------  <- ESP+16
|   undefined    |
------------------  <- ESP+12
|      10        |
------------------  <- ESP+8
| return address |
------------------  <- ESP+4
|   saved EBP    |
------------------  <- ESP

После movl %esp, %ebp в compare(), оба esp и ebp имеют одинаковое значение.

movl (%ebp), %eax
movl  8(%ebp), %edx

Если посмотреть на диаграмму выше, эти инструкции должны быть следующими:

movl   8(%ebp), %eax
movl  16(%ebp), %edx
...