【问题标题】:memset movq giving segfaultmemset movq 给出段错误
【发布时间】:2020-06-15 10:52:40
【问题描述】:

我在 movq (%rsi, %rcx) 行遇到段错误。

我知道你不能做 mem->mem mov,所以我通过一个临时寄存器来做。 (%rsi), %rcx, 然后在循环中 %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

【问题讨论】:

  • 这是从%rsi 读取的,假设它是 64 位值的地址/指针。但是value 本身就是一个原始值,而不是指针。如果您只想复制,请不要使用()(这意味着取消引用指针),只需复制实际值即可。
  • 请不要编辑问题以说明问题已解决。而是写一个答案,或者更好地接受一个。也不要改变问题或其焦点,尤其是在初始版本已经有了答案的情况下。 stackoverflow.com/help/someone-answers
  • 你需要了解(%reg)这样的内存操作数和%reg这样的寄存器操作数之间的区别。

标签: c assembly gnu-assembler att memset


【解决方案1】:

正如您所发现的,RDX 拥有一个大小(一个整数),而不是一个指针。它是按值传递的,而不是按引用传递的。

cmp $0, (%rdx)

比较的不是寄存器,而是它指向的位置。看来%rdx是用作计数器的,所以你应该比较寄存器本身。

test %rdx,%rdx ; je count_was_zero

还有其他错误,例如检查只写目标的内容是否为零,以及未将%sil 存储到(%rdi) 中。但这是当前版本问题中出现段错误的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多