当我在以下代码中将系统调用从int $0x80
更改为syscall
或sysenter
时:
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在? ()
由于我在集会中根本不是专家,所以我不知道发生了什么
修改:正在使用as
和ld
构建程序,没有特殊的参数
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说这个不同的系统调用意味着在不同的寄存器中加载参数。那些寄存器呢? 提前致谢
答案 0 :(得分:0)
感谢评论,解决了这个问题。
首先,我的架构不支持sysenter。为了使系统调用,我不得不用以下代码替换代码:
mov $1, %rax
mov $1, %rdi
mov $String1, %rsi
mov $16, %rdx
syscall
它工作得很好