以下链接解释了UNIX(BSD风格)和Linux的x86-32系统调用约定:
但是UNIX和Linux上的x86-64系统调用约定是什么?
int 0x80
在Linux上总是调用32位ABI,不管是什么模式,这就是所谓的:在args ebx
,ecx
...和系统调用号的/usr/include/asm/unistd_32.h
.(或者在没有编译的64位内核上崩溃CONFIG_IA32_EMULATION
).
64位代码应该使用syscall
,从呼叫号码/usr/include/asm/unistd_64.h
,并在args rdi
,rsi
等见什么调用约定UNIX和Linux系统上的i386和x86-64调用.如果您的问题被打上这样一个重复的,看你怎么说链接,细节应当使32位或64位代码的系统调用. 如果你想了解到底发生了什么,请继续阅读.
sys_write
系统调用比syscall
系统调用快,所以使用本机64位,int 0x80
除非你正在编写多格式机器代码,当执行32或64位时运行相同的机器代码.(syscall
始终以32位模式返回,因此它在64位用户空间中没有用,尽管它是有效的x86-64指令.)
相关:Linux系统的权威指南(在x86上)调用如何进行sysenter
或int 0x80
32位系统调用,或sysenter
64位系统调用,或调用vDSO进行"虚拟"系统调用syscall
.加上有关系统调用的背景知识.
使用gettimeofday
可以编写将以32位或64位模式组合的内容,因此它可以int 0x80
在微基准测试结束时使用.
标准化函数和系统调用约定的官方i386和x86-64 System V psABI文档的当前PDF文件链接自https://github.com/hjl-tools/x86-psABI/wiki/X86-psABI.
有关初学者指南,x86手册,官方文档和性能优化指南/资源,请参阅x86标记wiki.
但是,由于人们不断发布与使用代码的问题exit_group()
在64位代码,或不小心建立64位二进制文件从源代码对于32位写的,我不知道是什么确切不会对当前的Linux怎样呢?
是否int 0x80
保存/恢复所有的64位寄存器?它会将任何寄存器截断为32位吗?如果传递上半部分非零的指针args会发生什么?
如果你传递32位指针它是否有效?
使用GNU汇编程序组装文件时出现以下错误:
hello.s:6:错误:"push"的指令后缀无效
这是我正在尝试汇编的文件:
.text
LC0:
.ascii "Hello, world!\12\0"
.globl _main
_main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
movl $0, %eax
movl %eax, -4(%ebp)
movl -4(%ebp), %eax
call __alloca
call ___main
movl $LC0, (%esp)
call _printf
movl $0, %eax
leave
ret
Run Code Online (Sandbox Code Playgroud)
这里有什么问题,我该如何解决?
我试图通过assmbly中的堆栈研究将参数传递给函数.我正在使用Fedora 20,64位系统.
当我尝试以下代码时,
pushl%ebp
popl%ebp
我得到错误,错误:"推"的无效指令后缀
我将如何克服这个错误!
我编译它,如-ggstabs -o Function_Stack.o Function_Stack.c
我可以通过这样做将4个字节压入堆栈:
push DWORD 123
Run Code Online (Sandbox Code Playgroud)
但我发现我可以在push
不指定操作数大小的情况下使用:
push 123
Run Code Online (Sandbox Code Playgroud)
在这种情况下,push
指令将多少字节压入堆栈?推送的字节数是否取决于操作数大小(因此在我的示例中它将推送1个字节)?
我编写了可以编译的汇编代码:
as power.s -o power.o
Run Code Online (Sandbox Code Playgroud)
当我链接power.o目标文件时出现问题:
ld power.o -o power
Run Code Online (Sandbox Code Playgroud)
为了在64位操作系统(Ubuntu 14.04)上运行,我.code32
在power.s
文件的开头添加了,但是我仍然得到错误:
分段故障(核心转储)
power.s
:
.code32
.section .data
.section .text
.global _start
_start:
pushl $3
pushl $2
call power
addl $8, %esp
pushl %eax
pushl $2
pushl $5
call power
addl $8, %esp
popl %ebx
addl %eax, %ebx
movl $1, %eax
int $0x80
.type power, @function
power:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl 8(%ebp), %ebx
movl 12(%ebp), %ecx
movl %ebx, -4(%ebp)
power_loop_start:
cmpl …
Run Code Online (Sandbox Code Playgroud)