当前位置: 首页 > news >正文

RV64和ARM64栈结构差异

RV64和ARM64栈结构差异

  • 1 RV64和ARM64栈结构差异示意图
    • 1.1 RV64和ARM64寄存器介绍
      • 1.1.1 RV64寄存器
      • 1.1.2 ARM64寄存器
    • 1.2 RV64和ARM64栈结构差异示意图
  • 2 RV64和ARM64栈使用示例
    • 2.1 测试的程序
    • 2.2 RV64反汇编的汇编程序
    • 2.3 ARM64反汇编的汇编程序
    • 2.4 RV64和ARM64测试程序的栈结构图
      • 2.4.1 RV64测试程序的栈结构图
      • 2.4.2 ARM64测试程序的栈结构图
  • 3 异常时依据栈和当前寄存器推导调用栈的处理流程
    • 3.1 以RV64为例来介绍
      • 3.1.2 调用栈
    • 3.2 以ARM64为例来介绍
      • 3.2.1依据栈帧寄存器以及ra推导函数调用流程
      • 3.2.2 调用栈

为什么要写这篇文章呢,主要是为了区分一下在RV64(RISC-V)和ARM64两种不同处理器在函数调用过程中栈的结构性差异,当出现异常情况时如何根据栈以及异常时寄存器的情况如何推导出调用栈。

RISC-V调用规则
RV64函数调用流程分析
ARM64 程序调用标准
ARM64函数调用流程分析

1 RV64和ARM64栈结构差异示意图

1.1 RV64和ARM64寄存器介绍

1.1.1 RV64寄存器

在这里插入图片描述

1.1.2 ARM64寄存器

5
在这里插入图片描述

1.2 RV64和ARM64栈结构差异示意图

  • RV64的栈帧寄存器是s0,s0指向当前函数栈的栈底
  • ARM64的栈帧寄存器是x29,x29指向当前函数的栈顶
  • SP指向栈的栈顶
    在这里插入图片描述

2 RV64和ARM64栈使用示例

2.1 测试的程序

#include <stdio.h>
#include <string.h>void test_fun_b(long m, long n, long x, long y)
{long c = 3;long d = 4;printf("The current function is %s c:%ld d:%ld\r\n", __func__, c, d); c = c + d + m;d = c + d + n;
}void test_fun_a(long m, long n, long x, long y)
{long b = 2;long c = 3;printf("The current function is %s b:%ld c:%ld\r\n", __func__, b, c);test_fun_b(b, c, 0, 2); b = b + c + m;c = b + c + n;
}int main(void)
{long a = 1;long b = 2;printf("The current function is %s a:%ld b:%ld\r\n", __func__, a, b); test_fun_a(a, b, 0, 1); a = a + b;b = a + b;return 0;
}

2.2 RV64反汇编的汇编程序

  • RV64的编译命令:riscv64-linux-gnu-gcc -Wl,--no-as-needed main.c -o rv_test
  • RV64的反汇编命令:riscv64-linux-gnu-objdump -S -d rv_test

rv_test:     file format elf64-littleriscvDisassembly of section .plt:0000000000000520 <.plt>:520:	00002397          	auipc	t2,0x2524:	41c30333          	sub	t1,t1,t3528:	ae83be03          	ld	t3,-1304(t2) # 2008 <__TMC_END__>52c:	fd430313          	addi	t1,t1,-44530:	ae838293          	addi	t0,t2,-1304534:	00135313          	srli	t1,t1,0x1538:	0082b283          	ld	t0,8(t0)53c:	000e0067          	jr	t30000000000000540 <__libc_start_main@plt>:540:	00002e17          	auipc	t3,0x2544:	ad8e3e03          	ld	t3,-1320(t3) # 2018 <__libc_start_main@GLIBC_2.27>548:	000e0367          	jalr	t1,t354c:	00000013          	nop0000000000000550 <printf@plt>:550:	00002e17          	auipc	t3,0x2554:	ad0e3e03          	ld	t3,-1328(t3) # 2020 <printf@GLIBC_2.27>558:	000e0367          	jalr	t1,t355c:	00000013          	nopDisassembly of section .text:0000000000000560 <_start>:560:	02e000ef          	jal	ra,58e <load_gp>564:	87aa                	mv	a5,a0566:	00002517          	auipc	a0,0x256a:	ad253503          	ld	a0,-1326(a0) # 2038 <_GLOBAL_OFFSET_TABLE_+0x10>56e:	6582                	ld	a1,0(sp)570:	0030                	addi	a2,sp,8572:	ff017113          	andi	sp,sp,-16576:	00000697          	auipc	a3,0x057a:	21068693          	addi	a3,a3,528 # 786 <__libc_csu_init>57e:	00000717          	auipc	a4,0x0582:	26070713          	addi	a4,a4,608 # 7de <__libc_csu_fini>586:	880a                	mv	a6,sp588:	fb9ff0ef          	jal	ra,540 <__libc_start_main@plt>58c:	9002                	ebreak000000000000058e <load_gp>:58e:	00002197          	auipc	gp,0x2592:	27218193          	addi	gp,gp,626 # 2800 <__global_pointer$>596:	8082                	ret...000000000000059a <deregister_tm_clones>:59a:	00002517          	auipc	a0,0x259e:	a6e50513          	addi	a0,a0,-1426 # 2008 <__TMC_END__>5a2:	00002797          	auipc	a5,0x25a6:	a6678793          	addi	a5,a5,-1434 # 2008 <__TMC_END__>5aa:	00a78963          	beq	a5,a0,5bc <deregister_tm_clones+0x22>5ae:	00002317          	auipc	t1,0x25b2:	a8233303          	ld	t1,-1406(t1) # 2030 <_ITM_deregisterTMCloneTable>5b6:	00030363          	beqz	t1,5bc <deregister_tm_clones+0x22>5ba:	8302                	jr	t15bc:	8082                	ret00000000000005be <register_tm_clones>:5be:	00002517          	auipc	a0,0x25c2:	a4a50513          	addi	a0,a0,-1462 # 2008 <__TMC_END__>5c6:	00002797          	auipc	a5,0x25ca:	a4278793          	addi	a5,a5,-1470 # 2008 <__TMC_END__>5ce:	8f89                	sub	a5,a5,a05d0:	4037d713          	srai	a4,a5,0x35d4:	03f7d593          	srli	a1,a5,0x3f5d8:	95ba                	add	a1,a1,a45da:	8585                	srai	a1,a1,0x15dc:	c981                	beqz	a1,5ec <register_tm_clones+0x2e>5de:	00002317          	auipc	t1,0x25e2:	a6a33303          	ld	t1,-1430(t1) # 2048 <_ITM_registerTMCloneTable>5e6:	00030363          	beqz	t1,5ec <register_tm_clones+0x2e>5ea:	8302                	jr	t15ec:	8082                	ret00000000000005ee <__do_global_dtors_aux>:5ee:	1141                	addi	sp,sp,-165f0:	e022                	sd	s0,0(sp)5f2:	00002417          	auipc	s0,0x25f6:	a6240413          	addi	s0,s0,-1438 # 2054 <completed.6761>5fa:	00044783          	lbu	a5,0(s0)5fe:	e406                	sd	ra,8(sp)600:	e385                	bnez	a5,620 <__do_global_dtors_aux+0x32>602:	00002797          	auipc	a5,0x2606:	a3e7b783          	ld	a5,-1474(a5) # 2040 <__cxa_finalize@GLIBC_2.27>60a:	c791                	beqz	a5,616 <__do_global_dtors_aux+0x28>60c:	00002517          	auipc	a0,0x2610:	9f453503          	ld	a0,-1548(a0) # 2000 <__dso_handle>614:	9782                	jalr	a5616:	f85ff0ef          	jal	ra,59a <deregister_tm_clones>61a:	4785                	li	a5,161c:	00f40023          	sb	a5,0(s0)620:	60a2                	ld	ra,8(sp)622:	6402                	ld	s0,0(sp)624:	0141                	addi	sp,sp,16626:	8082                	ret0000000000000628 <frame_dummy>:628:	bf59                	j	5be <register_tm_clones>000000000000062a <test_fun_b>:62a:	7139                	addi	sp,sp,-6462c:	fc06                	sd	ra,56(sp)62e:	f822                	sd	s0,48(sp)630:	0080                	addi	s0,sp,64632:	fca43c23          	sd	a0,-40(s0)636:	fcb43823          	sd	a1,-48(s0)63a:	fcc43423          	sd	a2,-56(s0)63e:	fcd43023          	sd	a3,-64(s0)642:	478d                	li	a5,3644:	fef43023          	sd	a5,-32(s0)648:	4791                	li	a5,464a:	fef43423          	sd	a5,-24(s0)64e:	fe843683          	ld	a3,-24(s0)652:	fe043603          	ld	a2,-32(s0)656:	00000597          	auipc	a1,0x065a:	21a58593          	addi	a1,a1,538 # 870 <__func__.2089>65e:	00000517          	auipc	a0,0x0662:	18250513          	addi	a0,a0,386 # 7e0 <__libc_csu_fini+0x2>666:	eebff0ef          	jal	ra,550 <printf@plt>66a:	fe043703          	ld	a4,-32(s0)66e:	fe843783          	ld	a5,-24(s0)672:	97ba                	add	a5,a5,a4674:	fd843703          	ld	a4,-40(s0)678:	97ba                	add	a5,a5,a467a:	fef43023          	sd	a5,-32(s0)67e:	fe043703          	ld	a4,-32(s0)682:	fe843783          	ld	a5,-24(s0)686:	97ba                	add	a5,a5,a4688:	fd043703          	ld	a4,-48(s0)68c:	97ba                	add	a5,a5,a468e:	fef43423          	sd	a5,-24(s0)692:	0001                	nop694:	70e2                	ld	ra,56(sp)696:	7442                	ld	s0,48(sp)698:	6121                	addi	sp,sp,6469a:	8082                	ret000000000000069c <test_fun_a>:69c:	7139                	addi	sp,sp,-6469e:	fc06                	sd	ra,56(sp)6a0:	f822                	sd	s0,48(sp)6a2:	0080                	addi	s0,sp,646a4:	fca43c23          	sd	a0,-40(s0)6a8:	fcb43823          	sd	a1,-48(s0)6ac:	fcc43423          	sd	a2,-56(s0)6b0:	fcd43023          	sd	a3,-64(s0)6b4:	4789                	li	a5,26b6:	fef43023          	sd	a5,-32(s0)6ba:	478d                	li	a5,36bc:	fef43423          	sd	a5,-24(s0)6c0:	fe843683          	ld	a3,-24(s0)6c4:	fe043603          	ld	a2,-32(s0)6c8:	00000597          	auipc	a1,0x06cc:	1b858593          	addi	a1,a1,440 # 880 <__func__.2098>6d0:	00000517          	auipc	a0,0x06d4:	14050513          	addi	a0,a0,320 # 810 <__libc_csu_fini+0x32>6d8:	e79ff0ef          	jal	ra,550 <printf@plt>6dc:	4689                	li	a3,26de:	4601                	li	a2,06e0:	fe843583          	ld	a1,-24(s0)6e4:	fe043503          	ld	a0,-32(s0)6e8:	f43ff0ef          	jal	ra,62a <test_fun_b>6ec:	fe043703          	ld	a4,-32(s0)6f0:	fe843783          	ld	a5,-24(s0)6f4:	97ba                	add	a5,a5,a46f6:	fd843703          	ld	a4,-40(s0)6fa:	97ba                	add	a5,a5,a46fc:	fef43023          	sd	a5,-32(s0)700:	fe043703          	ld	a4,-32(s0)704:	fe843783          	ld	a5,-24(s0)708:	97ba                	add	a5,a5,a470a:	fd043703          	ld	a4,-48(s0)70e:	97ba                	add	a5,a5,a4710:	fef43423          	sd	a5,-24(s0)714:	0001                	nop716:	70e2                	ld	ra,56(sp)718:	7442                	ld	s0,48(sp)71a:	6121                	addi	sp,sp,6471c:	8082                	ret000000000000071e <main>:71e:	1101                	addi	sp,sp,-32720:	ec06                	sd	ra,24(sp)722:	e822                	sd	s0,16(sp)724:	1000                	addi	s0,sp,32726:	4785                	li	a5,1728:	fef43023          	sd	a5,-32(s0)72c:	4789                	li	a5,272e:	fef43423          	sd	a5,-24(s0)732:	fe843683          	ld	a3,-24(s0)736:	fe043603          	ld	a2,-32(s0)73a:	00000597          	auipc	a1,0x073e:	15658593          	addi	a1,a1,342 # 890 <__func__.2104>742:	00000517          	auipc	a0,0x0746:	0fe50513          	addi	a0,a0,254 # 840 <__libc_csu_fini+0x62>74a:	e07ff0ef          	jal	ra,550 <printf@plt>74e:	4685                	li	a3,1750:	4601                	li	a2,0752:	fe843583          	ld	a1,-24(s0)756:	fe043503          	ld	a0,-32(s0)75a:	f43ff0ef          	jal	ra,69c <test_fun_a>75e:	fe043703          	ld	a4,-32(s0)762:	fe843783          	ld	a5,-24(s0)766:	97ba                	add	a5,a5,a4768:	fef43023          	sd	a5,-32(s0)76c:	fe843703          	ld	a4,-24(s0)770:	fe043783          	ld	a5,-32(s0)774:	97ba                	add	a5,a5,a4776:	fef43423          	sd	a5,-24(s0)77a:	4781                	li	a5,077c:	853e                	mv	a0,a577e:	60e2                	ld	ra,24(sp)780:	6442                	ld	s0,16(sp)782:	6105                	addi	sp,sp,32784:	8082                	ret0000000000000786 <__libc_csu_init>:786:	7139                	addi	sp,sp,-64788:	f822                	sd	s0,48(sp)78a:	f04a                	sd	s2,32(sp)78c:	00001417          	auipc	s0,0x1790:	67440413          	addi	s0,s0,1652 # 1e00 <__frame_dummy_init_array_entry>794:	00001917          	auipc	s2,0x1798:	67490913          	addi	s2,s2,1652 # 1e08 <__do_global_dtors_aux_fini_array_entry>79c:	40890933          	sub	s2,s2,s07a0:	fc06                	sd	ra,56(sp)7a2:	f426                	sd	s1,40(sp)7a4:	ec4e                	sd	s3,24(sp)7a6:	e852                	sd	s4,16(sp)7a8:	e456                	sd	s5,8(sp)7aa:	40395913          	srai	s2,s2,0x37ae:	00090f63          	beqz	s2,7cc <__libc_csu_init+0x46>7b2:	89aa                	mv	s3,a07b4:	8a2e                	mv	s4,a17b6:	8ab2                	mv	s5,a27b8:	4481                	li	s1,07ba:	601c                	ld	a5,0(s0)7bc:	8656                	mv	a2,s57be:	85d2                	mv	a1,s47c0:	854e                	mv	a0,s37c2:	0485                	addi	s1,s1,17c4:	9782                	jalr	a57c6:	0421                	addi	s0,s0,87c8:	fe9919e3          	bne	s2,s1,7ba <__libc_csu_init+0x34>7cc:	70e2                	ld	ra,56(sp)7ce:	7442                	ld	s0,48(sp)7d0:	74a2                	ld	s1,40(sp)7d2:	7902                	ld	s2,32(sp)7d4:	69e2                	ld	s3,24(sp)7d6:	6a42                	ld	s4,16(sp)7d8:	6aa2                	ld	s5,8(sp)7da:	6121                	addi	sp,sp,647dc:	8082                	ret00000000000007de <__libc_csu_fini>:7de:	8082                	ret

2.3 ARM64反汇编的汇编程序

  • RV64的编译命令:aarch64-linux-gnu-gcc -Wl,--no-as-needed main.c -o a64_test
  • RV64的反汇编命令:aarch64-linux-gnu-objdump -S -d a64_test

a64_test:     file format elf64-littleaarch64Disassembly of section .init:00000000000005d0 <_init>:5d0:	a9bf7bfd 	stp	x29, x30, [sp, #-16]!5d4:	910003fd 	mov	x29, sp5d8:	94000030 	bl	698 <call_weak_fn>5dc:	a8c17bfd 	ldp	x29, x30, [sp], #165e0:	d65f03c0 	retDisassembly of section .plt:00000000000005f0 <.plt>:5f0:	a9bf7bf0 	stp	x16, x30, [sp, #-16]!5f4:	90000090 	adrp	x16, 10000 <__FRAME_END__+0xf438>5f8:	f947ca11 	ldr	x17, [x16, #3984]5fc:	913e4210 	add	x16, x16, #0xf90600:	d61f0220 	br	x17604:	d503201f 	nop608:	d503201f 	nop60c:	d503201f 	nop0000000000000610 <__cxa_finalize@plt>:610:	90000090 	adrp	x16, 10000 <__FRAME_END__+0xf438>614:	f947ce11 	ldr	x17, [x16, #3992]618:	913e6210 	add	x16, x16, #0xf9861c:	d61f0220 	br	x170000000000000620 <__libc_start_main@plt>:620:	90000090 	adrp	x16, 10000 <__FRAME_END__+0xf438>624:	f947d211 	ldr	x17, [x16, #4000]628:	913e8210 	add	x16, x16, #0xfa062c:	d61f0220 	br	x170000000000000630 <__gmon_start__@plt>:630:	90000090 	adrp	x16, 10000 <__FRAME_END__+0xf438>634:	f947d611 	ldr	x17, [x16, #4008]638:	913ea210 	add	x16, x16, #0xfa863c:	d61f0220 	br	x170000000000000640 <abort@plt>:640:	90000090 	adrp	x16, 10000 <__FRAME_END__+0xf438>644:	f947da11 	ldr	x17, [x16, #4016]648:	913ec210 	add	x16, x16, #0xfb064c:	d61f0220 	br	x170000000000000650 <printf@plt>:650:	90000090 	adrp	x16, 10000 <__FRAME_END__+0xf438>654:	f947de11 	ldr	x17, [x16, #4024]658:	913ee210 	add	x16, x16, #0xfb865c:	d61f0220 	br	x17Disassembly of section .text:0000000000000660 <_start>:660:	d280001d 	mov	x29, #0x0                   	// #0664:	d280001e 	mov	x30, #0x0                   	// #0668:	aa0003e5 	mov	x5, x066c:	f94003e1 	ldr	x1, [sp]670:	910023e2 	add	x2, sp, #0x8674:	910003e6 	mov	x6, sp678:	90000080 	adrp	x0, 10000 <__FRAME_END__+0xf438>67c:	f947f800 	ldr	x0, [x0, #4080]680:	90000083 	adrp	x3, 10000 <__FRAME_END__+0xf438>684:	f947f463 	ldr	x3, [x3, #4072]688:	90000084 	adrp	x4, 10000 <__FRAME_END__+0xf438>68c:	f947e484 	ldr	x4, [x4, #4040]690:	97ffffe4 	bl	620 <__libc_start_main@plt>694:	97ffffeb 	bl	640 <abort@plt>0000000000000698 <call_weak_fn>:698:	90000080 	adrp	x0, 10000 <__FRAME_END__+0xf438>69c:	f947f000 	ldr	x0, [x0, #4064]6a0:	b4000040 	cbz	x0, 6a8 <call_weak_fn+0x10>6a4:	17ffffe3 	b	630 <__gmon_start__@plt>6a8:	d65f03c0 	ret6ac:	d503201f 	nop00000000000006b0 <deregister_tm_clones>:6b0:	b0000080 	adrp	x0, 11000 <__data_start>6b4:	91004000 	add	x0, x0, #0x106b8:	b0000081 	adrp	x1, 11000 <__data_start>6bc:	91004021 	add	x1, x1, #0x106c0:	eb00003f 	cmp	x1, x06c4:	540000c0 	b.eq	6dc <deregister_tm_clones+0x2c>  // b.none6c8:	90000081 	adrp	x1, 10000 <__FRAME_END__+0xf438>6cc:	f947e821 	ldr	x1, [x1, #4048]6d0:	b4000061 	cbz	x1, 6dc <deregister_tm_clones+0x2c>6d4:	aa0103f0 	mov	x16, x16d8:	d61f0200 	br	x166dc:	d65f03c0 	ret00000000000006e0 <register_tm_clones>:6e0:	b0000080 	adrp	x0, 11000 <__data_start>6e4:	91004000 	add	x0, x0, #0x106e8:	b0000081 	adrp	x1, 11000 <__data_start>6ec:	91004021 	add	x1, x1, #0x106f0:	cb000021 	sub	x1, x1, x06f4:	d37ffc22 	lsr	x2, x1, #636f8:	8b810c41 	add	x1, x2, x1, asr #36fc:	eb8107ff 	cmp	xzr, x1, asr #1700:	9341fc21 	asr	x1, x1, #1704:	540000c0 	b.eq	71c <register_tm_clones+0x3c>  // b.none708:	90000082 	adrp	x2, 10000 <__FRAME_END__+0xf438>70c:	f947fc42 	ldr	x2, [x2, #4088]710:	b4000062 	cbz	x2, 71c <register_tm_clones+0x3c>714:	aa0203f0 	mov	x16, x2718:	d61f0200 	br	x1671c:	d65f03c0 	ret0000000000000720 <__do_global_dtors_aux>:720:	a9be7bfd 	stp	x29, x30, [sp, #-32]!724:	910003fd 	mov	x29, sp728:	f9000bf3 	str	x19, [sp, #16]72c:	b0000093 	adrp	x19, 11000 <__data_start>730:	39404260 	ldrb	w0, [x19, #16]734:	35000140 	cbnz	w0, 75c <__do_global_dtors_aux+0x3c>738:	90000080 	adrp	x0, 10000 <__FRAME_END__+0xf438>73c:	f947ec00 	ldr	x0, [x0, #4056]740:	b4000080 	cbz	x0, 750 <__do_global_dtors_aux+0x30>744:	b0000080 	adrp	x0, 11000 <__data_start>748:	f9400400 	ldr	x0, [x0, #8]74c:	97ffffb1 	bl	610 <__cxa_finalize@plt>750:	97ffffd8 	bl	6b0 <deregister_tm_clones>754:	52800020 	mov	w0, #0x1                   	// #1758:	39004260 	strb	w0, [x19, #16]75c:	f9400bf3 	ldr	x19, [sp, #16]760:	a8c27bfd 	ldp	x29, x30, [sp], #32764:	d65f03c0 	ret0000000000000768 <frame_dummy>:768:	17ffffde 	b	6e0 <register_tm_clones>000000000000076c <test_fun_b>:76c:	a9bc7bfd 	stp	x29, x30, [sp, #-64]!770:	910003fd 	mov	x29, sp774:	f90017e0 	str	x0, [sp, #40]778:	f90013e1 	str	x1, [sp, #32]77c:	f9000fe2 	str	x2, [sp, #24]780:	f9000be3 	str	x3, [sp, #16]784:	d2800060 	mov	x0, #0x3                   	// #3788:	f9001be0 	str	x0, [sp, #48]78c:	d2800080 	mov	x0, #0x4                   	// #4790:	f9001fe0 	str	x0, [sp, #56]794:	f9401fe3 	ldr	x3, [sp, #56]798:	f9401be2 	ldr	x2, [sp, #48]79c:	90000000 	adrp	x0, 0 <_init-0x5d0>7a0:	9128a001 	add	x1, x0, #0xa287a4:	90000000 	adrp	x0, 0 <_init-0x5d0>7a8:	91266000 	add	x0, x0, #0x9987ac:	97ffffa9 	bl	650 <printf@plt>7b0:	f9401be1 	ldr	x1, [sp, #48]7b4:	f9401fe0 	ldr	x0, [sp, #56]7b8:	8b000020 	add	x0, x1, x07bc:	f94017e1 	ldr	x1, [sp, #40]7c0:	8b000020 	add	x0, x1, x07c4:	f9001be0 	str	x0, [sp, #48]7c8:	f9401be1 	ldr	x1, [sp, #48]7cc:	f9401fe0 	ldr	x0, [sp, #56]7d0:	8b000020 	add	x0, x1, x07d4:	f94013e1 	ldr	x1, [sp, #32]7d8:	8b000020 	add	x0, x1, x07dc:	f9001fe0 	str	x0, [sp, #56]7e0:	d503201f 	nop7e4:	a8c47bfd 	ldp	x29, x30, [sp], #647e8:	d65f03c0 	ret00000000000007ec <test_fun_a>:7ec:	a9bc7bfd 	stp	x29, x30, [sp, #-64]!7f0:	910003fd 	mov	x29, sp7f4:	f90017e0 	str	x0, [sp, #40]7f8:	f90013e1 	str	x1, [sp, #32]7fc:	f9000fe2 	str	x2, [sp, #24]800:	f9000be3 	str	x3, [sp, #16]804:	d2800040 	mov	x0, #0x2                   	// #2808:	f9001be0 	str	x0, [sp, #48]80c:	d2800060 	mov	x0, #0x3                   	// #3810:	f9001fe0 	str	x0, [sp, #56]814:	f9401fe3 	ldr	x3, [sp, #56]818:	f9401be2 	ldr	x2, [sp, #48]81c:	90000000 	adrp	x0, 0 <_init-0x5d0>820:	9128e001 	add	x1, x0, #0xa38824:	90000000 	adrp	x0, 0 <_init-0x5d0>828:	91272000 	add	x0, x0, #0x9c882c:	97ffff89 	bl	650 <printf@plt>830:	d2800043 	mov	x3, #0x2                   	// #2834:	d2800002 	mov	x2, #0x0                   	// #0838:	f9401fe1 	ldr	x1, [sp, #56]83c:	f9401be0 	ldr	x0, [sp, #48]840:	97ffffcb 	bl	76c <test_fun_b>844:	f9401be1 	ldr	x1, [sp, #48]848:	f9401fe0 	ldr	x0, [sp, #56]84c:	8b000020 	add	x0, x1, x0850:	f94017e1 	ldr	x1, [sp, #40]854:	8b000020 	add	x0, x1, x0858:	f9001be0 	str	x0, [sp, #48]85c:	f9401be1 	ldr	x1, [sp, #48]860:	f9401fe0 	ldr	x0, [sp, #56]864:	8b000020 	add	x0, x1, x0868:	f94013e1 	ldr	x1, [sp, #32]86c:	8b000020 	add	x0, x1, x0870:	f9001fe0 	str	x0, [sp, #56]874:	d503201f 	nop878:	a8c47bfd 	ldp	x29, x30, [sp], #6487c:	d65f03c0 	ret0000000000000880 <main>:880:	a9be7bfd 	stp	x29, x30, [sp, #-32]!884:	910003fd 	mov	x29, sp888:	d2800020 	mov	x0, #0x1                   	// #188c:	f9000be0 	str	x0, [sp, #16]890:	d2800040 	mov	x0, #0x2                   	// #2894:	f9000fe0 	str	x0, [sp, #24]898:	f9400fe3 	ldr	x3, [sp, #24]89c:	f9400be2 	ldr	x2, [sp, #16]8a0:	90000000 	adrp	x0, 0 <_init-0x5d0>8a4:	91292001 	add	x1, x0, #0xa488a8:	90000000 	adrp	x0, 0 <_init-0x5d0>8ac:	9127e000 	add	x0, x0, #0x9f88b0:	97ffff68 	bl	650 <printf@plt>8b4:	d2800023 	mov	x3, #0x1                   	// #18b8:	d2800002 	mov	x2, #0x0                   	// #08bc:	f9400fe1 	ldr	x1, [sp, #24]8c0:	f9400be0 	ldr	x0, [sp, #16]8c4:	97ffffca 	bl	7ec <test_fun_a>8c8:	f9400be1 	ldr	x1, [sp, #16]8cc:	f9400fe0 	ldr	x0, [sp, #24]8d0:	8b000020 	add	x0, x1, x08d4:	f9000be0 	str	x0, [sp, #16]8d8:	f9400fe1 	ldr	x1, [sp, #24]8dc:	f9400be0 	ldr	x0, [sp, #16]8e0:	8b000020 	add	x0, x1, x08e4:	f9000fe0 	str	x0, [sp, #24]8e8:	52800000 	mov	w0, #0x0                   	// #08ec:	a8c27bfd 	ldp	x29, x30, [sp], #328f0:	d65f03c0 	ret8f4:	d503201f 	nop00000000000008f8 <__libc_csu_init>:8f8:	a9bc7bfd 	stp	x29, x30, [sp, #-64]!8fc:	910003fd 	mov	x29, sp900:	a90153f3 	stp	x19, x20, [sp, #16]904:	90000094 	adrp	x20, 10000 <__FRAME_END__+0xf438>908:	91362294 	add	x20, x20, #0xd8890c:	a9025bf5 	stp	x21, x22, [sp, #32]910:	90000095 	adrp	x21, 10000 <__FRAME_END__+0xf438>914:	913602b5 	add	x21, x21, #0xd80918:	cb150294 	sub	x20, x20, x2191c:	2a0003f6 	mov	w22, w0920:	a90363f7 	stp	x23, x24, [sp, #48]924:	aa0103f7 	mov	x23, x1928:	aa0203f8 	mov	x24, x292c:	97ffff29 	bl	5d0 <_init>930:	eb940fff 	cmp	xzr, x20, asr #3934:	54000160 	b.eq	960 <__libc_csu_init+0x68>  // b.none938:	9343fe94 	asr	x20, x20, #393c:	d2800013 	mov	x19, #0x0                   	// #0940:	f8737aa3 	ldr	x3, [x21, x19, lsl #3]944:	aa1803e2 	mov	x2, x24948:	91000673 	add	x19, x19, #0x194c:	aa1703e1 	mov	x1, x23950:	2a1603e0 	mov	w0, w22954:	d63f0060 	blr	x3958:	eb13029f 	cmp	x20, x1995c:	54ffff21 	b.ne	940 <__libc_csu_init+0x48>  // b.any960:	a94153f3 	ldp	x19, x20, [sp, #16]964:	a9425bf5 	ldp	x21, x22, [sp, #32]968:	a94363f7 	ldp	x23, x24, [sp, #48]96c:	a8c47bfd 	ldp	x29, x30, [sp], #64970:	d65f03c0 	ret974:	d503201f 	nop0000000000000978 <__libc_csu_fini>:978:	d65f03c0 	retDisassembly of section .fini:000000000000097c <_fini>:97c:	a9bf7bfd 	stp	x29, x30, [sp, #-16]!980:	910003fd 	mov	x29, sp984:	a8c17bfd 	ldp	x29, x30, [sp], #16988:	d65f03c0 	ret

2.4 RV64和ARM64测试程序的栈结构图

2.4.1 RV64测试程序的栈结构图

在这里插入图片描述

2.4.2 ARM64测试程序的栈结构图

在这里插入图片描述

3 异常时依据栈和当前寄存器推导调用栈的处理流程

  • 首先要查看当前栈帧寄存器( FP )以及栈指针寄存器( SP )以及ra寄存器。对于arm64,其FP是x29寄存器,ra是x30寄存器;对于rv64来说,x8(s0)为其FP寄存器,x1为其ra寄存器。
  • 确认FP和SP就可以去依次去找到各个调用函数的调用过程,找到ra就可以确认当前函数的上一级调用者。

3.1 以RV64为例来介绍

在这里插入图片描述

3.1.2 调用栈

|- func_e|- func_d|- func_c|- func_b|- func_a

3.2 以ARM64为例来介绍

3.2.1依据栈帧寄存器以及ra推导函数调用流程

在这里插入图片描述

3.2.2 调用栈

|- func_d|- func_c|- func_b|- func_a

相关文章:

RV64和ARM64栈结构差异

RV64和ARM64栈结构差异 1 RV64和ARM64栈结构差异示意图1.1 RV64和ARM64寄存器介绍1.1.1 RV64寄存器1.1.2 ARM64寄存器 1.2 RV64和ARM64栈结构差异示意图 2 RV64和ARM64栈使用示例2.1 测试的程序2.2 RV64反汇编的汇编程序2.3 ARM64反汇编的汇编程序2.4 RV64和ARM64测试程序的栈结…...

将 Python 与 RStudio IDE 配合使用(R与Python系列第一篇)

目录 前言&#xff1a; 1-安装reticulate包 2-安装Python 3-选择Python的默认版本&#xff08;配置Python环境&#xff09; 4-使用Python 4.1 运行一个简单的Python脚本 4.2 在RStudio上安装Python模块 4.3 在 R 中调用 Python 模块 4.4 在RStudio上调用Python脚本写的…...

数据库访问性能优化

目录 IO性能分析数据库性能优化漏斗法则1、减少数据访问&#xff08;减少磁盘访问&#xff09;(1) 正确的创建并使用索引索引生效场景索引失效场景判断索引是否生效--执行计划 2、返回更少数据&#xff08;减少网络传输或磁盘访问&#xff09;(1) 数据分页处理(减少行数)客户端…...

vue 预览 有token验证的 doc、docx、pdf、xlsx、csv、图片 并下载

预览 doc我也不会 //docx <div v-if"previewType docx" ref"iframeDom" style"border: none; width: 100%; height: 100%"></div> import { renderAsync } from "docx-preview"; let iframeDom: any ref(); axios({url…...

WPF数据视图

将集合绑定到ItemsControl控件时&#xff0c;会不加通告的在后台创建数据视图——位于数据源和绑定的控件之间。数据视图是进入数据源的窗口&#xff0c;可以跟踪当前项&#xff0c;并且支持各种功能&#xff0c;如排序、过滤、分组。 这些功能和数据对象本身是相互独立的&…...

C++ new/delete 与 malloc/free 的区别?

new/delete 与 malloc/free 的区别&#xff1f; 分配内存的位置 malloc是从堆上动态分配内存new是从自由存储区为对象动态分配内存。自由存储区的位置取决于operator new的实现。自由存储区不仅可以为堆&#xff0c;还可以是静态存储区&#xff0c;这都看operator new在哪里为…...

【数学建模】常微分,偏微分方程

1.常微分方程 普通边界 已知t0时刻的初值 ode45() 龙格-库塔法 一阶&#xff0c;高阶都一样 如下: s(1) y , s(2)y s(3) x , s(4)x //匿名函数 下为方程组 核心函数 s_chuzhi [0;0;0;0]; //初值 分别两个位移和速度的初值 t0 0:0.2:180; f (t,s)[s(2);(…...

浙大数据结构之09-排序1 排序

题目详情&#xff1a; 给定N个&#xff08;长整型范围内的&#xff09;整数&#xff0c;要求输出从小到大排序后的结果。 本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下&#xff1a; 数据1&#xff1a;只有1个元素&#xff1b;数据2&#xf…...

Pydantic 学习随笔

这里是零散的记录一些学习过程中随机的理解&#xff0c;因此这里的记录不成体系。如果是想学习 Pydantic 建议看官方文档&#xff0c;写的很详细并且成体系。如果有问题需要交流&#xff0c;欢迎私信或者评论。 siwa 报 500 Pydantic 可以和 siwa 结合使用&#xff0c;这样既…...

11 mysql float/double/decimal 的数据存储

前言 这里主要是 由于之前的一个 datetime 存储的时间 导致的问题的衍生出来的探究 探究的主要内容为 int 类类型的存储, 浮点类类型的存储, char 类类型的存储, blob 类类型的存储, enum/json/set/bit 类类型的存储 本文主要 的相关内容是 float, decimal 类类型的相关数据…...

【高效数据结构——位图bitmap】

初识位图bitmap 位图&#xff08;Bitmap&#xff09;是一种用于表示和操作位&#xff08;bit&#xff09;的数据结构。它是由一系列二进制位&#xff08;0 或 1&#xff09;组成的序列&#xff0c;每个位都可以单独访问和操作。 位图常用于以下情况&#xff1a; 压缩存储&…...

ArrayList LinkedList

ArrayList 和 LinkedList 区别 ArrayList和LinkedList都是Java集合框架中的实现类&#xff0c;用于存储和操作数据。它们在底层实现和性能特点上有一些区别。 数据结构&#xff1a;ArrayList底层使用数组实现&#xff0c;而LinkedList底层使用双向链表实现。这导致它们在内存结…...

iOS砸壳系列之三:Frida介绍和使用

当涉及从App Store下载应用程序时&#xff0c;它们都是已安装的iOS应用&#xff08;IPA&#xff09;存储在设备上。这些应用程序通常带有保护的代码和资源&#xff0c;以限制用户对其进行修改或者逆向工程。 然而&#xff0c;有时候&#xff0c;为了进行调试、制作插件或者学习…...

Git学习——细节补充

Git学习——细节补充 1. git diff2. git log3. git reset4. git reflog5. 提交撤销5.1 当你改乱了工作区某个文件的内容&#xff0c;想直接丢弃工作区的修改时5.2 当提交到了stage区后&#xff0c;想要退回 6. git remote7. git pull origin master --no-rebase8. 分支管理9. g…...

【设计模式】Head First 设计模式——装饰者模式 C++实现

设计模式最大的作用就是在变化和稳定中间寻找隔离点&#xff0c;然后分离它们&#xff0c;从而管理变化。将变化像小兔子一样关到笼子里&#xff0c;让它在笼子里随便跳&#xff0c;而不至于跳出来把你整个房间给污染掉。 设计思想 动态地将责任附加到对象上&#xff0c;若要扩…...

layui实现数据列表的复选框回显

layui版本2.8以上 实现效果如图&#xff1a; <input type"hidden" name"id" id"id" value"{:g_val( id,0)}"> <div id"tableDiv"><table class"layui-hide" id"table_list" lay-filter…...

关于使用RT-Thread系统读取stm32的adc无法连续转换的问题解决

关于使用RT-Thread系统读取stm32的adc无法连续转换的问题解决 今天发现rt系统的adc有一个缺陷&#xff08;也可能是我移植的方法有问题&#xff0c;这就不得而知了&#xff01;&#xff09;&#xff0c;就是只能单次转换&#xff0c;事情是这样的&#xff1a; 我在stm32的RT-T…...

【启扬方案】启扬多尺寸安卓屏一体机,助力仓储物料管理系统智能化管理

随着企业供应链管理的不断发展&#xff0c;对仓储物料管理的要求日益提高。企业需要实时追踪和管理物料的流动&#xff0c;提高物流效率、降低库存成本和减少库存的风险。因此&#xff0c;仓储物料管理系统的实现成为必要的手段。 仓储物料管理系统一体机作为一种新型的物料管理…...

Android Glide使用姿势与原理分析

作者&#xff1a; 午后一小憩 简介 Android Glide是一款强大的图片加载库&#xff0c;提供了丰富的功能和灵活的使用方式。本文将深入分析Glide的工作原理&#xff0c;并介绍一些使用姿势&#xff0c;助你更好地运用这个优秀的库。 原理分析 Glide的原理复杂而高效。它首先基…...

管理类联考——逻辑——汇总篇——知识点突破——形式逻辑——联言选言——真假

角度——真值表 以上考点均是已知命题的真假情况做出的推理,还存在一种情况是已知肢判断P、Q的真假,断定干判断的真假,这种判断过程就是运用真值表。 P ∧ Q的真值 ①如何证明P ∧ Q为假? 由于P ∧ Q的本质是P、Q同时成立,所以只要P、Q有一个为假,整个命题就为假。 ②如…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

9-Oracle 23 ai Vector Search 特性 知识准备

很多小伙伴是不是参加了 免费认证课程&#xff08;限时至2025/5/15&#xff09; Oracle AI Vector Search 1Z0-184-25考试&#xff0c;都顺利拿到certified了没。 各行各业的AI 大模型的到来&#xff0c;传统的数据库中的SQL还能不能打&#xff0c;结构化和非结构的话数据如何和…...

在Spring Boot中集成RabbitMQ的完整指南

前言 在现代微服务架构中&#xff0c;消息队列&#xff08;Message Queue&#xff09;是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个流行的消息中间件&#xff0c;支持多种消息协议&#xff0c;具有高可靠性和可扩展性。 本博客将详细介绍如何在 Spring Boot 项目…...

从数据报表到决策大脑:AI重构电商决策链条

在传统电商运营中&#xff0c;决策链条往往止步于“数据报表层”&#xff1a;BI工具整合历史数据&#xff0c;生成滞后一周甚至更久的销售分析&#xff0c;运营团队凭经验预判需求。当爆款突然断货、促销库存积压时&#xff0c;企业才惊觉标准化BI的决策时差正成为增长瓶颈。 一…...

Linux系统:进程间通信-匿名与命名管道

本节重点 匿名管道的概念与原理匿名管道的创建命名管道的概念与原理命名管道的创建两者的差异与联系命名管道实现EchoServer 一、管道 管道&#xff08;Pipe&#xff09;是一种进程间通信&#xff08;IPC, Inter-Process Communication&#xff09;机制&#xff0c;用于在不…...

TMC2226超静音步进电机驱动控制模块

目前已经使用TMC2226量产超过20K,发现在静音方面做的还是很不错。 一、TMC2226管脚定义说明 二、原理图及下载地址 一、TMC2226管脚定义说明 引脚编号类型功能OB11电机线圈 B 输出 1BRB2线圈 B 的检测电阻连接端。将检测电阻靠近该引脚连接到地。使用内部检测电阻时,将此引…...

OCC笔记:TDF_Label中有多个相同类型属性

注&#xff1a;OCCT版本&#xff1a;7.9.1 TDF_Label中有多个相同类型的属性的方案 OCAF imposes the restriction that only one attribute type may be allocated to one label. It is necessary to take into account the design of the application data tree. For exampl…...