相关疑难解决方法(0)

你能在objective-c中进行内联汇编吗?

可能重复:
如何在iPhone上进行内联汇编?

我正在运行xcode4.2.1,我可以在代码中进行行组装即__asm吗?

xcode objective-c

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

如何指示可以使用内联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
查看次数

标签 统计

assembly ×2

inline-assembly ×2

arm ×1

c ×1

clang ×1

gcc ×1

linux ×1

objective-c ×1

system-calls ×1

xcode ×1