x86汇编代码push ebx-分段错误

时间:2019-12-20 09:29:12

标签: assembly x86

我当前正在学习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

0 个答案:

没有答案
相关问题