【发布时间】:2013-12-18 07:41:48
【问题描述】:
我正在尝试在程序集 x86 中实现 memset。都按字节和按字复制,所以我会得到两个函数:kmemset 和 kmemsetw,我以这种方式向我的 C 代码公开:
extern uint8_t* kmemset(uint8_t* dest, uint8_t val, uint8_t size);
extern uint16_t* kmemsetw(uint16_t* dest, uint16_t val, uint8_t size);
问题是当我测试它时,我遇到了分段错误。我尝试使用 gdb 进行调试,但似乎无法进入 asm 代码。如果有人可以对代码发表评论,我会很高兴。 (kmemset 非常相似,所以我没有包含它)。
.intel_syntax noprefix
.section .text
.align 16
.global kmemsetw
.type kmemsetw, @function
kmemsetw:
push ebp
mov ebp, esp
push edi
push ecx
push ebx
xor eax, eax
mov ebx, [ebp+4]
mov ax, [ebp+8]
mov ecx, [ebp+12]
mov edi, ebx
rep stosw
mov eax, edi
pop ebx
pop ecx
pop edi
pop ebp
ret
【问题讨论】:
-
收到的长度参数是字节还是字?
-
顺便说一句,还有
stosd(双字大小的商店)。 -
感谢您的提示。此外,长度参数作为字节 (uint8_t) 传递,但现在将其更改为双字 (uint32_t)。
标签: assembly x86 segmentation-fault