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