Memset MOVQ дает Segfault - PullRequest
       90

Memset MOVQ дает Segfault

1 голос
/ 03 марта 2020

Я получаю segfault в строке movq (% rsi,% rcx).

Я знаю, что вы не можете сделать mem-> mem mov, поэтому я сделал это через временный регистр. (% rsi),% rcx, затем в l oop% rcx, (% rdi). Вот мой код:

experimentMemset:   #memset(void *ptr, int value, size_t num)

                                 #%rdi     #%rsi        #%rdx


movq %rdi, %rax             #sets rax to the first pointer, to return later


.loop:
    cmp $0, (%rdx)          #see if num has reached 0
    je .end
    cmpb $0, (%rdi)         #see if string has ended also
    je .end

    movq %rsi, %rdi       #copies value into rdi

    inc %rdi        #increments pointer to traverse string
    dec %rdx        #decrements the count, aka num
    jmp .loop



.end:
     ret

1 Ответ

2 голосов
/ 03 марта 2020

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

cmp $0, (%rdx)

сравнивает не регистр, а местоположение, указанное им. Кажется, что% rdx используется в качестве счетчика, поэтому вы должны сравнить сам регистр.

test %rdx,%rdx; je count_was_zero

Существуют и другие ошибки, такие как проверка содержимого места назначения только для записи для нулей и отсутствие сохранения %sil в (%rdi). Но это было причиной ошибки в текущей версии вопроса.

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