我收到以下汇编代码的分段错误,它只是打印出一条消息,虽然打印是由一个单独的函数处理的,所以我很确定我没有在堆栈上为消息分配正确的空间长度。
以下是代码:
section .data
print_msg: DB "H", 10, 0
len: equ $-print_msg
print_msg2: DB "BYE WORLD", 10, 0
len2: equ $-print_msg2
section .text
global main
main:
push ebp
mov ebp, esp
push DWORD len
push print_msg
call _write
push DWORD len2
push print_msg2
call _write
leave
ret
_write:
push ebp
mov ebp, esp
push ebx
mov eax, 4
mov ebx, 1
mov ecx, [ebp+8]
mov edx, [ebp+12]
int 80h
pop ebx
leave
ret
答案 0 :(得分:0)
push
会为您做到这一点。push DWORD [len]
错误,因为它试图取消引用len
这只是一个数字。mov ecx, [ebp+2]
和mov edx, [ebp+6]
使用了错误的偏移量,它们应分别为+8
和+12
。 ebp
的堆栈布局为:saved_ebp
,return address
,arg1
,arg2
(每个4个字节)像这样:
section .data
print_msg: DB "H", 10, 0
len: equ $-print_msg
section .text
global main
main:
push ebp
mov ebp, esp
push DWORD len
push print_msg
call _write
leave
ret
_write:
push ebp
mov ebp, esp
mov eax, 4
mov ebx, 1
mov ecx, [ebp+8]
mov edx, [ebp+12]
int 80h
leave
ret
PS:C调用约定要求您保留ebx
,因此_write
函数应该保存并恢复它。