Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
Arrays NASM中的printf循环_Arrays_Loops_Assembly_X86_Nasm - Fatal编程技术网

Arrays NASM中的printf循环

Arrays NASM中的printf循环,arrays,loops,assembly,x86,nasm,Arrays,Loops,Assembly,X86,Nasm,在第一个循环中,我填充了数组,然后我想打印这个数组,但是我会有一个错误。这是分段错误。我只需更改ecx寄存器,因为这是我的\u loop2计数器 extern printf SECTION .bss array resb 10 SECTION .data fmt: db "array[%d] = %d", 10, 0 ; The printf format, "\n",'0' SECTION .text global main

在第一个循环中,我填充了
数组
,然后我想打印这个数组,但是我会有一个错误。这是
分段错误
。我只需更改
ecx
寄存器,因为这是我的
\u loop2
计数器

extern  printf

SECTION .bss
    array resb 10

SECTION .data
    fmt: db "array[%d] = %d", 10, 0 ; The printf format, "\n",'0'


SECTION .text

global main

main:
    mov ecx, 0

_loop:
    inc ecx
    mov [array + ecx * 4], ecx
    cmp ecx, 10
    jnz _loop

    mov ecx, 0


_loop2:
    jmp print
    add ecx, 1
    cmp ecx, 10
    jnz _loop2
    
    ret

print:
    ;push    ebp        ; set up stack frame
    ;mov     ebp, esp
    push    ecx
    push    dword [array + ecx * 4] ; value of variable a SECOND
    push    dword fmt   ; address of ctrl string
    call    printf      ; Call C function
    
    add     esp, 8      ; stack (4 * 2)

    ;mov     esp, ebp   ; takedown stack frame
    ;pop     ebp        ; same as "leave" op

    mov     eax,0       ;  normal, no error, return value

    ;ret            ; return

评论中提到的几个问题:

  • array resb 10
    将为10个字节保留空间,但您希望在其中存储10个DWORD(40个字节)。更改为
    阵列resd 10


  • (赛普·罗兰指出)在
    \u loop
    中,你有一个一个错误的错误;由于
    inc
    是在
    mov
    之前完成的,因此您将访问
    [array+4]、[array+8]、。。。[array+40]
    ,其中最后一个超出范围。这就像做
    int数组[10];对于(i=1;i您在
    数组中有10个字节的空间,但您在那里存储了10个DWORD(=40个字节)。那不好。另外,
    \u loop2
    循环实际上从未运行过,因为您无条件地跳过它。您是否尝试过使用调试器单步执行此代码?这是汇编编程的一个至关重要的实践,当您这样做时,我想您会更好地理解您编写的内容。@Nate Eldredge,我应该更改它
    resb
    的大小?更好的方法是,将其更改为
    resd 10
    ,这样它可以计算要为多少个DWORD保留空间。此外,在调用
    printf
    之前,您可以按
    ecx
    ,但您不会再次弹出它,因此如果您尝试返回,您将返回到被推送的地址,即0。但是您有
    ret
    注释d out,因此函数甚至不会尝试返回,而是继续执行内存中下一个出现的任何垃圾。您还可以在回答中添加一个错误。填充数组的循环存在缓冲区溢出!第一次写入到第二个元素,第十次写入经过存储。使用
    mov[array-4+ecx*4],ecx
    。这将创建一个填充数字1到10的数组。正确。我在答案中添加了您的建议。