首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在ARM aarch64中使用32位w寄存器进行GCC内联汇编?

如何在ARM aarch64中使用32位w寄存器进行GCC内联汇编?
EN

Stack Overflow用户
提问于 2019-12-18 23:28:25
回答 1查看 731关注 0票数 2

我可以使用64位寄存器,例如:

代码语言:javascript
运行
复制
#include <assert.h>
#include <inttypes.h>

int main(void) {
    uint64_t io = 1;
    __asm__ (
        "add %[io], %[io], 1;"
        : [io] "+r" (io)
        :
        :
    );
    assert(io == 2);
}

它使用以下命令编译和反汇编:

代码语言:javascript
运行
复制
aarch64-linux-gnu-gcc -ggdb3 -o main.out main.c
gdb-multiarch -batch -ex 'disassemble/rs main' main.out

与预期的64位寄存器相同:

代码语言:javascript
运行
复制
6           __asm__ (
   0x0000000000000744 <+16>:    a0 0f 40 f9     ldr     x0, [x29, #24]
   0x0000000000000748 <+20>:    00 04 00 91     add     x0, x0, #0x1
   0x000000000000074c <+24>:    a0 0f 00 f9     str     x0, [x29, #24]

如何使用32位寄存器,如w0?

在Ubuntu 18.04,GCC 7.4.0上测试。

EN

回答 1

Stack Overflow用户

发布于 2019-12-18 23:28:25

可以通过在%前面添加w来实现,例如:

代码语言:javascript
运行
复制
#include <assert.h>
#include <inttypes.h>

int main(void) {
    uint32_t io = 1;
    __asm__ (
        "add %w[io], %w[io], 1;"
        : [io] "+r" (io)
        :
        :
    );
    assert(io == 2);
}

现在可以反汇编成所需的32位版本:

代码语言:javascript
运行
复制
6           __asm__ (
   0x0000000000000744 <+16>:    a0 1f 40 b9     ldr     w0, [x29, #28]
   0x0000000000000748 <+20>:    00 04 00 11     add     w0, w0, #0x1
   0x000000000000074c <+24>:    a0 1f 00 b9     str     w0, [x29, #28]

这在某种程度上可以从http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.100067_0612_00_en/qjl1517569411293.html中猜到,因为ARM编译器6是基于LLVM的,而LLVM语法主要是基于GCC的。

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

https://stackoverflow.com/questions/59395244

复制
相关文章

相似问题

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