我在程序集x86(linux)中将int更改为syscall / sysenter时出现分段错误

时间:2017-02-03 02:17:43

标签: assembly x86 system-calls

当我在以下代码中将系统调用从int $0x80更改为syscallsysenter时:

mov $4, %rax
mov $1, %rbx
mov $String1, %rcx
mov $16, %rdx
int $0x80

#where String1 is defined sooner as String1: .asciz "String numero 1\n"

它给了我一个分段错误。在GDB中,我收到了消息

  

编程接收信号SIGSEGV,分段故障。   0x00000000f7ffdbe9在? ()

由于我在集会中根本不是专家,所以我不知道发生了什么

修改:正在使用asld构建程序,没有特殊的参数

Edit2 :我正在使用x86_64系统,根据它返回的lshw | grep syscall输出:

  

capacidades:x86-64 fpu fpu_exception wp vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 popcnt lahf_lm tpr_shadow vnmi flexpriority ept vpid dtherm arat cpufreq

sysenter没有返回...

在评论中,@ Jester说这个不同的系统调用意味着在不同的寄存器中加载参数。那些寄存器呢? 提前致谢

1 个答案:

答案 0 :(得分:0)

感谢评论,解决了这个问题。

首先,我的架构不支持sysenter。为了使系统调用,我不得不用以下代码替换代码:

mov $1, %rax
mov $1, %rdi
mov $String1, %rsi
mov $16, %rdx
syscall

它工作得很好