我正在尝试编写一个nasm程序,可以使用malloc和printf移动和打印动态数组 . 该程序有时会崩溃,有时在尝试打印数组时有效 . 当我编辑代码以使其不打印任何内容时,程序始终有效 . 方法“movad”将动态数组设置为等于另一个数组,“setad”将数组设置为在程序开头声明的静态数组 . 数组变量存储指向存储数组的malloced内存块的指针 . 数组的第一个dword是长度,其余的是内容 .

这是代码:

%include "io.inc"
CEXTERN malloc

section .data
    fmt: db "%c%c %c%c",0
    start: dd 2
           dd 'a'
           dd 'b'

section .bss
    array1: resd 1
    array2: resd 1
    a: resd 1

section .text
global _main
_main:
    push ebp
    mov ebp,esp
    push dword start
    push dword array1
    call setad
    add esp,8
    push dword array1
    push dword array2
    call movad
    add esp,8
    mov ebx,[array2]
    push dword [ebx+8]
    push dword [ebx+4]
    mov ebx,[array1]
    push dword [ebx+8]
    push dword [ebx+4]
    push dword fmt
    call printf
    add esp,20
    mov esp,ebp
    pop ebp
ret

movad:
    push ebp
    mov ebp,esp
    push ebx
    push ecx
    push edi
    push esi
    mov edi,[ebp+8]
    mov esi,[ebp+12]
    mov ebx,[esi]
    push dword [ebx]
    add dword [esp],4
    call malloc
    add esp,4
    mov [edi],eax
    mov ecx,[esi]
    mov ecx,[ecx]
    add ecx,1
    mov edi,[edi]
    mov esi,[esi]
    cld
    rep movsd
    pop esi
    pop edi
    pop ecx
    pop ebx
    mov esp,ebp
    pop ebp
ret

setad:
    push ebp
    mov ebp,esp
    push eax
    lea eax,[ebp+12]
    push eax
    push dword [ebp+8]
    call movad
    add esp,8
    pop eax
    mov esp,ebp
    pop ebp
ret

我怎样才能使它在打印东西时永远不会崩溃