Assembly (N) Asm:内存集工作不正常
我是昨天开始的汇编新手,所以我决定编写简单的函数——memcpy和memset Memcpy工作得很好,但memset不是,只是有时候。一定有点小错误,但我找不到 成员集: 编辑 现在,我真的不知道我做错了什么。我有什么错误吗?32位Assembly (N) Asm:内存集工作不正常,assembly,nasm,memset,Assembly,Nasm,Memset,我是昨天开始的汇编新手,所以我决定编写简单的函数——memcpy和memset Memcpy工作得很好,但memset不是,只是有时候。一定有点小错误,但我找不到 成员集: 编辑 现在,我真的不知道我做错了什么。我有什么错误吗?32位 _trn_memset: trn_memset: mov eax, DWORD [esp + 12] ; size mov ecx, DWORD [esp + 8] ; tcx = val mov ebx, DWORD [
_trn_memset:
trn_memset:
mov eax, DWORD [esp + 12] ; size
mov ecx, DWORD [esp + 8] ; tcx = val
mov ebx, DWORD [esp + 4] ; tbx = destination
.memset_loop:
or eax, eax
jz .aftermemset_loop
mov [ebx], BYTE cl
dec eax
inc ebx
.aftermemset_loop:
mov eax, DWORD [esp + 4] ; Return destionation
ret
当我用C的memset和汇编编写的memcpy编译内核和测试程序时,它是有效的,但当我包括汇编memset版本时,打印时格式不好。代码是正确的,只是在开始时,除了第一个eax/rax之外,所有使用的寄存器都必须推送到堆栈中,并且在返回之前必须将它们放回堆栈 因此,最简单的32位内存集如下所示:
_trn_memset:
trn_memset:
push ebp
mov ebp, esp
add ebp, 4 ; We pushed one register to stack, count it
push ebx ; Save used registers
push ecx
mov eax, DWORD [ebp + 12] ; size
mov ecx, DWORD [ebp + 8] ; tcx = val
mov ebx, DWORD [ebp + 4] ; tbx = destination
.memset_loop:
or eax, eax ; Fast compare to 0
jz .aftermemset_loop
mov [ebx], BYTE cl
dec eax
inc ebx
.aftermemset_loop:
mov eax, DWORD [ebp + 4] ; Return destionation
pop ecx ; Restore used registers
pop ebx
pop ebp
ret
你有没有试着用调试器来缩小问题的范围?此外,如果您有工作的C版本,您可以通过让编译器输出程序集,然后调整结果来创建程序集版本,以实现友好的标记和效率。调试器?我不知道怎么做,我是通过终端编译的。但是看看更新你有很多代码。你需要设法缩小这个问题的范围。如果您没有或不知道如何使用调试器,还有其他技术,例如插入代码位以显示中间寄存器值,以查看它们是否有意义。您是否尝试过先将注意力集中在一个平台上,而不使用所有宏,以使其正常工作?这可能就是我要开始的地方。我正在将它与内核(即i386)一起编译为elf32+,因此除了第一个%ifdef和类型之外,没有更多的宏。感谢您的提示,我将尝试使用普通asm并设置每个字节。
_trn_memset:
trn_memset:
mov eax, DWORD [esp + 12] ; size
mov ecx, DWORD [esp + 8] ; tcx = val
mov ebx, DWORD [esp + 4] ; tbx = destination
.memset_loop:
or eax, eax
jz .aftermemset_loop
mov [ebx], BYTE cl
dec eax
inc ebx
.aftermemset_loop:
mov eax, DWORD [esp + 4] ; Return destionation
ret
_trn_memset:
trn_memset:
push ebp
mov ebp, esp
add ebp, 4 ; We pushed one register to stack, count it
push ebx ; Save used registers
push ecx
mov eax, DWORD [ebp + 12] ; size
mov ecx, DWORD [ebp + 8] ; tcx = val
mov ebx, DWORD [ebp + 4] ; tbx = destination
.memset_loop:
or eax, eax ; Fast compare to 0
jz .aftermemset_loop
mov [ebx], BYTE cl
dec eax
inc ebx
.aftermemset_loop:
mov eax, DWORD [ebp + 4] ; Return destionation
pop ecx ; Restore used registers
pop ebx
pop ebp
ret