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

Assembly 在程序集x86(linux)中将int更改为syscall/sysenter时出现分段错误,assembly,x86,system-calls,Assembly,X86,System Calls,在以下代码中将系统调用从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英寸?

在以下代码中将系统调用从
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:根据它返回的
lshw | grep syscall
的输出,我正在使用x86_64系统:

capacidades:x86-64 fpu fpu例外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系统调用nx rdtscp常量(tsc性能)基站代表良好的拓扑结构不间断(tsc性能)pni dtes64监视器DSU cpl vmx est tm2 ssse3 16 xtpr pdcm pcid SSE1sse4_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

它工作得很好

您是否在支持SysCenter的64位平台上?SysCenter不是刚刚在32位系统的vsdo中使用的吗?它仍然在64位上使用?还要注意,系统调用n。64位系统上的4不是sys_write,而是sys_newstat耶,
syscenter
是在奔腾II处理器中引入的,因此它应该可以在大多数32位系统上使用。调用
CPUID
后,可以使用SEP标志检查它。(尽管奔腾Pro将欺骗您并设置SEP,即使
syscenter
不可用。)Windows XP将其作为一种“快速”的系统调用方式引入,并在可用时使用。否则,它将返回到
int2eh
。Linux上的情况无疑是不同的;请参阅。syscall接口使用不同的调用约定,除了使用不同的syscall编号外,还需要加载不同的寄存器。Ryan Chapman的博客提供了x86-64上syscall接口的相关信息。