【发布时间】:2020-08-16 16:52:40
【问题描述】:
在第一个循环中我填充了array,然后我想打印这个数组,但是我会出错。这是Segmentation fault。我只是更改ecx 寄存器,因为这是我的_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中有 10 个字节的空间,但您在那里存储了 10 个双字(= 40 个字节)。这不好。 -
另外,
_loop2循环实际上从未运行,因为您无条件地跳过它。您是否尝试过使用调试器单步执行此代码?这是汇编编程的一个非常重要的实践,当你这样做时,我认为你会更好地理解你所写的内容。 -
@Nate Eldredge,我应该更改
resb的大小? -
更好,将其更改为
resd 10,以便计算要为多少个双字预留空间。 -
另外,你在调用
printf之前推送了ecx,但你再也不会弹出它,所以如果你尝试返回,你将返回到被推送的地址,即0。但是您将ret注释掉了,因此该函数甚至不会尝试返回,而是会继续执行内存中发生的任何垃圾。
标签: arrays loops assembly x86 nasm