簡體   English   中英

nasm,64,Linux,分段故障核心已轉儲

[英]nasm , 64 ,linux, segmentation fault core dumped

這是foo.asm

extern choose;
[section .data]
num1st dq 3
num2nd dq 4
[section .text]
global main
global myprint
main:
  push qword [num2nd]
  push qword [num1st]
  call choose
  add esp,8
  mov ebx,0
  mov eax,1
  int 0x80
  ;  pop qword [num1st]
  ;  pop qword [num2nd]
myprint:
  mov edx,[esp+8]
  mov ecx,[esp+4]
  mov ebx,1
  mov eax,4
  int 0x80
  ;  pop qword [num1st]
  ;  pop qword [num2nd]
  ret

這是一個C-asm程序

這是bar.c

void myprint(char * msg ,int len);
int choose(int a,int b) 
{ 
  if (a>=b){
    myprint("the 1st one\n",13);}
  else {
    myprint("the 2nd one\n",13);}
  return 0;
}

nasm -f elf64 foo.asm

gcc -c bar.c

gcc -s -o foobar bar.o foo.o

./foobar,它表示分段故障核心已轉儲

我使用gdb進行調試,但是它說缺少debuginfo-install,我也在嘗試安裝它。

也許問題與86_64拱門有關...

觀看此鏈接后在推入堆棧(NASM)時出現分段錯誤 ,我向其中添加了一些“彈出”按鈕,但它不起作用

除非您有超過6個參數,否則不會以64位模式在堆棧上傳遞參數。 前兩個參數將在RDIRSI

在64位模式下使用系統調用的方式也有所不同。 系統調用編號和參數應放在以下寄存器( )中:

syscall nr  rax
arg 1       rdi
arg 2       rsi
arg 3       rdx
arg 4       r10
arg 5       r9
arg 6       r8

在64位模式下, sys_write syscall編號為1,而不是4 另外, 應該使用syscall而不是int 0x80 使用int 0x80執行系統調用可能會在64位模式下工作,具體取決於內核的配置方式,但是您仍然需要考慮如何傳遞函數參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM