0

这是 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 ,表示segmentation fault core dumped

我使用 gdb 进行调试,但它说缺少 debuginfo-install,我也在尝试安装它。

也许问题与86_64拱门有关......

观看此链接后推送堆栈(NASM)时出现分段错误 ,我在其中添加了一些“弹出”但它不起作用

4

1 回答 1

1

在 64 位模式下,参数不会在堆栈上传递,除非您有超过 6 个参数。前两个参数将在RDI和中RSI

在 64 位模式下使用系统调用的方式也有所不同。系统调用号和参数应放在以下寄存器()中:

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

并且sys_write64 位模式下的系统调用号是 1,而不是 4。此外,int 0x80 您应该使用syscall. 执行系统调用int 0x80 可能在 64 位模式下工作,具体取决于内核的配置方式,但您仍然需要考虑函数参数的传递方式。

于 2013-06-25T07:52:03.547 回答