相关疑难解决方法(0)

如何在内联汇编中通过sysenter调用系统调用?

我们如何在x86 Linux中直接使用sysenter/syscall实现系统调用?有人可以提供帮助吗?如果您还可以显示amd64平台的代码,那就更好了.

我知道在x86中,我们可以使用

__asm__(
"               movl $1, %eax  \n"
"               movl $0, %ebx \n"
"               call *%gs:0x10 \n"
);
Run Code Online (Sandbox Code Playgroud)

间接路由到sysenter.

但是我们如何使用sysenter/syscall直接编码来发出系统调用呢?

我找到了一些材料http://damocles.blogbus.com/tag/sysenter/.但仍然难以弄明白.

linux x86 gcc x86-64 system-calls

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

如何在 ARM GCC 内联汇编中指定单个寄存器作为约束?

在 x86 内联汇编中,我可以这样写:

asm ("cpuid"
            : "=a" (_eax),
              "=b" (_ebx),
              "=c" (_ecx),
              "=d" (_edx)
            : "a" (op));
Run Code Online (Sandbox Code Playgroud)

所以在 matchin 约束中,而不是只写“=r”并让编译器选择寄存器,我可以说我想使用哪个特定的寄存器(=a 例如使用 %eax)

我怎样才能为 ARM 程序集做到这一点?ARM GCC 汇编手册http://www.ethernut.de/en/documents/arm-inline-asm.html指出,例如,我可以将约束“r”用于通用寄存器 R0-R15“w”之一" 对于 VFP 浮点寄存器 S0-S31 之一

但是我怎样才能将一个操作数限制在例如 s1 呢?或特定的通用寄存器?

gcc arm inline-assembly

5
推荐指数
1
解决办法
3561
查看次数

如何指示可以使用内联ASM参数*指向*的内存?

考虑以下小功能:

void foo(int* iptr) {
    iptr[10] = 1;
    __asm__ volatile ("nop"::"r"(iptr):);
    iptr[10] = 2;
}
Run Code Online (Sandbox Code Playgroud)

使用gcc,它将编译为

foo:
        nop
        mov     DWORD PTR [rdi+40], 2
        ret
Run Code Online (Sandbox Code Playgroud)

请特别注意,即在第一次写iptriptr[10] = 1根本不会发生:内联汇编nop是在函数的第一件事,只有最后写2(会出现ASM呼叫后)。显然,编译器决定只需要提供其iptr 自身值的最新版本,而不需要提供其指向的内存。

我可以告诉编译器,内存必须是最新的memory,就像这样:

void foo(int* iptr) {
    iptr[10] = 1;
    __asm__ volatile ("nop"::"r"(iptr):"memory");
    iptr[10] = 2;
}
Run Code Online (Sandbox Code Playgroud)

结果为预期的代码:

foo:
        mov     DWORD PTR [rdi+40], 1
        nop
        mov     DWORD PTR [rdi+40], 2
        ret
Run Code Online (Sandbox Code Playgroud)

但是,这太强了,因为它告诉编译器必须写入所有内存。例如,在以下功能中:

void foo2(int* iptr, long* …
Run Code Online (Sandbox Code Playgroud)

c assembly gcc clang inline-assembly

5
推荐指数
1
解决办法
244
查看次数

ARM内联asm:退出系统调用,从内存中读取值

问题

我想在Linux Android设备上使用内联汇编在ARM中执行退出系统调用,我希望从内存中的某个位置读取退出值.

如果不给出这个额外的参数,调用的宏看起来像:

#define ASM_EXIT() __asm__("mov     %r0, #1\n\t" \
                           "mov     %r7, #1\n\t" \
                           "swi     #0")
Run Code Online (Sandbox Code Playgroud)

这很好用.要接受一个参数,我将其调整为:

#define ASM_EXIT(var) __asm__("mov     %r0, %0\n\t" \
                              "mov     %r7, #1\n\t" \
                              "swi     #0"          \
                              :                     \
                              : "r"(var))
Run Code Online (Sandbox Code Playgroud)

我用它来称呼它:

#define GET_STATUS() (*(int*)(some_address)) //gets an integer from an address

ASM_EXIT(GET_STATUS());
Run Code Online (Sandbox Code Playgroud)

错误

无效'asm':操作数超出范围

我无法解释为什么我会收到此错误,因为我在上面的代码段(%0/var)中使用了一个输入变量.此外,我尝试了一个常规变量,仍然有同样的错误.

linux assembly arm system-calls inline-assembly

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

标签 统计

gcc ×3

inline-assembly ×3

arm ×2

assembly ×2

linux ×2

system-calls ×2

c ×1

clang ×1

x86 ×1

x86-64 ×1