CPU体系架构-ARM/MIPS/X86

2023-11-20

转自:

http://nieyong.github.io/wiki_cpu/

 

CPU体系架构-ARM/MIPS/X86

第一部分:从寄存器、寻址方式、汇编指令等方面总结了ARM/MIPS/X86的异同

第二部分:分析了和CPU关系最近的几个硬件模块,依次是存储管理模型、Cache、MMU和DMA

第三部分:

操作系统-任务调度/内存管理/文件系统/IO系统/协议栈

第一部分:操作系统5大系统的基本概念

参考书籍

  1. 《程序员的自我修养-链接、装载与库》 俞甲子等著
  2. 《微机系统原理与接口技术》 李广军等主编
  3. 《ARM嵌入式系统开发-软件设计与优化》 Andrew N.Sloss等著 沈建华 译
  4. 《See MIPS Run》 Dominic Sweetman著
  5. 《VxWorks设备驱动开发详解》 曹桂平等著
  6. 《大话处理器》 杨万木
  7. 《嵌入式系统linux内核开发实战指南:ARM平台》 王洪辉 著
  8. 《Linux设备驱动程序》 Jonathan Corbet等著 魏永明等译

网络资料

  1. 《ARM与X86》 弯曲评论 王齐著
  2. 《The MIPS Cache Architecture》 comcat 著
  3. 《MIPS异常和中断处理机制研究v1.0.pdf》沈浩 著
  4. 《讲解MMU的好文章.doc》 网络资料
  5. 《arm920t的mmu和cache.pdf》 亚嵌教育
  6. 《Cache Memory》 弯曲评论 王齐等注

 

 

CPU体系架构-函数调用实例

 

在看过了上面的几节之后,在潜意识中你想记住的东西肯定很多了。这个时候,你需要静下心来休息一下在沉淀一下。

"Now is a good point to take a break to let this information sink in."

下面,我们就看看C语言撰写的程序,在不同的CPU架构下,生成的汇编语言是怎么样的,各有什么特点,这和前面介绍的各种CPU架构的知识是如何联系的。如果你觉得还不够,也很高兴一起来探讨一下在不同的CPU架构下,函数的调用时如何实现的,以及各有什么特点。

反汇编文件

测试用的C源码如下,main.c文件:

  1. #include <stdio.h>  
  2.   
  3. int add(int a,int b)  
  4. {  
  5.     return a+b;  
  6. }  
  7.   
  8.   
  9. int main(int argc,char** argv)  
  10. {  
  11.     int a,b,c;  
  12.   
  13.     a = 1;  
  14.     b = 2;  
  15.   
  16.     c = fn(a,b);  
  17.   
  18.     return c;  
  19. }  
#include <stdio.h>

int add(int a,int b)
{
    return a+b;
}


int main(int argc,char** argv)
{
    int a,b,c;

    a = 1;
    b = 2;

    c = fn(a,b);

    return c;
}

 

下面为编译以及反汇编的过程。当然,ARM和MIPS的编译和反汇编是使用的交叉编译工具链。例如在我的平台下,对应的命令就是ccarm,objdumparm和ccmips,objdumpmips。

#gcc -o main.o -c main.c
#objdump -d main.o>main.a

编译成x86下面的main.o文件,注意,没有链接。然后反汇编为main_x86.a如下所示。这里需要指出的是,下面的汇编语言并不是我们在《微机原理》课本上学习到的x86的汇编(我们称为intel汇编),而叫做AT&T汇编。那么,什么是AT&T汇编呢?

在将Unix移植到80386处理器上时,Unix圈内人士根据Unix领域的习惯和需要而定义了AT&T汇编。而GNU主要是在Unix领域活动,因此GNU开发的各种系统工具继承了AT&T的386汇编格式,这也是我们使用GNU工具进行反汇编的时候,看到的汇编语言。 
  1. main.o:     file format elf32-i386  
  2.   
  3.   
  4. Disassembly of section .text:  
  5.   
  6. 00000000 <add>:  
  7.    0:   55                      push   %ebp  
  8.    1:   89 e5                   mov    %esp,%ebp  
  9.    3:   8b 55 0c                mov    0xc(%ebp),%edx  
  10.    6:   8b 45 08                mov    0x8(%ebp),%eax  
  11.    9:   01 d0                   add    %edx,%eax  
  12.    b:   5d                      pop    %ebp  
  13.    c:   c3                      ret      
  14.   
  15. 0000000d <main>:  
  16.    d:   8d 4c 24 04             lea    0x4(%esp),%ecx  
  17.   11:   83 e4 f0                and    $0xfffffff0,%esp  
  18.   14:   ff 71 fc                pushl  -0x4(%ecx)  
  19.   17:   55                      push   %ebp  
  20.   18:   89 e5                   mov    %esp,%ebp  
  21.   1a:   51                      push   %ecx  
  22.   1b:   83 ec 24                sub    $0x24,%esp  
  23.   1e:   c7 45 f0 01 00 00 00    movl   $0x1,-0x10(%ebp)  
  24.   25:   c7 45 f4 02 00 00 00    movl   $0x2,-0xc(%ebp)  
  25.   2c:   8b 45 f4                mov    -0xc(%ebp),%eax  
  26.   2f:   89 44 24 04             mov    %eax,0x4(%esp)  
  27.   33:   8b 45 f0                mov    -0x10(%ebp),%eax  
  28.   36:   89 04 24                mov    %eax,(%esp)  
  29.   39:   e8 fc ff ff ff          call   3a <main+0x2d>  
  30.   3e:   89 45 f8                mov    %eax,-0x8(%ebp)  
  31.   41:   8b 45 f8                mov    -0x8(%ebp),%eax  
  32.   44:   83 c4 24                add    $0x24,%esp  
  33.   47:   59                      pop    %ecx  
  34.   48:   5d                      pop    %ebp  
  35.   49:   8d 61 fc                lea    -0x4(%ecx),%esp  
  36.   4c:   c3                      ret      
main.o:     file format elf32-i386


Disassembly of section .text:

00000000 <add>:
   0:	55                   	push   %ebp
   1:	89 e5                	mov    %esp,%ebp
   3:	8b 55 0c             	mov    0xc(%ebp),%edx
   6:	8b 45 08             	mov    0x8(%ebp),%eax
   9:	01 d0                	add    %edx,%eax
   b:	5d                   	pop    %ebp
   c:	c3                   	ret    

0000000d <main>:
   d:	8d 4c 24 04          	lea    0x4(%esp),%ecx
  11:	83 e4 f0             	and    $0xfffffff0,%esp
  14:	ff 71 fc             	pushl  -0x4(%ecx)
  17:	55                   	push   %ebp
  18:	89 e5                	mov    %esp,%ebp
  1a:	51                   	push   %ecx
  1b:	83 ec 24             	sub    $0x24,%esp
  1e:	c7 45 f0 01 00 00 00 	movl   $0x1,-0x10(%ebp)
  25:	c7 45 f4 02 00 00 00 	movl   $0x2,-0xc(%ebp)
  2c:	8b 45 f4             	mov    -0xc(%ebp),%eax
  2f:	89 44 24 04          	mov    %eax,0x4(%esp)
  33:	8b 45 f0             	mov    -0x10(%ebp),%eax
  36:	89 04 24             	mov    %eax,(%esp)
  39:	e8 fc ff ff ff       	call   3a <main+0x2d>
  3e:	89 45 f8             	mov    %eax,-0x8(%ebp)
  41:	8b 45 f8             	mov    -0x8(%ebp),%eax
  44:	83 c4 24             	add    $0x24,%esp
  47:	59                   	pop    %ecx
  48:	5d                   	pop    %ebp
  49:	8d 61 fc             	lea    -0x4(%ecx),%esp
  4c:	c3                   	ret    

 

编译成mips下面的main.o文件,没有链接。然后反汇编为main_mips.a:

  1. main.o:     file format elf32-bigmips  
  2.   
  3. Disassembly of section .text:  
  4.   
  5. 0000000000000000 <add>:  
  6.    0:   27bdfff8    addiu   $sp,$sp,-8  
  7.    4:   afbe0000    sw  $s8,0($sp)  
  8.    8:   03a0f021    move    $s8,$sp  
  9.    c:   afc40008    sw  $a0,8($s8)  
  10.   10:   afc5000c    sw  $a1,12($s8)  
  11.   14:   8fc20008    lw  $v0,8($s8)  
  12.   18:   8fc3000c    lw  $v1,12($s8)  
  13.   1c:   00000000    nop  
  14.   20:   00431021    addu    $v0,$v0,$v1  
  15.   24:   03c0e821    move    $sp,$s8  
  16.   28:   8fbe0000    lw  $s8,0($sp)  
  17.   2c:   03e00008    jr  $ra  
  18.   30:   27bd0008    addiu   $sp,$sp,8  
  19.   
  20. 0000000000000034 <main>:  
  21.   34:   27bdffd8    addiu   $sp,$sp,-40  
  22.   38:   afbf0024    sw  $ra,36($sp)  
  23.   3c:   afbe0020    sw  $s8,32($sp)  
  24.   40:   03a0f021    move    $s8,$sp  
  25.   44:   afc40028    sw  $a0,40($s8)  
  26.   48:   afc5002c    sw  $a1,44($s8)  
  27.   4c:   24020001    li  $v0,1  
  28.   50:   afc20010    sw  $v0,16($s8)  
  29.   54:   24020002    li  $v0,2  
  30.   58:   afc20014    sw  $v0,20($s8)  
  31.   5c:   8fc40010    lw  $a0,16($s8)  
  32.   60:   8fc50014    lw  $a1,20($s8)  
  33.   64:   0c000000    jal 0 <add>  
  34.   68:   00000000    nop  
  35.   6c:   afc20018    sw  $v0,24($s8)  
  36.   70:   8fc20018    lw  $v0,24($s8)  
  37.   74:   03c0e821    move    $sp,$s8  
  38.   78:   8fbf0024    lw  $ra,36($sp)  
  39.   7c:   8fbe0020    lw  $s8,32($sp)  
  40.   80:   03e00008    jr  $ra  
  41.   84:   27bd0028    addiu   $sp,$sp,40  
  42.     ...  
main.o:     file format elf32-bigmips

Disassembly of section .text:

0000000000000000 <add>:
   0:	27bdfff8 	addiu	$sp,$sp,-8
   4:	afbe0000 	sw	$s8,0($sp)
   8:	03a0f021 	move	$s8,$sp
   c:	afc40008 	sw	$a0,8($s8)
  10:	afc5000c 	sw	$a1,12($s8)
  14:	8fc20008 	lw	$v0,8($s8)
  18:	8fc3000c 	lw	$v1,12($s8)
  1c:	00000000 	nop
  20:	00431021 	addu	$v0,$v0,$v1
  24:	03c0e821 	move	$sp,$s8
  28:	8fbe0000 	lw	$s8,0($sp)
  2c:	03e00008 	jr	$ra
  30:	27bd0008 	addiu	$sp,$sp,8

0000000000000034 <main>:
  34:	27bdffd8 	addiu	$sp,$sp,-40
  38:	afbf0024 	sw	$ra,36($sp)
  3c:	afbe0020 	sw	$s8,32($sp)
  40:	03a0f021 	move	$s8,$sp
  44:	afc40028 	sw	$a0,40($s8)
  48:	afc5002c 	sw	$a1,44($s8)
  4c:	24020001 	li	$v0,1
  50:	afc20010 	sw	$v0,16($s8)
  54:	24020002 	li	$v0,2
  58:	afc20014 	sw	$v0,20($s8)
  5c:	8fc40010 	lw	$a0,16($s8)
  60:	8fc50014 	lw	$a1,20($s8)
  64:	0c000000 	jal	0 <add>
  68:	00000000 	nop
  6c:	afc20018 	sw	$v0,24($s8)
  70:	8fc20018 	lw	$v0,24($s8)
  74:	03c0e821 	move	$sp,$s8
  78:	8fbf0024 	lw	$ra,36($sp)
  7c:	8fbe0020 	lw	$s8,32($sp)
  80:	03e00008 	jr	$ra
  84:	27bd0028 	addiu	$sp,$sp,40
	...

 

编译成arm下的main.o,没有链接。然后反汇编为main_arm.a:

  1. main.o:     file format elf32-littlearm  
  2.   
  3. Disassembly of section .text:  
  4.   
  5. 00000000 <add>:  
  6.    0:   e1a0c00d    mov r12, sp  
  7.    4:   e92dd800    stmdb   sp!, {r11, r12, lr, pc}  
  8.    8:   e24cb004    sub r11, r12, #4    ; 0x4  
  9.    c:   e24dd008    sub sp, sp, #8  ; 0x8  
  10.   10:   e50b0010    str r0, [r11, -#16]  
  11.   14:   e50b1014    str r1, [r11, -#20]  
  12.   18:   e51b3010    ldr r3, [r11, -#16]  
  13.   1c:   e51b2014    ldr r2, [r11, -#20]  
  14.   20:   e0833002    add r3, r3, r2  
  15.   24:   e1a00003    mov r0, r3  
  16.   28:   ea000009    b   2c <add+0x2c>  
  17.   2c:   e91ba800    ldmdb   r11, {r11, sp, pc}  
  18.   
  19. 00000030 <main>:  
  20.   30:   e1a0c00d    mov r12, sp  
  21.   34:   e92dd800    stmdb   sp!, {r11, r12, lr, pc}  
  22.   38:   e24cb004    sub r11, r12, #4    ; 0x4  
  23.   3c:   e24dd014    sub sp, sp, #20 ; 0x14  
  24.   40:   e50b0010    str r0, [r11, -#16]  
  25.   44:   e50b1014    str r1, [r11, -#20]  
  26.   48:   e3a03001    mov r3, #1  ; 0x1  
  27.   4c:   e50b3018    str r3, [r11, -#24]  
  28.   50:   e3a03002    mov r3, #2  ; 0x2  
  29.   54:   e50b301c    str r3, [r11, -#28]  
  30.   58:   e51b0018    ldr r0, [r11, -#24]  
  31.   5c:   e51b101c    ldr r1, [r11, -#28]  
  32.   60:   ebfffffe    bl  0 <add>  
  33.   64:   e1a03000    mov r3, r0  
  34.   68:   e50b3020    str r3, [r11, -#32]  
  35.   6c:   e51b3020    ldr r3, [r11, -#32]  
  36.   70:   e1a00003    mov r0, r3  
  37.   74:   ea00001c    b   78 <main+0x48>  
  38.   78:   e91ba800    ldmdb   r11, {r11, sp, pc}  
main.o:     file format elf32-littlearm

Disassembly of section .text:

00000000 <add>:
   0:	e1a0c00d 	mov	r12, sp
   4:	e92dd800 	stmdb	sp!, {r11, r12, lr, pc}
   8:	e24cb004 	sub	r11, r12, #4	; 0x4
   c:	e24dd008 	sub	sp, sp, #8	; 0x8
  10:	e50b0010 	str	r0, [r11, -#16]
  14:	e50b1014 	str	r1, [r11, -#20]
  18:	e51b3010 	ldr	r3, [r11, -#16]
  1c:	e51b2014 	ldr	r2, [r11, -#20]
  20:	e0833002 	add	r3, r3, r2
  24:	e1a00003 	mov	r0, r3
  28:	ea000009 	b	2c <add+0x2c>
  2c:	e91ba800 	ldmdb	r11, {r11, sp, pc}

00000030 <main>:
  30:	e1a0c00d 	mov	r12, sp
  34:	e92dd800 	stmdb	sp!, {r11, r12, lr, pc}
  38:	e24cb004 	sub	r11, r12, #4	; 0x4
  3c:	e24dd014 	sub	sp, sp, #20	; 0x14
  40:	e50b0010 	str	r0, [r11, -#16]
  44:	e50b1014 	str	r1, [r11, -#20]
  48:	e3a03001 	mov	r3, #1	; 0x1
  4c:	e50b3018 	str	r3, [r11, -#24]
  50:	e3a03002 	mov	r3, #2	; 0x2
  54:	e50b301c 	str	r3, [r11, -#28]
  58:	e51b0018 	ldr	r0, [r11, -#24]
  5c:	e51b101c 	ldr	r1, [r11, -#28]
  60:	ebfffffe 	bl	0 <add>
  64:	e1a03000 	mov	r3, r0
  68:	e50b3020 	str	r3, [r11, -#32]
  6c:	e51b3020 	ldr	r3, [r11, -#32]
  70:	e1a00003 	mov	r0, r3
  74:	ea00001c 	b	78 <main+0x48>
  78:	e91ba800 	ldmdb	r11, {r11, sp, pc}

 

不同CPU架构下汇编语言的特点

代码长度

首先,我们看同一个C语言程序,在不同的处理器下,代码长度。代码长度为反汇编文件的第一列,可以看到,在x86下是0x4c+1个字节,在MIPS下是0x84+4个字节,在ARM下是0x78+4个字节。为什么这样呢?

首先看的是CISC和RISC的区别 CISC架构下,指令的长度不是固定的,而RISC为了实现流水线,每条指令的长度都是固定的。看到反汇编文件的第二列,x86的指令中,最短为一个字节,例如push,pop,ret等指令,最长为7个字节,例如movl指令。而对于ARM和MIPS,所有的指令长度都固定为4个字节。这也是ARM和MIPS的机器代码长度要明显比x86长的原因。

另外一个原因,就是CISC可能为某个特殊操作实现了一条指令,而RISC处理器则需要用多条指令组合来完成该操作。最明显的就是出入栈操作。

然后我们看MIPS和ARM的区别 ARM的代码长度比MIPS代码长度稍稍小,这也验证了人们常说的MIPS是纯粹的RISC架构,而ARM则在RISC的基础上吸收了CISC中的某些优点。我们还是要看看,ARM是因为吸收了哪些CISC的特点,才做到代码长度的减少的呢?最明显的是出入栈,在ARM中实现了多寄存器load/store指令,请注意main_arm.a文件的0x4,0x2c,0x34,0x78行的stmdb和ldmdb指令。那么,这和CISC有什么关系呢?仔细想想,这就是CISC中的为了某个特殊的操作而实现一条指令的思想。另外,多寄存器的load/store指令破坏了RISC中指令的执行周期必须是单周期的规定,这一点,也是人们指责ARM不是纯粹的RISC架构的证据之一。

另外还有就是ARM实现了条件标志,实现条件执行,这样可以减少分支指令的数目,提高代码的密度。不过在我们这个实例中没有这方面的应用。

出栈入栈

入栈指将CPU通用寄存器的值放入栈(存储器)中保存起来。出栈则是指将栈中的值恢复到CPU中相应通用寄存器。

在x86下面,有专门的出栈和入栈指令pop和push。出栈和入栈在栈中的位置是当前堆栈指针sp所指向的位置。在MIPS和ARM下面,没有专门的指令,所以入栈和出栈首先使用的是load/store指令将数据放入堆栈或者弹出堆栈,然后使用add/stub指令修改堆栈指针的值。比较特殊的是ARM有特殊的多寄存器load/store指令来快速的完成出入栈。由此可见,在MIPS和ARM下面,出入栈都是使用帧指针或者堆栈指针的相对位置,在执行之后,并不会影响堆栈指针sp的值。

栈的生长 栈的生长指堆栈指针sp的变化。例如,在函数调用的时候,需要一次性的分配被调用函数的栈空间大小。在x86,ARM,MIPS下都是使用的对堆栈指针寄存器直接加减的办法。而且,在MIPS和ARM下,也只有这种办法可以改变堆栈指针SP的值。而在x86下,除了直接加减的办法之外,出入栈操作指令pop和push还可以改变sp的值。

不同CPU架构下函数调用的特点

C语言函数的调用,请参考C语言-Stack的相关内容。涉及堆栈帧(stack frame),活动记录(active record),调用惯例(call convention)等相关概念。建议参考《程序员的自我修养-链接、装载与库》的第10.2节-栈和调用惯例。

毫无疑问,这里都是使用的C语言的默认调用惯例cdecl。cdecl调用管理的特点如下:

  • 调用的出栈方为函数调用方;
  • 参数的传递为从右向左入栈;
  • 名字修饰为下划线+函数名;

首先我们给出一个cdecl调用惯例的模型,不针对任何处理器架构,然后我们再看看不同的处理器架构下cdecl调用惯例有什么样的特点。下图为cdecl调用惯例的一般情况示意图。

下面分析cdecl调用惯例中,调用函数和被调用函数分别负责活动记录(堆帧栈)中的什么操作呢?首先是被调用函数,在函数的入口,需要做以下操作:

  • 需要将返回地址入栈,例如MIPS下的 sw \(ra,28(\)sp) 一句,就是将函数的返回地址入栈。对于x86架构,由于call命令会自动将返回地址入栈,所以在函数入口处没有返回地址入栈的指令;
  • 需要将调用函数的帧指针入栈,然后设置本身自己函数的帧指针。在x86下,是 push %ebp;mov %esp,%ebp两句,而在MIPS下,是sw \(s8,24(\)sp);move \(s8,\)sp;两句。这里也可以看出x86的拥有专门入栈指令的特点push的特点;
  • 调整堆栈指针的大小,升栈到函数需要的堆栈大小。

上面是被调用函数需要负责的事情,那么调用函数需要负责什么呢?主要有一下几点:

  • 准备好函数调用参数;
  • 调用指令call跳转到被调用函数。

X86的函数调用

这个调用中没有调整堆栈指针的操作,因为不需要用到额外的堆栈空间。所以,只有上面提到的第一点和第二点。

  1. push   %ebp  
  2. mov    %esp,%ebp  
  3. ......  
  4. pop    %ebp  
  5. ret      
push   %ebp
mov    %esp,%ebp
......
pop    %ebp
ret    

 

MIPS的函数调用

MIPS的堆栈,在被调用函数中有8bytes的升栈操作,下面的ARM中也是一样的。

  1. addiu   $sp,$sp,-8  
  2. sw  $s8,0($sp)  
  3. move    $s8,$sp  
  4. ......  
  5. move    $sp,$s8  
  6. lw  $s8,0($sp)  
  7. jr  $ra  
  8. addiu   $sp,$sp,8  
addiu	$sp,$sp,-8
sw	$s8,0($sp)
move	$s8,$sp
......
move	$sp,$s8
lw	$s8,0($sp)
jr	$ra
addiu	$sp,$sp,8

 

ARM的函数调用

相比于MIPS架构,一条stmdb和ldmdb就可以完成多个寄存器的存储(store)和加载(load)。

  1. mov r12, sp  
  2. stmdb   sp!, {r11, r12, lr, pc}  
  3. sub r11, r12, #4    ; 0x4  
  4. sub sp, sp, #8  ; 0x8  
  5. ......  
  6. b   2c <add+0x2c>  
  7. ldmdb   r11, {r11, sp, pc}  

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CPU体系架构-ARM/MIPS/X86 的相关文章

  • 一文教你如何在HBuilderX中使用模拟器开发调试App

    一文教你如何在HBuilderX中使用模拟器开发调试App 第一步下载HBuilderX 第二步 下载一个模拟器 这里我选择的是网易出品的mumu模拟器 第三步 打开上面安装的两个软件 接着在hbx里运行到模拟器 如下图所示 如果和图片中一
  • 从12306验证码看人工智能未来发展

    事件背景 最近12306对登陆验证过程进行了升级 让很多抢票软件失效 也引起众多网友的热议 如图 用户在登陆时需要选择和题目给出的描述相同的图片 新的验证方式推出后 不少网友也在网上发表看法 大部分网友表示此举很给力 黄牛抢票软件失效了 对
  • mysql dump 导出表_[译文]MySQL中快速逻辑备份一张单独的表

    逻辑备份在跨云环境的数据迁移和表级恢复中非常有用 8 0 22的MySQL shell引入了两个新的实用程序util dumpTable 和util exportTable 用于从MySQL中导出单独的表 在8 0 22之前 无法使用MyS
  • 电脑提示vcomp140.dll无法继续执行代码

    电脑提示vcomp140 dll无法继续执行代码怎么办 vcomp140 dll是电脑系统系统重要的动态链接库文件 丢失或者损坏的话 会导致电脑很多软件跟游戏无法打开运行 需要怎么修复 详细困扰着不少小伙伴 小编今天就把教程分享给大家 修复
  • 2.0生命周期 fabric java 链码安装

    2 0生命周期 fabric java 链码安装 步骤
  • ATT&CK红队评估实战靶场-1(全网最细)

    声明 该系列文章首发于公众号 Y1X1n安全 转载请注明出处 本公众号所分享内容仅用于网安爱好者之间的技术讨论 所有渗透及工具的使用都需获取授权 禁止用于违法途径 否则需自行承担 本公众号及作者不承担相应的后果 ATT CK红队评估实战靶场
  • 列表 元组和字典

    1 列表 1 1列表的循环变量 for循环 while循环 1 2列表常见的操作 1 2 1在列表增加元素 append方法 extend方法 insert方法 append方法 在列表的末尾新增元素 extend方法 将一个列表中的元素全
  • Golang协程与通道整理

    协程goroutine 不由OS调度 而是用户层自行释放CPU 从而在执行体之间切换 Go在底层进行协助实现 涉及系统调用的地方由Go标准库协助释放CPU 总之 不通过OS进行切换 自行切换 系统运行开支大大降低 通道channel 并发编
  • 求一个数组的最大值最小值及其下标

    求一个数组的最大值最小值及其下标 思路 假定一个数为最大值 如果有个数比假定的最大值还大 那么该数就为最大值 最小值同理 使用for循环 public class MaxMin public static void main String
  • java 对象序列化磁盘_java对象的序列化以及反序列化详解

    一 概念 序列化 把创建出来的对象 new出来的对象 以及对象中的成员变量的数据转化为字节数据 写到流中 然后存储到硬盘的文件中 反序列化 可以把序列化后的对象 硬盘上的文件中的对象数据 读取到内存中 然后就可以直接使用对象 这样做的好处是
  • Could not resolve dependencies for project

    ERROR Failed to execute goal on project open common Could not resolve dependencies for project com wt open open common j
  • JavaBean的Scope属性

    Scope 属性代表了Javabean对象的生存时间 可以是page request session和application中的一个 它们分别代表了JavaBean的四种不同生命周期和四种不同的使用范围 page的生命周期和作用范围是4种类
  • 【大学生软件测试基础】白盒测试 - 控制流图 - 01

    任务1 画出程序流程图 任务2 画出控制流图 任务3 根据程序环形复杂度的计算公式 求出程序路径集合中的独立路径数目 任务4 根据环形复杂度的计算结果 源程序的基本路径集合中有多少条独立路径 任务5 设计测试用例 1 程序流程图 2 控制流
  • git资料

    IDEA中Git的使用 https www cnblogs com javabg p 8567790 html 如何用git将项目代码上传到github https blog csdn net laozitianxia article de
  • Centos 7 大硬盘分区(>2TB) - parted & xfs

    Centos 7 针对超过2T的大硬盘 采用parted分区 1 运行parted命令 进入parted界面后 运行p打印已有分区信息 找到前一个分区终止点 如 2 2028kb 51 2GB xfs 其至终点应为51 2GB 运行mkpa
  • RabbitMQ高级特性(四):RabbitMQ之TTL(存活时间/过期时间)

    RabbitMQ高级特性 四 RabbitMQ之TTL 存活时间 过期时间 TTL 全称 Time To Live 存活时间 过期时间 当消息到达存活时间后 还没有被消费 会被自动清除 RabbitMQ可以对消息设置过期时间 也可以对整个队
  • Symbol的理解和使用

    Symbol的诞生 也就是Symbol存在的意义 之前我们的对象属性的数据类型都是字符串 没有其他的 所以会导致属性名的重复 导致属性值被覆盖的情况 比如 你使用了一个他人提供的对象 但又想为这个对象添加新的方法 在添加的操作就很容易覆盖原
  • java中List集合三种获取集合元素方式

    java中List集合三种获取集合元素方式 1 for 2 迭代器 3 增强for循环 List集合常用方法 List作为Collection集合的子接口 不但继承了Collection接口中的全部方法 而且还增加了一些根据元素索引来操作集
  • IntelliJ IDEA出现红色字体解决办法

    如图所示 问题 ApiModel显示红色 点击alt enter提示需要添加io swagger包到classpath中 因为在pom xml中没有把此包引入 如图 解决方案 在pom xml中添加io swagger包 经历1 当我根据I
  • IDE简介

    集成开发环境 IDE Integrated Development Environment 用于提供程序开发环境的应用程序 一般包括代码编辑器 编译器 调试器和图形用户界面等工具 集成了代码编写功能 分析功能 编译功能 调试功能等一体化的开

随机推荐

  • Atlantis 【POJ - 1151】【扫描线模板题+线段树更新】

    题目链接 是一道扫描线的模板题 也是我的第一道扫描线的题了 对扫描线也算是有了第一次的理解 无非就是更新新的向上的区间长度 然后去查询就是了 而查询是O 1 的 因为可以通过树的最上根节点得到的 include
  • KMP比较简单的讲法。

    转载链接 http blog csdn net yearn520 article details 6729426 我们在一个母字符串中查找一个子字符串有很多方法 KMP是一种最常见的改进算法 它可以在匹配过程中失配的情况下 有效地多往后面跳
  • 捕鱼游戏源码(数值+完整项目资源)

    目前捕鱼游戏的玩法 逐渐有这些趋势 捕鱼玩法 消除类玩法 捕鱼玩法 模拟经营玩法 捕鱼玩法 建造养成玩法 这些趋势已经有龙头企业逐渐开始做出尝试 但是对大部分团队来讲 对垂直领域的理解不够深刻 对产品理解不够深刻 团队没有沉淀和积累 通常都
  • chart.js使用学习——柱状图(2:常用属性设置)

    本文介绍柱状图常用属性及效果 柱状图中有部分常用属性与折线图用法相同 本文仅列出这些属性的简要说明 不再详细说明 base 设置图形绘制时的基准值 数值型 默认值为空 设置的值为数值轴上的值 base值未设置 则绘制的柱状图沿数值轴方向的起
  • [解决报错] Invalid attempt to spread non-iterable instance.In order to be iterable, non-array objects mu

    主要原因是因为用let of 方法遍历的时候 有一个参数为null 没有iterable 所以数据处理错误 换成for循环就好
  • 常用搜索引擎使用技巧

    1 指定站内搜索 使用site指定在某网站内搜索 如只在知乎中搜索 liuwons liuwons site zhihu com 2 精确匹配 使用双引号来指定精确匹配单词或短语 如精确搜索 liuwons liuwons 3 模糊搜索 使
  • 通讯编程001——Nodejs快速开发Modbus TCP Master

    本文介绍如何利用ModbusJs库快速开发Modbus TCP Master 相关源码请登录网信数智 wangxinzhihui com 下载 ModbusJs是一个基于Nodejs的Modbus TCP的开发库 目前支持的功能函数有 re
  • vue-tabel 中使用 el-autocomplete 出现的问题

    必须加 popper append to body false popper class vxetableignoreclear 我自己用的话缺一不可 说一下我自己项目中遇到的问题吧 我写的是表格中套表格 会出现就是当下拉选的时候用 sel
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • 正则表达式中的特殊字符

    字符 含意 做为转意 即通常在 后面的字符不按原来意义解释 如 b 匹配字符 b 当b前面加了反斜杆后 b 转意为匹配一个单词的边界 或 对正则表达式功能字符的还原 如 匹配它前面元字符0次或多次 a 将匹配a aa aaa 加了 后 a
  • python自学篇十五[Numpy——基础(一):(jupyter Notebook+Anaconda+conda+jupyter配置及简单操作 ]

    文章目录 概括 Numpy Scipy pandas matplotlib 一 Numpy 基础 1 jupyter Notebook 1 安装Anaconda 2 Anaconda是什么 1 Anaconda Navigator 2 Ju
  • DNS欺骗原理及工作工程分析

    DNS欺骗 DNS欺骗是这样一种中间人攻击形式 它是攻击者冒充域名服务器的一种欺骗行为 它主要用于向主机提供错误DNS信息 当用户尝试浏览网页 例如IP地址为XXX XX XX XX 网址为www bankofamerica com 而实际
  • 工作与身体健康之间的平衡

    大厂裁员 称35岁以后体能下滑 无法继续高效率地完成工作 体重上涨 因为35岁以后新陈代谢开始变慢 甚至坐久了会腰疼 睡眠困扰开始加重 在众多的归因中 仿佛35岁的到来 会为一切的焦虑埋下伏笔 实际上 生理年龄不代表全部 体能素质的下降更与
  • 各种汇编器masm masm32 fasm nasm yasm gas的区别

    原文地址 http www verydemo com demo c269 i661 html masm MASM是微软公司开发的汇编开发环境 拥有可视化的开发界面 使开发人员不必再使用DOS环境进行汇编的开发 编译速度快 支持80x86汇编
  • Debug of AMBA AXI Outstanding Transactions

    Verifying today s complex designs is time consuming as simulations run for long time and millions of transaction are exe
  • Win7(WinDbg) + VMware(Win7) 双机调试环境搭建之三

    更多精彩内容 请见 http www 16boke com 环境 主机 Win7 虚拟机 VMware 11 1 0 build 2496824 虚拟机内操作系统 又称GuestOS Win7 WinDbg 适合调试机的相应位数的版本就可以
  • springboot使用Mybatis-Plus实现分页查询

    1 导入依赖 MyBatis Plus opens new window 简称 MP 是一个 MyBatis opens new window 的增强工具 在 MyBatis 的基础上只做增强不做改变 为简化开发 提高效率而生 我个人感觉使
  • JAVA--GUI(2)--布局

    布局 为了更好适应不同平台而引入的概念 Java的布局管理器是一个实现了LayoutManager接口的实例 用户无法设置setLocation 这些方法 如果想自己设置则需要取消布局管理器 采用布局管理器 边界布局 顺序布局 网格布局 卡
  • BMVC 2022 (东京大学)仅需90K参数!实时完成低光增强, 曝光矫正的超轻量级Transformer网络IAT,已开源

    本文由 52CV 粉丝投稿 作者 信息门下奶狗 知乎地址 https zhuanlan zhihu com p 535695807 我们提出Illumination Adaptive Transformer IAT 网络 用来探索实时的暗光
  • CPU体系架构-ARM/MIPS/X86

    转自 http nieyong github io wiki cpu CPU体系架构 ARM MIPS X86 第一部分 从寄存器 寻址方式 汇编指令等方面总结了ARM MIPS X86的异同 CPU体系架构 RISC和CISC CPU体系