第五章ARM处理器的嵌入式硬件系统设计——课后习题

news2025/1/24 14:32:26

1ARM处理器的工作状态

ARM处理器有两种工作状态。具体而言,ARM处理器执行32位ARM指令集时,工作在ARM状态,当ARM处理器执行16位thumb指令集时候,工作在thumb状态。

1ARM指令特点

1一个大的,统一的寄存器文件。

2基于load/store架构,即仅对寄存器中的数据进行计算操作,不能对内存中的数据进行计算操作。

3简单的寻址模式,即所有的加载、存储地址仅由寄存器内容和指令字段共同决定。

4统一和固定的指令字段,简化指令译码。

 文心一言解释

ARM指令体系具有以下特点:

1. 32位指令集:ARM指令集是32位指令集,即每条指令的长度为32位。
2. 哈佛结构:ARM指令体系采用哈佛结构,将程序存储器和数据存储器分开,使得指令和数据可以并行访问,提高了处理器的效率和性能。
3. 寄存器设计:ARM指令体系具有多个寄存器,这些寄存器在指令执行过程中被频繁使用,使得指令执行速度更快。
4. 加载/存储指令:ARM指令体系中的加载/存储指令可以访问内存中的数据,同时也可以对数据进行算术和逻辑运算,使得指令执行更加高效。
5. 异常处理:ARM指令体系具有完善的异常处理机制,可以在处理程序运行时发生的异常或错误时进行相应的处理,提高了系统的稳定性和安全性。
6. 优化执行效率:ARM指令体系采用了一系列优化执行效率的技术,如分支预测、高速缓存、指令级并行等,使得处理器的执行效率更高。
7. 可扩展的指令集:ARM指令体系具有可扩展的指令集,可以针对不同的应用进行优化和扩展,使得处理器的适应性和灵活性得到了进一步提升。
8. 灵活的第二操作数:ARM指令的第二操作数可以是立即数、寄存器或内存地址等,这使得ARM指令可以在读取数值的同时进行算术和移位操作。
9. 支持条件执行:ARM指令支持条件执行,即可以根据某个条件来决定是否执行某条指令,这使得程序的控制流程更加灵活和高效。
10. 支持协处理器操作:ARM指令体系可以支持协处理器操作,通过扩展协处理器完成复杂的功能,使得ARM处理器的性能得到进一步提升。

总之,ARM指令体系具有简单、高效、可扩展、灵活等特点,使得它在嵌入式系统、移动设备、物联网等领域得到了广泛的应用。

2简述ARM指令集和thumb指令集的去呗和联系,并论述两种指令集的优点与缺点

ARM指令集的优点:

1. 丰富的指令集和功能:ARM指令集具有丰富的指令集和功能,支持各种算术运算、逻辑运算、移位操作、跳转等操作。
2. 高效的执行效率:ARM指令集采用了优化执行效率的技术,如分支预测、高速缓存、指令级并行等,使得处理器的执行效率更高。
3. 可扩展的指令集:ARM指令集具有可扩展的指令集,可以针对不同的应用进行优化和扩展,使得处理器的适应性和灵活性得到了进一步提升。
4. 支持条件执行:ARM指令支持条件执行,可以根据指定条件决定是否执行指令,提高了代码的灵活性和执行效率。

ARM指令集的缺点:

1. 指令长度较长:ARM指令集的指令长度较长,每条指令包含多个字段,导致指令存储空间和内存带宽消耗较大。
2. 不适合所有应用程序:由于ARM指令集相对复杂,对于一些简单的应用程序来说,使用ARM指令集可能会增加代码的复杂度和长度。

Thumb指令集的优点:

1. 紧凑的指令长度:Thumb指令集采用16位的指令长度,相较于ARM指令集,Thumb指令集更加紧凑,减少了指令的存储空间和内存带宽消耗。
2. 适合资源受限的嵌入式系统:由于Thumb指令集的短小精悍,适合在资源受限的嵌入式系统和移动设备上使用,可以减少CPU的功耗和存储需求。
3. 支持典型的程序操作:Thumb指令集提供了典型应用程序所需的大部分功能,如算术和逻辑操作、加载/存储数据移动、以及条件和无条件的分支跳转等。

Thumb指令集的缺点:

1. 功能相对较弱:相较于ARM指令集,Thumb指令集的功能相对较弱,一些高级功能可能无法直接通过Thumb指令集实现。
2. 执行效率可能较低:由于Thumb指令集的短小精悍,一些操作可能需要多条指令才能完成,相对于ARM指令集可能会降低执行效率。

综上所述,ARM指令集和Thumb指令集各有优缺点,应根据具体应用场景选择合适的指令集。ARM指令集适用于需要复杂计算和数据处理的任务,而Thumb指令集适用于需要紧凑代码和低功耗的应用。

3简述ARM指令说明的分类和功能,并且举例

 ARM指令集可以分为5个大类,数据处理指令,分支跳转指令,存储器访问指令,协处理器指令,杂类指令。

ARM指令集可以分为以下几类:

  1. 跳转指令:用于实现程序分支转移,有两种方法,一种是使用跳转指令,另外一种是直接向PC寄存器中写入目标地址。
  2. Load/Store指令:用于在存储器和处理器之间传输数据。Load指令用于把内存中的数据装载到寄存器,而Store指令用于把寄存器中的数据存入内存。ARM共有3种类型的Load/Store指令:单寄存器传输指令、多寄存器传输指令和交换指令。
  3. 程序状态寄存器指令:这类指令包括MRS和MSR两条,分别用于保存和加载程序状态寄存器。
  4. 协处理指令:ARM处理器的协处理器操作指令为CDP,通常与协处理编号CP#一致的协处理器将接受此指令,并执行操作。
  5. 异常中断指令:SWI是软件中断指令用于产生SW1异常中断,以实现在用户模式下调用操作系统的监控功能程序(Supervisor Function)。
  6. 其他指令:例如分支预测、高速缓存、指令级并行等优化执行效率的技术。

举例来说,以下是一些ARM指令及其功能的示例:

  1. LDMFD SP!,{R0, R1, R2}:这条指令将内存中堆栈内的数据批量赋值给寄存器,实际应用中寻址方式灵活多样,使用方式可参考LDR指令。
  2. STRB指令:用于从源寄存器中将一个8位的字节数据传送到存储器中,该字节数据为源寄存器中的低8位。

4ARM处理器支持的数据类型有哪些,字对齐和半字对齐的内涵

ARM处理器主要支持以下数据类型:

  1. 32位数据(字):在ARM中,将32位的数据称为“字”。
  2. 16位数据(半字):16位的数据在ARM中被称为“半字”。

关于字对齐和半字对齐:

  1. 字对齐:存储器中相邻的两个字节单元,且首字节地址能被4整除,这样存储的32位数据称为“字对齐”存储数据。在ARM体系中,要求32位的ARM指令在存储器中必须字对齐存储。
  2. 半字对齐:存储器中相邻的两个字节单元,且首字节地址能被2整除,这样存储的16位数据称为“半字对齐”存储数据。在ARM体系中,要求16位的Thumb指令必须半字对齐存储。

5在Load/store指令寻址中,试分析字,无符号字节的LOAD/store指令寻址和半字,有符号字节寻址之间的差别

在ARM处理器的Load/Store指令中,字(Word)和半字(Half Word)的寻址方式有所不同,而无符号字节(Unsigned Byte)和有符号字节(Signed Byte)的寻址也有所差异。以下是它们之间的主要差别:

  1. 字和无符号字节的Load/Store指令寻址:

    • 字:一条32位指令(或字),将32位(4字节)数据从内存中读取到寄存器中。对于字寻址,处理器会从内存地址开始处读取4个字节,并将其存储到目标寄存器中。例如,从内存地址0x12345678读取一个字到寄存器r0,指令为LDR r0, [0x12345678]
    • 无符号字节:一条8位(1字节)的Load/Store指令,用于从内存中读取或存储8位(1字节)的无符号整数。处理器会将8位数据从内存地址读取到寄存器中,或者将8位数据从寄存器存储到内存地址中。例如,从内存地址0x12345678读取一个无符号字节到寄存器r0,指令为LDRB r0, [0x12345678]
  2. 半字和有符号字节的Load/Store指令寻址:

    • 半字:一条16位指令(或半字),将16位(2字节)数据从内存中读取到寄存器中。对于半字寻址,处理器会从内存地址开始处读取2个字节,并将其存储到目标寄存器中。例如,从内存地址0x12345678读取一个半字到寄存器r0,指令为LDRH r0, [0x12345678]
    • 有符号字节:一条8位(1字节)的Load/Store指令,用于从内存中读取或存储8位(1字节)的有符号整数。与无符号字节类似,处理器会将8位数据从内存地址读取到寄存器中,或者将8位数据从寄存器存储到内存地址中。但是,有符号字节寻址的指令通常会特别指出,以区别于无符号字节的Load/Store指令。例如,从内存地址0x12345678读取一个有符号字节到寄存器r0,指令可能为LDRSB r0, [0x12345678]

     6.如何实现两个64位数的加法和减法操作?如何求一个64位数的负数?

在ARM体系中,可以使用以下方法实现两个64位数的加法和减法操作,以及求一个64位数的负数:

  1. 两个64位数的加法操作:

使用ARM的ADD指令可以实现两个32位数的加法操作,因此可以将64位数拆分成两个32位数,分别进行加法操作,然后再将结果合并起来。

例如,假设有两个64位数A和B,可以将其拆分成高32位A_hi和低32位A_lo,以及高32位B_hi和低32位B_lo。然后使用ADD指令将A_lo和B_lo相加,将结果存储到C_lo中,再将A_hi和B_hi相加,将结果存储到C_hi中。最后将C_lo和C_hi拼接起来就得到了64位数C。

  1. 两个64位数的减法操作:

使用ARM的SUB指令可以实现两个32位数的减法操作,因此可以将64位数拆分成两个32位数,分别进行减法操作,然后再将结果合并起来。

例如,假设有两个64位数A和B,可以将其拆分成高32位A_hi和低32位A_lo,以及高32位B_hi和低32位B_lo。然后使用SUB指令将A_lo和B_lo相减,将结果存储到C_lo中,再将A_hi和B_hi相减,将结果存储到C_hi中。最后将C_lo和C_hi拼接起来就得到了64位数C。

  1. 求一个64位数的负数:

在ARM体系中,可以使用NEG指令来实现一个32数的负数操作。因此可以将64位数拆分成两个32位数,分别进行负数操作,然后再将结果合并起来。

例如,假设有一个64位数A,可以将其拆分成高32位A_hi和低32位A_lo。然后使用NEG指令将A_lo取负数,将结果存储到B_lo中,再将A_hi取负数,将结果存储到B_hi中。最后将B_lo和B_hi拼接起来就得到了64位数B。

7CPSR的条件标志位如何受指令执行的影响

CPSR(程序状态寄存器)是ARM处理器中存储关键的程序状态信息的地方,包括条件标志位、中断禁止位、线程/模式位等。

条件标志位是CPSR的其中一个部分,它由以下四个条件标志位组成:

  1. N(Negative):这是符号位,当执行算术运算时,该位会根据结果的符号来设置。如果结果是负数,该位为1;如果结果是正数或零,该位为0。
  2. Z(Zero):这是零标志位,当结果是零时,该位会被设置为1。
  3. C(Carry):这是进位标志位,当进行加法或减法运算时,如果产生进位,该位会被设置为1。
  4. V(Overflow):这是溢出标志位,当进行有符号整数运算时,如果结果溢出,该位会被设置为1。

指令的执行如何影响CPSR的条件标志位主要取决于该指令的语义。对于算术运算指令(如ADD、SUB等),这些指令会根据结果的符号、零、进位或溢出情况来设置CPSR的条件标志位。例如,如果执行一个ADD指令,并且结果为正数,那么CPSR的N标志位将被设置为0,而Z标志位将被设置为1。如果执行一个SUB指令并且结果为负数,CPSR的N标志位将被设置为1。

需要注意的是,有些指令可能会直接修改CPSR的值,包括条件标志位。例如,在ARM指令集中,有专门的SETEND指令可以设置CPSR的E标志位(表示端序),以及MOV指令可以设置CPSR的其他标志位。因此,在理解特定指令如何影响CPSR的条件标志位时,需要参考具体的指令集文档和ARM架构文档。

8ARM指令系统中支持几种常见的寻址方式,试着举例说明

ARM指令系统中支持多种寻址方式,以下是其中几种常见的寻址方式:

  1. 立即寻址:在这种寻址方式中,指令中的操作数是直接给出的,例如:ADD R1, R2, #10。这条指令将把10加到R2的值上,结果存储在R1中。
  2. 寄存器寻址:在这种寻址方式中,操作数是寄存器中的值,例如:ADD R1, R2, R3。这条指令将把R3的值加到R2的值上,结果存储在R1中。
  3. 寄存器间接寻址:在这种寻址方式中,操作数是寄存器中的地址,例如:LDR R1, [R2]。这条指令将把R2指向的内存地址中的值加载到R1中。
  4. 基址寻址:在这种寻址方式中,操作数是某个基址寄存器加上一个偏移量,例如:LDR R1, [R2, #10]。这条指令将把R2指向的内存地址偏移10个字节后的值加载到R1中。
  5. 多重寄存器寻址:在这种寻址方式中,操作数是多个寄存器中的值的组合,例如:ADD R1, R2, R3, LSR #2。这条指令将把R2的值与R3的值逻辑右移两位后相加,结果存储在R1中。
  6. 堆栈寻址:在这种寻址方式中,操作数是堆栈中的值,例如:PUSH {R4, R5}。这条指令将把R4和R5的值推入堆栈中。

这些寻址方式可以组合使用以实现更复杂的操作。

9什么是伪指令?什么是伪操作?

伪指令和伪操作都是汇编语言中的概念。

伪指令是一种告诉汇编程序如何进行汇编的指令,它不控制机器的操作也不被汇编成机器代码,只能为汇编程序所识别并指导汇编如何进行。例如,伪指令用于定义数据、定义程序模式、分配存储区、指示程序结束等功能。

伪操作也称为伪指令,是用于对源程序汇编期间由汇编程序处理的操作。例如,伪指令可以将相对于程序或相对于寄存器的地址载入寄存器中。

总的来说,伪指令和伪操作都是为了辅助汇编程序的编写和编译,它们在程序运行期间不会被执行。

10哪些指令可以实现ARM状态和Thumb状态的切换,试着举例说明?

  1. 在ARM状态(也称为32位状态)下,程序代码以32位(4字节)的形式存储。而在Thumb状态(也称为16位状态)下,程序代码以16位(2字节)的形式存储,因此可以在更少的存储空间内存储更多的代码。但是,需要注意的是,并非所有的ARM指令都可以在Thumb状态下执行。

  2. 用于切换ARM状态和Thumb状态的指令主要有以下两种:

    • MSR(Move to Special Register)指令:该指令可以将特定的值写入到某个特殊寄存器中,从而改变处理器的状态。例如,使用MSR指令将控制寄存器(Control Register)的位20设置为1,可以将处理器从ARM状态切换到Thumb状态。同样,将控制寄存器的位20设置为0可以将处理器从Thumb状态切换回ARM状态。
    • HVC(Hypervisor Call)指令:该指令可以用于在运行时从用户空间切换到操作系统的内核空间执行代码。在某些情况下,操作系统可以使用HVC指令来切换处理器的状态,例如从ARM状态切换到Thumb状态,以便在内核空间中执行更少的代码。需要注意的是,HVC指令的使用需要特定的操作系统支持。
    • 在ARM状态(也称为32位状态)下,程序代码以32位(4字节)的形式存储。而在Thumb状态(也称为16位状态)下,程序代码以16位(2字节)的形式存储,因此可以在更少的存储空间内存储更多的代码。但是,需要注意的是,并非所有的ARM指令都可以在Thumb状态下执行。

    • 用于切换ARM状态和Thumb状态的指令主要有以下两种:

      • MSR(Move to Special Register)指令:该指令可以将特定的值写入到某个特殊寄存器中,从而改变处理器的状态。例如,使用MSR指令将控制寄存器(Control Register)的位20设置为1,可以将处理器从ARM状态切换到Thumb状态。同样,将控制寄存器的位20设置为0可以将处理器从Thumb状态切换回ARM状态。
      • HVC(Hypervisor Call)指令:该指令可以用于在运行时从用户空间切换到操作系统的内核空间执行代码。在某些情况下,操作系统可以使用HVC指令来切换处理器的状态,例如从ARM状态切换到Thumb状态,以便在内核空间中执行更少的代码。需要注意的是,HVC指令的使用需要特定的操作系统支持。
      • 在ARM状态(也称为32位状态)下,程序代码以32位(4字节)的形式存储。而在Thumb状态(也称为16位状态)下,程序代码以16位(2字节)的形式存储,因此可以在更少的存储空间内存储更多的代码。但是,需要注意的是,并非所有的ARM指令都可以在Thumb状态下执行。

      • 用于切换ARM状态和Thumb状态的指令主要有以下两种:

        • MSR(Move to Special Register)指令:该指令可以将特定的值写入到某个特殊寄存器中,从而改变处理器的状态。例如,使用MSR指令将控制寄存器(Control Register)的位20设置为1,可以将处理器从ARM状态切换到Thumb状态。同样,将控制寄存器的位20设置为0可以将处理器从Thumb状态切换回ARM状态。
        • HVC(Hypervisor Call)指令:该指令可以用于在运行时从用户空间切换到操作系统的内核空间执行代码。在某些情况下,操作系统可以使用HVC指令来切换处理器的状态,例如从ARM状态切换到Thumb状态,以便在内核空间中执行更少的代码。需要注意的是,HVC指令的使用需要特定的操作系统支持
MSR control, #0x200000 // 将控制寄存器的位20设置为0,进入ARM状态  
// 执行一些ARM指令...  
MSR control, #0x200001 // 将控制寄存器的位20设置为1,进入Thumb状态  
// 执行一些Thumb指令...  
MSR control, #0x200000 // 将控制寄存器的位20设置为0,回到ARM状态  
// 执行一些ARM指令...

11 ARM指令支持哪些移位操作

ARM指令集支持以下移位操作:

  1. 逻辑左移(LSL):将一个值向左移动指定的位数,并在右侧用零填充。
  2. 逻辑右移(LSR):将一个值向右移动指定的位数,并在左侧用零填充。
  3. 算术左移(ASL):将一个值向左移动指定的位数,并在右侧用符号位填充。
  4. 算术右移(ASR):将一个值向右移动指定的位数,并在左侧用符号位填充。
  5. 循环左移(ROL):将一个值向左循环移动指定的位数,并在右侧用零填充。
  6. 循环右移(ROR):将一个值向右循环移动指定的位数,并在左侧用零填充。

这些移位操作可以使用ARM指令集中的MOV和SHIFT指令来实现。具体使用哪种指令取决于操作数的位数和移位的类型。

12ARM数据处理指令中的合法立即数应该满足什么要求?

在ARM数据处理指令中,合法立即数需要满足以下要求:

  1. 立即数必须以“#”为前缀。
  2. 对于以十六进制表示的立即数,还要求在“#”后加上“0x”或“&”。
  3. 立即数必须是对应8位位图格式,即立即数是由一个8bit的常数在16位或32位的寄存器中循环移动(向左或向右都行)偶数位得到的。
  4. 合法的立即数必须能够找到得到它的那个常数,否则这个立即数就是非法的。

13小端存储和大端存储的内涵

小端存储和大端存储是两种不同的字节序规则,用于在计算机中存储和表示多字节数据类型(例如整数)。

小端存储(Little Endian):数据的低位存储在内存的低位置,数据的高位存储在内存的高位置。其优点在于读取和写入单个字节时的操作比较简单。大部分计算机和处理器都采用小端存储,例如x86架构的计算机。

大端存储(Big Endian):内存的低位置存储于内存的高位置,数据的高位存储在内存的低位置。在网络通信中,由于网络协议通常要求以大端序传输数据,因此大端存储比较常用。一些处理器(如PowerPC架构)则使用大端存储。

在实际应用中,程序员通常不需要直接关心字节序问题,因为编译器和底层库已经处理了字节序的转换。只有在与底层交互、网络通信或者需要直接操作二进制数据时,才需要考虑字节序的问题。

14存储器从0x5000开始的100个单元存放ASCII码,编写程序,将其所有的小写字母转换成大写字母,对其他的ASCII码不做变换 

AREA    |.data|, DATA, READONLY  
        .long   0x5000  
        .text  
        .global main  
main:  
        mov     r0, #0x5000        // 存储器地址  
        mov     r1, #100           // 单元数  
        mov     r2, #0             // 计数器初始值  
next:  
        ldr     r3, [r0, r2, lsl #2]  // 读取存储器中的值  
        cmp     r3, #'a'           // 比较是否为小写字母  
        blt     next               // 如果是小写字母则跳到下一个单元  
        cmp     r3, #'z'           // 比较是否为小写字母的最后一个  
        bgt     next               // 如果不是小写字母则跳到下一个单元  
        sub     r3, r3, #32         // 将小写字母转换成大写字母  
        str     r3, [r0, r2, lsl #2]  // 将转换后的值存回存储器中  
        add     r2, r2, #1          // 计数器加1  
        b       next               // 跳到下一个单元

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

后端接口性能优化分析-数据库优化

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring源码、JUC源码🔥如果感觉博主的文章还不错的话,请👍三连支持&…

​如何解决SSD NAND Path冲突导致的性能问题?

1.引言 最近看到一篇关于SSD的NAND并发瓶颈相关的论文,思路非常好,这里分享给大家。本篇论文的解读,也是小编上周末在高铁上完成的。存储随笔的论文解读,不是直接翻译,是小编先研读一遍后,再结合自己的理解…

SoftwareTest6 - 用 Selenium 怎么点点点

用 Selenium 来点点点 一 . 什么是自动化 ?1.1 自动化测试的分类接口自动化测试UI 自动化测试 (界面测试) 1.2 实现自动化测试的工具 : selenium环境部署驱动 二 . selenium 的使用2.1 一个简单的示例 : 让谷歌浏览器在百度首页搜索蔡徐坤准备工作编写代码 2.2 打开谷歌浏览器…

世界互联网大会|美创科技新一代 灾备一体化平台(DRCC v3.0)重磅亮相

11月9日,在2023年世界互联网大会“互联网之光”博览会上,美创科技携2023年重磅新品——新一代 灾备一体化平台(DRCC v3.0)亮相! ◼︎ 云计算、国产化浪潮下,各类信息基础设施的运行安全面临全新挑战&#…

性能测试 —— Jmeter分布式测试的注意事项和常见问题

Jmeter是一款开源的性能测试工具,使用Jmeter进行分布式测试时,也需要注意一些细节和问题,否则可能会影响测试结果的准确性和可靠性。 Jmeter分布式测试时需要特别注意的几个方面 1. 参数化文件的位置和内容 如果使用csv文件进行参数化&…

【Java 进阶篇】JQuery 案例:优雅的隔行换色

在前端的设计中,页面的美观性是至关重要的。而其中一个简单而实用的设计技巧就是隔行换色。通过巧妙地使用 JQuery,我们可以轻松地实现这一效果,为网页增添一份优雅。本篇博客将详细解析 JQuery 隔行换色的实现原理和应用场景,让我…

数据结构入门————栈和队列(C语言/零基础/小白/新手+模拟实现+例题讲解)

目录 1.栈的概念 ​编辑 2.栈的作用 1.函数递归 2.表达式求值 3.栈的模拟实现 Stack.h Stack.c 4.队列的概念 5.队列的模拟实现 Queue.h Queue.c 6.例题 1.一个栈的初始状态为空。现将元素1、2、3、4、5、A、B、C、D、E依次入栈,然后再依次出栈,…

如何把小米路由器刷入OpenWRT系统并通过内网穿透工具实现公网远程访问

小米路由器4A千兆版刷入OpenWRT并远程访问 文章目录 小米路由器4A千兆版刷入OpenWRT并远程访问前言1. 安装Python和需要的库2. 使用 OpenWRTInvasion 破解路由器3. 备份当前分区并刷入新的Breed4. 安装cpolar内网穿透4.1 注册账号4.2 下载cpolar客户端4.3 登录cpolar web ui管理…

LeetCode | 225. 用队列实现栈

LeetCode | 225. 用队列实现栈 OJ链接 此题可以用两个队列去实现一个栈,每次始终保持一个队列为空, 入栈操作相当于给非空队列进行入队操作 入数据,把不为空的队列入 出数据,把不为空的队列数据导入为空,直到最后一…

如何将微软 Office 宏转换为 ONLYOFFICE 宏

想要将微软 Office VBA 宏转换为可在 ONLYOFFICE 中无缝使用的宏?嗯,虽然这种需求并没有直接的解决方案,不过我们也会在本文中介绍 VBA 宏的转换步骤——正好我们手上也有一个来自用户的实际案例可供参考。 VBA 宏 以下是原始的 VBA 宏代码&…

vscode+python开发之虚拟环境和解释器切换

需求情景: 现在我们要开发多个项目比如:项目A,项目B、项目C,他们每个项目需要依赖不同的库。每个项目依赖的解释器也不一样怎么办? 项目A:需要在python3.7环境运行 依赖aadd3.2库 项目B、需要在python3.11…

〖大前端 - 基础入门三大核心之JS篇㉟〗- JavaScript 的DOM简介

说明:该文属于 大前端全栈架构白宝书专栏,目前阶段免费,如需要项目实战或者是体系化资源,文末名片加V!作者:不渴望力量的哈士奇(哈哥),十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

No207.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

【Python】爬虫代理IP的使用+建立代理IP池

目录 前言 一、代理IP 1. 代理IP的获取 2. 代理IP的验证 3. 代理IP的使用 二、建立代理IP池 1. 代理IP池的建立 2. 动态维护代理IP池 三、完整代码 总结 前言 在进行网络爬虫开发时,我们很容易遭遇反爬虫机制的阻碍。为了规避反爬虫机制,我们…

R语言爬虫程序自动爬取图片并下载

R语言本身并不适合用来爬取数据,它更适合进行统计分析和数据可视化。而Python的requests,BeautifulSoup,Scrapy等库则更适合用来爬取网页数据。如果你想要在R中获取网页内容,你可以使用rvest包。 以下是一个简单的使用rvest包爬取…

tensorflow 1.15 gpu docker环境搭建;Nvidia Docker容器基于TensorFlow1.15测试GPU;——全流程应用指南

前言: TensorFlow简介 TensorFlow 在新款 NVIDIA Pascal GPU 上的运行速度可提升高达 50%,并且能够顺利跨 GPU 进行扩展。 如今,训练模型的时间可以从几天缩短到几小时 TensorFlow 使用优化的 C 和 NVIDIA CUDA 工具包编写,使模型能够在训练…

20231114在HP笔记本的ubuntu20.04系统下向RealmeQ手机发送PDF文件

20231114在HP笔记本的ubuntu20.04系统下向RealmeQ手机发送PDF文件 2023/11/14 14:11 手机:Realme Q 笔记本电脑:HP https://item.jd.com/100012583174.html 惠普(HP)战66 三代AMD版 14英寸轻薄笔记本电脑(锐龙7nm 六核…

旺店通·企业版对接打通金蝶云星空查询调拨单接口与分布式调入单新增接口

旺店通企业版对接打通金蝶云星空查询调拨单接口与分布式调入单新增接口 源系统:旺店通企业版 旺店通是北京掌上先机网络科技有限公司旗下品牌,国内的零售云服务提供商,基于云计算SaaS服务模式,以体系化解决方案,助力零售企业数字化…

Qt QWebEngine 加载网页及交互,实现C++与JS 相互调用

目录 前言1、QtWebEngine介绍2、安装3、核心类介绍3.1 QWebEngineView3.2 QWebEnginePage3.3 QWebEngineProfile3.4 QWebEngineHistory3.5 QWebEngineSettings 4、加载网页5、C调用JS5.1 无返回值5.2 有返回值 6、JS调用C6.1 新建WebObject 类继承自QObject。6.2 将WebObject对…

前端入门(二)js速成与vue脚手架搭建

文章目录 JS常用API操作对象操作对象增删改查js深拷贝、浅拷贝js实现深拷贝的方式 安全访问 JS常用API操作 对象操作 对象增删改查 创建对象 let obj {}新增属性 obj.a 1 、obj[a] 1修改属性 obj.a ‘a’查询属性 obj.a 、obj[a]删除属性 delete obj.a js深拷贝、浅拷贝…