Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly (N) Asm:内存集工作不正常_Assembly_Nasm_Memset - Fatal编程技术网

Assembly (N) Asm:内存集工作不正常

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 [

我是昨天开始的汇编新手,所以我决定编写简单的函数——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 [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