我当前正在学习x86 asm,以某种方式如果使用“ push ebx”会触发“ segmentation fault”,但是如果我使用“ push bx”,程序将运行并监听端口。我尝试使用gdb进行调试,但没有发现任何可疑的东西,ebx = 0x2。我真的不知道为什么,有人可以帮忙解释一下吗? (我的系统是ubuntu 12 x86)
global _start
section .text
_start:
; zero out registers
xor eax, eax
xor ebx, ebx
xor ecx, ecx
; socket
mov al, 0x66 ; syscall socketcall
inc bl ; SYS_SOCKET 1
push ecx ; socket(domain, type, protocol) -- protocol 0
push ebx ; type SOCK_STREAM -- 1
push byte 0x2 ; domain -- AF_INET -- 2
mov ecx, esp
int 0x80
;mov edi, eax ; save the return value into edi
xchg edi, eax
; bind
mov al, 0x66 ; syscall socketcall
pop ebx ; SYS_BIND 2 -- take from stack above AF_INET
push esi
push word 0xfb20 ; sin_port
push ebx ; AF_INET 2 <<<<<<< IF I CHANGE TO "PUSH BX" it won't segmentation fault
mov ecx, esp ; point ecx to the stack
push 0x10 ; sizeof struct
push ecx ; sockaddr addr
push edi ; previous socket fd
mov ecx, esp ; point ecx to stack
int 0x80
; listen
mov al, 0x66 ; syscall socketcall
mov bl, 0x4 ; SYS_LISTEN
push edx ; backlog arg listen 0
push edi ; previous socket
mov ecx, esp ; point ecx to stack
int 0x80
; accept
mov al, 0x66
xor edx, edx
push edx
push edx
push edi
inc ebx
int 0x80
xchg ebx, eax