当我在程序集x86(linux)中将int更改为syscall / sysenter时发生分段错误
当我将系统调用从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 1n"
它给了我一个分段错误。 在GDB,我收到了这个消息
程序收到信号SIGSEGV,分段故障。 0x00000000f7ffdbe9在?? ()
由于我在装配中并不擅长,所以我不知道发生了什么
编辑 :该程序正在构建使用as
和ld
没有特殊的参数
Edit2 :根据lshw | grep syscall
的输出使用x86_64系统 它返回的lshw | grep syscall
:
容量: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说这个不同的系统调用意味着在参数中加载了不同的寄存器。 那么那些寄存器是那些? 提前致谢
感谢评论解决了问题。
首先,我的架构不支持sysenter。 为了使系统调用,我不得不用以下代码替换:
mov $1, %rax
mov $1, %rdi
mov $String1, %rsi
mov $16, %rdx
syscall
它工作得很好
链接地址: http://www.djcxy.com/p/72571.html上一篇: Segmentation fault when I change int to syscall/sysenter in assembly x86 (linux)
下一篇: Which compiler flags are optimal for the Intel C Compiler on AMD FX 8350?