Попытка реализовать strlen в x86 ГАЗ - PullRequest
0 голосов
/ 07 октября 2018

, поэтому я очень новичок (чрезвычайно новый) в программировании на ассемблере и пытаюсь написать функцию, которая может вычислять длину строки.

Мне кажется, у меня есть некоторые проблемы с очисткой значений в регистрах,или с приращением указателя, потому что возвращаемое значение всегда для меня "4571 + длина".

В основном, если у меня длина строки 0, я получаю 4571 в качестве возвращаемого значения.Если у меня длина строки 6, я получу 4577 в качестве возвращаемого значения и т. Д.

Вот мой код, любая помощь будет оценена:

.globl my_strlen
    my_strlen:
        pushq %rbp
        movq %rsp, %rbp
        pushq %r12
        pushq %r13

        movq $0, %rax
        cmp $0, (%rdi)
        jne my_strlen_loop
        ret

    my_strlen_loop:
        inc %rax
        inc %rdi
        cmp $0, (%rdi)
        jne my_strlen_loop

        popq %r13
        popq %r12
        popq %rbp
        ret

1 Ответ

0 голосов
/ 07 октября 2018

С этим кодом есть две проблемы.

Во-первых, инструкции cmp не определяют размер, и ни один из операндов не является регистром, поэтому он неоднозначен.Для большинства инструкций (например, mov $0, (%rdi)) GAS отказывается собирать его, но cmp по какой-то причине собирается в cmpl, сравнивая меч.Измените мнемонику явно на cmpb.

Во-вторых, перед первым повтором не всплывают регистры, которые были выдвинуты.Было бы лучше прыгнуть до конца (и иметь один рет).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...