为什么在 x86 中调用 printf 时出现分段错误?
why do I get segmentation fault when calling printf in x86?
我试图通过在汇编代码中调用 printf 来逐个字符地打印一个字符串,但是在打印第一个字符后出现分段错误,我不明白为什么会这样,可以请有人帮忙??
section .rodata
lc:
DB "%c", 10, 0
section .text
align 16
global my_func
extern printf
my_func:
push ebp
mov ebp, esp ; Entry code - set up ebp and esp
pusha ; Save registers
mov ecx, dword [ebp+8] ; Get argument (pointer to string)
incr:
cmp byte [ecx], 0
jz end
movzx eax, byte [ecx]
push eax
push lc
call printf
add esp, 8
inc ecx
jmp incr
end:
popa ; Restore registers
mov esp, ebp ; Function exit code
pop ebp
ret
我假设您在 C 运行时调用 printf
。我不认为 C 函数需要在调用之间保留寄存器的值,因此 ECX 可能会被调用破坏。
我试图通过在汇编代码中调用 printf 来逐个字符地打印一个字符串,但是在打印第一个字符后出现分段错误,我不明白为什么会这样,可以请有人帮忙??
section .rodata
lc:
DB "%c", 10, 0
section .text
align 16
global my_func
extern printf
my_func:
push ebp
mov ebp, esp ; Entry code - set up ebp and esp
pusha ; Save registers
mov ecx, dword [ebp+8] ; Get argument (pointer to string)
incr:
cmp byte [ecx], 0
jz end
movzx eax, byte [ecx]
push eax
push lc
call printf
add esp, 8
inc ecx
jmp incr
end:
popa ; Restore registers
mov esp, ebp ; Function exit code
pop ebp
ret
我假设您在 C 运行时调用 printf
。我不认为 C 函数需要在调用之间保留寄存器的值,因此 ECX 可能会被调用破坏。