您尚未登录。

楼主 # 2021-07-15 14:19:53

March
会员
注册时间: 2021-05-28
已发帖子: 56
积分: 18

C语言调汇编的程序跳转问题

qqq.png
为什么上面这样不可以跳转,而下面这样可以跳转呢?
qqq_20210715-1418.png
参数addr被调用的时候传参是0x40036000

离线

#1 2021-07-15 14:57:35

tigger
会员
注册时间: 2021-06-18
已发帖子: 73
积分: 37

Re: C语言调汇编的程序跳转问题

reset.c

#include <stdint.h>

void user_reset1(volatile uint32_t addr)
{
        __asm("mv a1, a0");
}

void user_reset2(volatile uint32_t addr)
{
        __asm("li a1, 0x40036000");
}

编译: riscv64-linux-gnu-gcc -c reset.c  -g



反编译: riscv64-linux-gnu-objdump -S reset.o

reset.o:     file format elf64-littleriscv


Disassembly of section .text:

0000000000000000 <user_reset1>:
#include <stdint.h>

void user_reset1(volatile uint32_t addr)
{
   0:   1101                    addi    sp,sp,-32
   2:   ec22                    sd      s0,24(sp)
   4:   1000                    addi    s0,sp,32
   6:   87aa                    mv      a5,a0
   8:   fef42623                sw      a5,-20(s0)

000000000000000c <.L0 >:
        __asm("mv a1, a0");
   c:   85aa                    mv      a1,a0

000000000000000e <.L0 >:
}
   e:   0001                    nop
  10:   6462                    ld      s0,24(sp)
  12:   6105                    addi    sp,sp,32
  14:   8082                    ret

0000000000000016 <user_reset2>:

void user_reset2(volatile uint32_t addr)
{
  16:   1101                    addi    sp,sp,-32
  18:   ec22                    sd      s0,24(sp)
  1a:   1000                    addi    s0,sp,32

000000000000001c <.L0 >:
  1c:   87aa                    mv      a5,a0
  1e:   fef42623                sw      a5,-20(s0)

0000000000000022 <.L0 >:
        __asm("li a1, 0x40036000");
  22:   400365b7                lui     a1,0x40036

0000000000000026 <.L0 >:
}
  26:   0001                    nop
  28:   6462                    ld      s0,24(sp)

000000000000002a <.L0 >:
  2a:   6105                    addi    sp,sp,32
  2c:   8082                    ret

上面编译为:
        __asm("mv a1, a0");
   c:   85aa                    mv      a1,a0


下面编译为:
0000000000000022 <.L0 >:
        __asm("li a1, 0x40036000");
  22:   400365b7                lui     a1,0x40036


没看出来有什么区别, 路过的大佬说一说。

离线

楼主 #2 2021-07-15 15:26:43

March
会员
注册时间: 2021-05-28
已发帖子: 56
积分: 18

Re: C语言调汇编的程序跳转问题

__asm("mv a1, a0");测试:
_20210715-1522.png
__asm("li a1, 0x40036000");测试:
_20210715-1523.png
两种情况下的跳转现象:
1.11.png
2.22_20210715-1526.png

离线

#3 2021-07-15 15:32:48

哇酷小二
管理员
注册时间: 2020-04-22
已发帖子: 2,452
积分: 1902

Re: C语言调汇编的程序跳转问题

__asm("mv a1, a0");

我查了一下, mv 是伪指令
https://riscv.org/wp-content/uploads/2017/05/riscv-spec-v2.2.pdf

改成 addi a1, a0, 0 试一试?

在线

#4 2021-07-15 15:37:45

哇酷小二
管理员
注册时间: 2020-04-22
已发帖子: 2,452
积分: 1902

Re: C语言调汇编的程序跳转问题

000000000000000c <.L0 >:
        __asm("mv a1, a0");
   c:   85aa                    mv      a1,a0

000000000000000e <.L0 >:
        __asm("addi a1, a0, 0");
   e:   00050593                mv      a1,a0

这是反汇编结果,前面16bit 应该是压缩指令, 后面32bit 是正常指令。

在线

楼主 #5 2021-07-15 15:43:59

March
会员
注册时间: 2021-05-28
已发帖子: 56
积分: 18

Re: C语言调汇编的程序跳转问题

还是一样,不能跳转
_20210715-1543.png

离线

#6 2021-07-15 15:46:28

哇酷小二
管理员
注册时间: 2020-04-22
已发帖子: 2,452
积分: 1902

Re: C语言调汇编的程序跳转问题

再试一试这样:

自己动手编写一个非常简单的RISC-V C调用使用ABI规则ASM汇编的demo, 使用qemu-riscv64虚拟机测试.
https://whycan.com/t_6685.html

在线

#7 2021-07-15 16:03:50

xboot
会员
注册时间: 2019-10-15
已发帖子: 370
积分: 275

Re: C语言调汇编的程序跳转问题

额,C语言跳转执行,没必要搞汇编,c也是很强大的,来函数强制转换就行,能用C还是用C吧, 不得已才用汇编,或者机器码。

/*
 * This function copies SD/MMC card data to memory.
 * always use EPLL source clock. this function works at 20Mhz.
 *
 * @param ch 	 : HSMMC controller channel number
 * @param sector : source card(SD/MMC) address (it must block address).
 * @param count  : number of blocks to copy.
 * @param mem    : memory to copy to.
 * @param init 	 : reinitialize or not.
 * @return bool(u8_t) - success or failure.
 */
#define irom_sdmmc_to_mem(ch, sector, count, mem, init) \
	(((u8_t(*)(s32_t, u32_t, u16_t, u32_t *, s32_t))(*((u32_t *)(0xd0037f98))))(ch, sector, count, mem, init))

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn