首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ARM内联程序集在不使用libc的情况下执行syscall

问使用ARM内联程序集在不使用libc的情况下执行syscall
EN

Stack Overflow用户
提问于 2014-02-12 21:37:01
回答 1查看 2.5K关注 0票数 4

我想在不使用libc的情况下写一个很小的独立可执行文件。为了模拟一些libc函数,我需要让函数使用内联汇编执行syscall:

代码语言:javascript
复制
int syscall(int a,...) {
return __asm__ volatile (/* DO STH HERE */);
}

我使用的是Linux和ARM处理器。

编辑:找到解决方案:

代码语言:javascript
复制
int syscall(int n,...) {
return __asm__ volatile ("mov r7,r0\nmov r0,r1\nmov r1,r2\nmov r2,r3\nswi #1\n");
}
EN

回答 1

Stack Overflow用户

发布于 2014-02-12 22:45:31

首先,你需要能够控制你的工具链(gcc?)不包含除您的代码之外的任何额外内容。像-nostartfiles -nodefaultlibs to gcc这样的代码应该可以工作。

然后你需要很好地使用Linux,这意味着你的elf需要被操作系统正确加载,这意味着它需要让_start点可见。下面就是这样一个例子:

代码语言:javascript
复制
void _start() __attribute__ ((naked));
void _start() {
    main();
    asm volatile(
        "mov r7, #1\n" /* exit */
        "svc #0\n"
    );
}

然后,您可以创建一个main,其中包含您想要执行的操作。

代码语言:javascript
复制
int main() {
    linuxc('X');
    return 42;
}

然后用write syscall做额外的工作...

代码语言:javascript
复制
void linuxc(int c) {
    asm volatile(
        "mov r0, #1\n" /* stdout */
        "mov r1, %[buf]\n" /* write buffer */
        "mov r2, #1\n" /* size */
        "mov r7, #4\n" /* write syscall */
        "svc #0\n"
        : /* output */ : [buf] "r" (&c) : "r0", "r1", "r2", "r7", "memory"
    );
}

我在my github上有一个更完整的例子。我最喜欢teensy one。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21729497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档