【发布时间】: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