相关疑难解决方法(0)

132
推荐指数
4
解决办法
10万
查看次数

78
推荐指数
6
解决办法
10万
查看次数

如果在64位代码中使用32位int 0x80 Linux ABI会发生什么?

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上)调用如何进行sysenterint 0x8032位系统调用,或sysenter64位系统调用,或调用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手册,官方文档和性能优化指南/资源,请参阅标记wiki.


但是,由于人们不断发布与使用代码的问题exit_group()在64位代码,或不小心建立64位二进制文件从源代码对于32位写的,我不知道是什么确切不会对当前的Linux怎样呢?

是否int 0x80保存/恢复所有的64位寄存器?它会将任何寄存器截断为32位吗?如果传递上半部分非零的指针args会发生什么?

如果你传递32位指针它是否有效?

linux assembly x86-64 system-calls abi

36
推荐指数
1
解决办法
4783
查看次数

汇编语言中的全局_start是什么?

这是我的汇编级代码......

section .text
global _start
_start: mov eax, 4
        mov ebx, 1
        mov ecx, mesg
        mov edx, size
        int 0x80
exit:   mov eax, 1
        int 0x80
section .data
mesg    db      'KingKong',0xa
size    equ     $-mesg
Run Code Online (Sandbox Code Playgroud)

输出:

root@bt:~/Arena# nasm -f elf a.asm -o a.o
root@bt:~/Arena# ld -o out a.o
root@bt:~/Arena# ./out 
KingKong
Run Code Online (Sandbox Code Playgroud)

我的问题是全球_start用于什么?我和Mr.Google试了一下运气,我发现它用来说明程序的起点.为什么我们不能_start告诉程序在哪里开始,如下面给出的那个在屏幕上产生一种警告

section .text
_start: mov eax, 4
        mov ebx, 1
        mov ecx, mesg
        mov edx, size
        int 0x80
exit:   mov eax, 1
        int 0x80
section .data …
Run Code Online (Sandbox Code Playgroud)

assembly nasm

23
推荐指数
3
解决办法
3万
查看次数

大会中的"全球主力"

我遇到了这段代码:

section .text
    global  main    ;must be declared for linker (gcc)
Run Code Online (Sandbox Code Playgroud)

然后在这一行之后有一个名为main的函数:

main:    ;tell linker entry point
Run Code Online (Sandbox Code Playgroud)

但我似乎不明白是什么global main意思,评论似乎没有多大帮助......

我使用此站点作为汇编语言编程的参考.

我可以分析main指的是函数main,但我不明白global关键字的使用...

先感谢您...

assembly program-entry-point global

8
推荐指数
1
解决办法
6708
查看次数

Syscall实现exit()

我写了一个简单的C程序,只调用exit()函数,但是strace说二进制文件实际上是调用exit_group,exit()是一个exit_group()包装器吗?这两个功能是否相同?如果是这样,为什么编译器会选择exit_group()而不是exit()?

c x86 assembly gcc system-calls

6
推荐指数
1
解决办法
2300
查看次数

从 C 中的主函数返回与退出

嗨,我想知道从主函数返回和退出之间的区别是什么。调用它们中的每一个时,幕后会发生什么,以及在每种情况下如何返回控件。如果有人可以深入研究这个主题,我真的会很高兴。

c assembly

3
推荐指数
1
解决办法
230
查看次数

main()的返回值会发生什么?

可能重复:
main()在C/C++中应该返回什么?

#include<stdio.h>
int main()
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在上面给出的代码片段中,main返回的返回0在哪里?或者换句话说,哪个函数在开始时称为主函数.

c program-entry-point return

2
推荐指数
1
解决办法
969
查看次数

你好,有 Linux 系统调用的汇编语言世界?

  1. 我知道这int 0x80会在 linux 中造成中断。但是,我不明白这段代码是如何工作的。它会返回一些东西吗?

  2. 代表什么$ - msg

global _start

section .data
    msg db "Hello, world!", 0x0a
    len equ $ - msg

section .text
_start:
    mov eax, 4
    mov ebx, 1
    mov ecx, msg
    mov edx, len
    int 0x80 ;What is this?
    mov eax, 1
    mov ebx, 0
    int 0x80 ;and what is this?
Run Code Online (Sandbox Code Playgroud)

linux x86 assembly nasm system-calls

0
推荐指数
1
解决办法
1179
查看次数

标签 统计

assembly ×8

c ×3

linux ×3

system-calls ×3

x86 ×3

abi ×2

nasm ×2

program-entry-point ×2

x86-64 ×2

gcc ×1

global ×1

return ×1

unix ×1