RV64函数调用流程分析

RV64函数调用流程分析

  • 1 RV64 函数调用实例
  • 2 对应代码的分析
    • 2.1 main函数及其对应的汇编程序
      • 2.1.1 main的C代码实现
      • 2.1.2 main函数对应汇编及其分析
      • 2.1.3 执行完成之后栈的存放情况
    • 2.2 test_fun_a函数及其对应的汇编程序
      • 2.2.1 test_fun_a函数的C实现
      • 2.2.2 test_fun_a函数对应汇编及其分析
      • 2.2.3 执行完成之后栈帧的使用情况
    • 2.3 test_fun_b函数及其对应的汇编程序
      • 2.3.1 test_func_b函数的C实现
      • 2.3.2 test_fun_b函数对应汇编及其分析
      • 2.3.3 执行完成之后栈帧的使用情况
  • 3 编译和反汇编的命令
    • 3.1 编译的命令
    • 3.2 反汇编的命令

[RV64 程序调用标准]

1 RV64 函数调用实例

下图是介绍一个简单函数调用的示例,在该示例中简单介绍了栈的使用。
在这里插入图片描述

2 对应代码的分析

2.1 main函数及其对应的汇编程序

2.1.1 main的C代码实现

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.1.2 main函数对应汇编及其分析

  • 000000000000071e <main>:
  • 71e: 1101 addi sp,sp,-32为函数分配32字节的栈空间。
  • 720: ec06 sd ra,24(sp)将寄存器 ra 的值存储到当前sp + 24的栈位置。
  • 722: e822 sd s0,16(sp)将寄存器 s0(栈帧指针寄存器) 的值存储到sp+ 16的栈位置。
  • 724: 1000 addi s0,sp,32将栈指针的值加上32,并将结果存储在寄存器 s0 中,即将s0指向当前函数的栈底。
  • 726: 4785 li a5,1将局部变量a的值加载到a5寄存器中
  • 728: fef43023 sd a5,-32(s0)将局部变量a的值保存到sp偏移0的位置,(fp - 32)的栈位置
  • 72c: 4789 li a5,2将局部变量b的值加载到a5寄存器中
  • 72e: fef43423 sd a5,-24(s0)将局部变量b的值保存到sp + 8,即(fp - 24)的栈位置处。
  • 732: fe843683 ld a3,-24(s0)从栈中取出局部变量b的值,放到a3寄存器中
  • 736: fe043603 ld a2,-32(s0)从栈中取出局部变量a的值,放到a2寄存器中
  • 73a: 00000597 auipc a1,0x0
  • 73e: 15658593 addi a1,a1,342 # 890 <__func__.2104>
  • 742: 00000517 auipc a0,0x0
  • 746: 0fe50513 addi a0,a0,254 # 840 <__libc_csu_fini+0x62>这些指令用于设置 a1 和 a0 寄存器的值。通过使用 auipc 指令和相对偏移量,将一个值加载到寄存器中。
  • 74a: e07ff0ef jal ra,550 <printf@plt>跳转并链接到地址为550的函数(这里是 printf)。 jal 指令将返回地址(保存在 ra 寄存器中)。
  • 74e: 4685 li a3,1将立即数1加载到a3寄存器中,作为调用test_fun_a函数的第4个参数
  • 750: 4601 li a2,0将立即数0保存到a2寄存器中,作为调用test_fun_a函数的第3个参数
  • 752: fe843583 ld a1,-24(s0)从栈中取出局部变量b的值放到a1寄存器中,作为调用test_fun_a函数的第2个参数
  • 756: fe043503 ld a0,-32(s0)从栈中取出局部变量a的值存放到a0寄存器中,作为调用test_fun_a函数的第1个参数
  • 75a: f43ff0ef jal ra,69c <test_fun_a>将返回值保存到ra寄存器中,调用test_fun_a函数,a0 ~ a4是调用test_fun_a函数的四个参数。
  • 75e: fe043703 ld a4,-32(s0)从栈中加载局部变量b的值到a4寄存器中
  • 762: fe843783 ld a5,-24(s0)从栈中加载局部变量a的值到a5寄存器中
  • 766: 97ba add a5,a5,a4a = a + b,将计算的值保存到a5寄存器中
  • 768: fef43023 sd a5,-32(s0)将a5寄存器的值保存到局部变量a的栈位置处,即更新局部变量a的值
  • 76c: fe843703 ld a4,-24(s0)从栈中加载局部变量b的值到a4寄存器中
  • 770: fe043783 ld a5,-32(s0)从栈中加载局部变量a的值到a5寄存器中
  • 774: 97ba add a5,a5,a4将a + b的值放到a5寄存器中
  • 776: fef43423 sd a5,-24(s0)将a + b的值存储在局部变量b的栈内存中,即更新局部变量a的值
  • 77a: 4781 li a5,0加载立即数0到a5寄存器中
  • 77c: 853e mv a0,a5将a5寄存器的值复制给a0寄存器,即给a0寄存器赋值为0,a0用来保存函数的返回值
  • 77e: 60e2 ld ra,24(sp)恢复ra寄存器的值
  • 780: 6442 ld s0,16(sp)恢复s0(FP)寄存器的值
  • 782: 6105 addi sp,sp,32恢复栈
  • 784: 8082 ret返回调用main的函数中
000000000000071e <main>:
 71e:   1101                    addi    sp,sp,-32
 720:   ec06                    sd      ra,24(sp)
 722:   e822                    sd      s0,16(sp)
 724:   1000                    addi    s0,sp,32
 726:   4785                    li      a5,1
 728:   fef43023                sd      a5,-32(s0)
 72c:   4789                    li      a5,2
 72e:   fef43423                sd      a5,-24(s0)
 732:   fe843683                ld      a3,-24(s0)
 736:   fe043603                ld      a2,-32(s0)
 73a:   00000597                auipc   a1,0x0
 73e:   15658593                addi    a1,a1,342 # 890 <__func__.2104>                                                                                                                                    
 742:   00000517                auipc   a0,0x0
 746:   0fe50513                addi    a0,a0,254 # 840 <__libc_csu_fini+0x62>
 74a:   e07ff0ef                jal     ra,550 <printf@plt>
 74e:   4685                    li      a3,1
 750:   4601                    li      a2,0
 752:   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,a4
 768:   fef43023                sd      a5,-32(s0)
 76c:   fe843703                ld      a4,-24(s0)
 770:   fe043783                ld      a5,-32(s0)
 774:   97ba                    add     a5,a5,a4
 776:   fef43423                sd      a5,-24(s0)
 77a:   4781                    li      a5,0
 77c:   853e                    mv      a0,a5
 77e:   60e2                    ld      ra,24(sp)
 780:   6442                    ld      s0,16(sp)
 782:   6105                    addi    sp,sp,32
 784:   8082                    ret

2.1.3 执行完成之后栈的存放情况

在这里插入图片描述

2.2 test_fun_a函数及其对应的汇编程序

2.2.1 test_fun_a函数的C实现

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;
}

2.2.2 test_fun_a函数对应汇编及其分析

  • 000000000000069c <test_fun_a>:
  • 69c: 7139 addi sp,sp,-64为test_fun_a函数开辟一块64Byte的栈空间
  • 69e: fc06 sd ra,56(sp)将ra加载到sp + 56的栈内存中
  • 6a0: f822 sd s0,48(sp)将s0加载到sp + 48的栈内存中
  • 6a2: 0080 addi s0,sp,64将栈底保存到s0(FP)寄存器中
  • 6a4: fca43c23 sd a0,-40(s0)将第一个参数加载到fp - 40的栈内存中,即sp + 24的栈中,
  • 6a8: fcb43823 sd a1,-48(s0)将第二个参数加载到fp - 48的栈内存中,即sp + 16的栈中,
  • 6ac: fcc43423 sd a2,-56(s0)将第三个参数加载到fp - 56的栈内存中,即sp + 8的栈中,
  • 6b0: fcd43023 sd a3,-64(s0)将第四个参数加载到fp - 64的栈内存中,即sp + 0的栈中,
  • 6b4: 4789 li a5,2将局部变量b的值2加载到a5寄存器中
  • 6b6: fef43023 sd a5,-32(s0)将局部变量b的值存储到fp - 32的栈内存中,即sp + 32的栈中
  • 6ba: 478d li a5,3将局部变量c的值加载到a5寄存器中
  • 6bc: fef43423 sd a5,-24(s0)将局部变量c的值存储到fp - 24的栈内存中,即sp + 40的栈中
  • 6c0: fe843683 ld a3,-24(s0)从栈中取出局部变量c的值取出放到a3寄存器中
  • 6c4: fe043603 ld a2,-32(s0)从栈中取出局部变量b的值取出放到局部变量a2中
  • 6c8: 00000597 auipc a1,0x0
  • 6cc: 1b858593 addi a1,a1,440 # 880 <__func__.2098>
  • 6d0: 00000517 auipc a0,0x0
  • 6d4: 14050513 addi a0,a0,320 # 810 <__libc_csu_fini+0x32>
  • 6d8: e79ff0ef jal ra,550 <printf@plt>将返回值保存到ra寄存器中,调用printf
  • 6dc: 4689 li a3,2加载立即数2到a3中
  • 6de: 4601 li a2,0加载立即数0到a2中
  • 6e0: fe843583 ld a1,-24(s0)从栈fp - 24的栈中取出局部变量c的值到a1寄存器中
  • 6e4: fe043503 ld a0,-32(s0)从栈fp - 32的栈内存取出局部变量b的值到a0寄存器中
  • 6e8: f43ff0ef jal ra,62a <test_fun_b>将返回值保存到ra寄存器中,调用test_fun_b函数
  • 6ec: fe043703 ld a4,-32(s0)从fp - 32栈内存中取出局部变量b的值到a4寄存器中
  • 6f0: fe843783 ld a5,-24(s0)从fp - 24栈内存中取出局部变量c的值到a5寄存器中
  • 6f4: 97ba add a5,a5,a4 b + c将计算的值更到到a5寄存器中
  • 6f6: fd843703 ld a4,-40(s0)从fp - 40的栈中取出第一个参数m的值到a4寄存器中
  • 6fa: 97ba add a5,a5,a4 b + c + m的值保存到a5寄存器中
  • 6fc: fef43023 sd a5,-32(s0)存储b + c + m的值到局部变量b的栈内存中
  • 700: fe043703 ld a4,-32(s0)从栈中取出局部变量b的值到a4寄存器中
  • 704: fe843783 ld a5,-24(s0)从栈中取出局部变量c的值到a5寄存器中
  • 708: 97ba add a5,a5,a4b + c的值保存到a5寄存器中
  • 70a: fd043703 ld a4,-48(s0)从栈中取出第二个参数n的值到a4寄存器中
  • 70e: 97ba add a5,a5,a4 b + c + n 的值保存到a5寄存器中
  • 710: fef43423 sd a5,-24(s0)将b + c + n的值保存到局部变量c的栈内存中
  • 714: 0001 nop
  • 716: 70e2 ld ra,56(sp)从栈中恢复ra的值
  • 718: 7442 ld s0,48(sp)从栈中恢复s0(FP)的值
  • 71a: 6121 addi sp,sp,64恢复sp寄存器
  • 71c: 8082 ret返回main函数调用test_fun_a的下一条指令处。
000000000000069c <test_fun_a>:
 69c:   7139                    addi    sp,sp,-64
 69e:   fc06                    sd      ra,56(sp)
 6a0:   f822                    sd      s0,48(sp)
 6a2:   0080                    addi    s0,sp,64
 6a4:   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,2
 6b6:   fef43023                sd      a5,-32(s0)
 6ba:   478d                    li      a5,3
 6bc:   fef43423                sd      a5,-24(s0)
 6c0:   fe843683                ld      a3,-24(s0)
 6c4:   fe043603                ld      a2,-32(s0)
 6c8:   00000597                auipc   a1,0x0
 6cc:   1b858593                addi    a1,a1,440 # 880 <__func__.2098>
 6d0:   00000517                auipc   a0,0x0
 6d4:   14050513                addi    a0,a0,320 # 810 <__libc_csu_fini+0x32>
 6d8:   e79ff0ef                jal     ra,550 <printf@plt>
 6dc:   4689                    li      a3,2
 6de:   4601                    li      a2,0
 6e0:   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,a4
 6f6:   fd843703                ld      a4,-40(s0)                                                                                                                                                         
 6fa:   97ba                    add     a5,a5,a4
 6fc:   fef43023                sd      a5,-32(s0)
 700:   fe043703                ld      a4,-32(s0)
 704:   fe843783                ld      a5,-24(s0)
 708:   97ba                    add     a5,a5,a4
 70a:   fd043703                ld      a4,-48(s0)
 70e:   97ba                    add     a5,a5,a4
 710:   fef43423                sd      a5,-24(s0)
 714:   0001                    nop
 716:   70e2                    ld      ra,56(sp)
 718:   7442                    ld      s0,48(sp)
 71a:   6121                    addi    sp,sp,64
 71c:   8082                    ret

2.2.3 执行完成之后栈帧的使用情况

在这里插入图片描述

2.3 test_fun_b函数及其对应的汇编程序

2.3.1 test_func_b函数的C实现

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;
}

2.3.2 test_fun_b函数对应汇编及其分析

  • 000000000000062a <test_fun_b>:
  • 62a: 7139 addi sp,sp,-64为test_func_b开辟64Byte的栈空间
  • 62c: fc06 sd ra,56(sp)将ra保存到sp + 56栈内存中
  • 62e: f822 sd s0,48(sp)将s0(FP)保存到sp + 48栈内存中
  • 630: 0080 addi s0,sp,64将栈底的值保存到s0(FP)寄存器中
  • 632: fca43c23 sd a0,-40(s0)存储第一个参数到fp - 40栈内存中
  • 636: fcb43823 sd a1,-48(s0)存储第二个参数到fp - 48栈内存中
  • 63a: fcc43423 sd a2,-56(s0)存储第三个参数到fp - 56栈内存中
  • 63e: fcd43023 sd a3,-64(s0)存储第四个参数到fp - 64栈内存中
  • 642: 478d li a5,3加载局部变量c的值到a5寄存器中
  • 644: fef43023 sd a5,-32(s0)将局部变量c的值存储到fp - 32栈内存中
  • 648: 4791 li a5,4加载局部变量d的值到a5寄存器中
  • 64a: fef43423 sd a5,-24(s0)存储局部变量d的值到fp - 24栈内存中
  • 64e: fe843683 ld a3,-24(s0)从fp - 24的栈内存中取出局部变量d的值到a3寄存器中
  • 652: fe043603 ld a2,-32(s0)从fp - 32的栈内存中取出局部变量c的值到a2寄存器中
  • 656: 00000597 auipc a1,0x0
  • 65a: 21a58593 addi a1,a1,538 # 870 <__func__.2089>
  • 65e: 00000517 auipc a0,0x0
  • 662: 18250513 addi a0,a0,386 # 7e0 <__libc_csu_fini+0x2>
  • 666: eebff0ef jal ra,550 <printf@plt> 将返回值保存到ra寄存中其,调用printf函数
  • 66a: fe043703 ld a4,-32(s0)从栈fp - 32中取出局部变量c的值到a4寄存器中
  • 66e: fe843783 ld a5,-24(s0)从栈fp - 24中取出局部变量d的值到a5寄存器中
  • 672: 97ba add a5,a5,a4将b + c值保存到a5Jicunqi zhong
  • 674: fd843703 ld a4,-40(s0)从栈中取出第一个参数m的值到a4寄存器中
  • 678: 97ba add a5,a5,a4将b + c + m的值保存到a5寄存器中
  • 67a: fef43023 sd a5,-32(s0)存储b + c + m 的值到栈fp - 32栈内存中,即局部变量c的栈内存位置处
  • 67e: fe043703 ld a4,-32(s0)从栈中取出局部变量c的值到a4寄存器中
  • 682: fe843783 ld a5,-24(s0)从栈中取出局部变量d的值到a5寄存器中
  • 686: 97ba add a5,a5,a4
  • 688: fd043703 ld a4,-48(s0)从栈中取出第二个参数n的值到a4寄存器中
  • 68c: 97ba add a5,a5,a4将c + d + n的值到a5寄存器中
  • 68e: fef43423 sd a5,-24(s0)将c + d + n的值存储到fp - 24的栈内存中
  • 692: 0001 nop
  • 694: 70e2 ld ra,56(sp)恢复ra寄存器的值
  • 696: 7442 ld s0,48(sp)恢复s0(FP)寄存器的值
  • 698: 6121 addi sp,sp,64恢复sp寄存器的值
  • 69a: 8082 ret返回ra寄存器的地址
000000000000062a <test_fun_b>:
 62a:   7139                    addi    sp,sp,-64
 62c:   fc06                    sd      ra,56(sp)
 62e:   f822                    sd      s0,48(sp)
 630:   0080                    addi    s0,sp,64
 632:   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,3
 644:   fef43023                sd      a5,-32(s0)
 648:   4791                    li      a5,4
 64a:   fef43423                sd      a5,-24(s0)
 64e:   fe843683                ld      a3,-24(s0)                                                                                                                                                         
 652:   fe043603                ld      a2,-32(s0)
 656:   00000597                auipc   a1,0x0
 65a:   21a58593                addi    a1,a1,538 # 870 <__func__.2089>
 65e:   00000517                auipc   a0,0x0
 662:   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,a4
 674:   fd843703                ld      a4,-40(s0)
 678:   97ba                    add     a5,a5,a4
 67a:   fef43023                sd      a5,-32(s0)
 67e:   fe043703                ld      a4,-32(s0)
 682:   fe843783                ld      a5,-24(s0)
 686:   97ba                    add     a5,a5,a4
 688:   fd043703                ld      a4,-48(s0)
 68c:   97ba                    add     a5,a5,a4
 68e:   fef43423                sd      a5,-24(s0)
 692:   0001                    nop
 694:   70e2                    ld      ra,56(sp)
 696:   7442                    ld      s0,48(sp)
 698:   6121                    addi    sp,sp,64
 69a:   8082                    ret

2.3.3 执行完成之后栈帧的使用情况

在这里插入图片描述

3 编译和反汇编的命令

3.1 编译的命令

需要注意的是如果不加-Wl,--no-as-needed编译选项,则在反汇编的时候无法查看到标准库的接口,不太容易理解对应的汇编程序。

riscv64-linux-gnu-gcc -Wl,--no-as-needed main.c -o rv_test

3.2 反汇编的命令

riscv64-linux-gnu-objdump -S -d rv_test

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/96513.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

8_分类算法-k近邻算法(KNN)

文章目录 1 KNN算法1.1 KNN算法原理1.2 KNN过程1.3 KNN三要素1.4 KNN分类预测规则1.5 KNN回归预测规则1.6 KNN算法实现方式&#xff08;重点&#xff09;1.7 k近邻算法优缺点 2 KD-Tree2.1 KD Tree构建方式2.2 KD Tree查找最近邻2.3 KNN参数说明 1 KNN算法 定义&#xff1a;如…

司徒理财:8.30黄金原油今日最新行情分析及操作策略

黄金走势分析      从日线形态来看&#xff0c;昨晚经历了快速拉升&#xff0c;价格成功稳定在关键的1924压力位之上&#xff0c;最高甚至触及了1938的高点。这表明市场开启了新一轮走势的空间。在当天的日内交易中&#xff0c;我们应特别关注1925一线作为支撑&#xff0c;…

opencv 案例实战02-停车场车牌识别SVM模型训练及验证

1. 整个识别的流程图&#xff1a; 2. 车牌定位中分割流程图&#xff1a; 三、车牌识别中字符分割流程图&#xff1a; 1.准备数据集 下载车牌相关字符样本用于训练和测试&#xff0c;本文使用14个汉字样本和34个数字跟字母样本&#xff0c;每个字符样本数为40&#xff0c;样本尺…

基于Django的博客管理系统

1、克隆仓库https://gitee.com/lylinux/DjangoBlog.git 若失效&#xff1a;https://gitee.com/usutdzxy/DjangoBlog.git 2、环境安装 pip install -Ur requirements.txt3、修改djangoblog/setting.py 修改数据库配置&#xff0c;其他的步骤就按照官方文档。 DATABASES {def…

Git管理本地代码

一、Git配置 当安装完 Git 应该做的第一件事就是设置你的用户名称与邮件地址。 这样做很重要&#xff0c;因为每一个 Git 的提交都会使用这些信息&#xff0c;并且它会写入到你的每一次提交中&#xff0c;不可更改 – global全局配置 通过 --global 选项可以设置全局配置信息 …

算法笔记:球树

1 KD树的问题 算法笔记&#xff1a;KD树_UQI-LIUWJ的博客-CSDN博客 在kd树中&#xff0c;导致性能下降的最核心因素是因为kd-tree中被分割的子空间是一个个的超方体&#xff0c;而求最近邻时使用的是欧式距离&#xff08;超球&#xff09;。超方体与超球体相交的可能性是极高…

【原创】jmeter并发测试计划

bankQPS 创建线程组 设置并发参数 HTTP请求GET 添加HTTP请求 GET请求 查看结果树 HTTP请求 POST 添加HTTP请求 参数必须设置头信息格式&#xff1a; 添加HTTP头信息 查看结果树 可以选择&#xff0c;仅查看错误日志 汇总报告

【CSS】简记CSS效果:通过transition(动画过渡属性)实现侧边栏目滑入滑出

需求 在资金明细的页面中&#xff0c;点击按钮时筛选区域从左侧滑出&#xff0c;完成筛选点击确认后调用接口完成数据查询&#xff0c;筛选区域滑入左侧&#xff1b; 基于微信小程序页面实现 wxml代码 <view><!-- 操作按钮 --><button type"primary&qu…

Go测试之.golden 文件

Go测试中的.golden 文件是干什么用的&#xff1f;请举例说明 在Go语言中&#xff0c;.golden文件通常用于测试中的黄金文件&#xff08;golden files&#xff09;。黄金文件是在测试期间记录预期输出结果的文件。测试用例运行时&#xff0c;黄金文件用于比较实际输出与预期输出…

react18+antd5.x(1):Notification组件的二次封装

antdesign已经给我们提供了很好的组件使用体验&#xff0c;但是我们还需要根据自己的项目业务进行更好的封装&#xff0c;减少我们的代码量&#xff0c;提升开发体验 效果展示 开起来和官网的使用没什么区别&#xff0c;但是我们在使用的时候&#xff0c;进行了二次封装&#…

Java“牵手”1688淘口令转换API接口数据,1688API接口申请指南

1688平台商品淘口令接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取1688商品的标题、价格、库存、商品快递费用&#xff0c;宝贝ID&#xff0c;发货地&#xff0c;区域ID&#xff0c;快递费用&#xff0c;月销量、总销量、库存、详情描…

ChatGPT AIGC 一个指令总结Python所有知识点

在ChatGPT中,直接输入一个指令就可以生成Python的所有知识点大纲。 非常实用的ChatGPT功能。 AIGC ChatGPT ,BI商业智能, 可视化Tableau, PowerBI, FineReport, 数据库Mysql Oracle, Office, Python ,ETL Excel 2021 实操,函数,图表,大屏可视化 案例实战 http://t.…

【LeetCode75】第四十题 最大层内元素和

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 这道题和LeetCode75的上一题大同小异&#xff0c;都是要我们对二叉树进行层序遍历。 那具体如何层序遍历我再上一题也详细介绍过了&#…

vue2 组件库之vetur提示

当我们开发完自定义UI组件库后&#xff0c;在项目中使用时&#xff0c;想要达到以下提示效果&#xff0c;组件提示与属性提示&#xff0c;有什么解决方案呢&#xff1a; 事实上&#xff0c;这是vetur的功能&#xff0c;原文如下&#xff1a; Component Data | Vetur If a pac…

软件测试实训系统建设方案

一 、系统概述 软件测试实训系统是软件开发过程中的一项重要测试活动&#xff0c;旨在验证不同软件模块或组件之间的集成与交互是否正常。综合测试确保各个模块按照设计要求正确地协同工作&#xff0c;以实现整个软件系统的功能和性能。以下是软件测试实训系统的一般流程和步骤…

基于Jenkins自动打包并部署docker、PHP环境,ansible部署-------从小白到大神之路之学习运维第86天

第四阶段提升 时 间&#xff1a;2023年8月23日 参加人&#xff1a;全班人员 内 容&#xff1a; 基于Jenkins部署docker、PHP环境 目录 一、环境部署 &#xff08;一&#xff09;实验环境&#xff0c;服务器设置 &#xff08;二&#xff09;所有主机关闭防火墙和selinu…

揭秘:房产小程序如何助力售楼业务提升

随着移动互联网的发展&#xff0c;小程序已经成为各行各业进行营销推广的利器之一。对于房地产行业而言&#xff0c;小程序同样具有巨大的潜力。下面&#xff0c;我们将介绍如何使用乔拓云平台开发一款吸睛的房地产营销小程序。 第一步&#xff1a;注册登录乔拓云平台&#xff…

SpringBootWeb案例 Part3

目录 1. 新增员工 1.1 需求 1.2 接口文档 1.3 思路分析 PostMapping RequestBody //把前端传递的JSON数据填充到实体类中 1.4 功能开发 1.5 功能测试 1.6 前后端联调 2. 文件上传 2.1 文件上传简介 Spring中提供了一个API&#xff1a;MultipartFile&#xff0c;使…

自学设计模式(类图、设计原则、单例模式 - 饿汉/懒汉)

设计模式需要用到面向对象的三大特性——封装、继承、多态&#xff08;同名函数具有不同的状态&#xff09; UML类图 eg.—— 描述类之间的关系&#xff08;设计程序之间画类图&#xff09; : public; #: protected; -: private; 下划线: static 属性名:类型&#xff08;默认值…

【微服务部署】06-日志集成

文章目录 1. EFK日志三件套集成1.1 核心组件1.2 部署 2. Exceptionless日志系统2.1 Exceptionless核心特性2.2 Exceptionless部署文件2.3 K8s中使用Exceptionless 1. EFK日志三件套集成 1.1 核心组件 Elasticsearch&#xff08;存储&#xff09;Fluentd&#xff08;收集器&am…