asm:常用语法

2023-11-16

1、循环

1.1、使用条件跳转指令实现循环

汇编语言中实现循环通常需要使用跳转指令和条件判断指令。下面是一个示例代码,用于实现一个简单的循环结构:

MOV CX, 10     ; 将计数器初始值10存储到CX寄存器中
L1:            ; 标记循环开始处
<LOOP-BODY>    ; 循环体中的指令
DEC CX         ; 将计数器值减1
JNZ L1         ; 如果计数器不为0,则跳转到循环开始处继续执行

这段代码的具体含义如下:

  1. 首先使用MOV指令将计数器的初值10(或者其它合适的值)存储到CX寄存器中。

    MOV CX, 10
    
  2. 然后定义一个名为L1的标号,表示循环的开始位置。

    L1:
    
  3. 接着执行循环体(LOOP-BODY)中的指令,这些指令可以根据具体需求进行编写。

    <LOOP-BODY>
    
  4. 使用DEC指令将计数器CX寄存器中的值减1。

    DEC CX
    
  5. 然后使用JNZ指令(Jump if Not Zero)判断计数器的值是否为0,如果不为0则跳转到L1标号处继续执行循环体内的指令;否则结束循环。

    JNZ L1
    

在这个示例代码中,循环的次数由CX寄存器中的值控制,每次循环体执行结束后,计数器的值会减1。当计数器的值为0时,程序会跳转到循环结束处,结束循环。

1.2、使用LOOP指令实现循环

LOOP是x86汇编中的一个指令,用于循环执行某段代码块。它的语法格式如下:

LOOP destination

其中destination表示循环体的结束位置,可以是任何有效的内存地址或标号(label)。执行完这条指令后,CPU会将CX寄存器中的值减1,并判断CX寄存器中的值是否为0。如果不为0,则跳转到destination指向的内存地址处执行指令,否则继续往下执行。

LOOP指令的执行流程如下:

  1. 首先将CX寄存器中的值减1。

  2. 判断CX寄存器中的值是否为0,如果不为0,则跳转到destination指向的位置处执行指令。

  3. 如果CX寄存器中的值为0,则不跳转,直接继续往下执行。

需要注意的是,LOOP指令只能使用CX寄存器作为计数器,因此在使用LOOP指令前需要将CX寄存器初始化为循环次数。另外,由于LOOP指令只能处理8位或16位有符号整数的计数器,因此在循环次数较大时可能会出现计算错误的情况。

下面是一个简单的示例程序,演示了如何使用LOOP指令:

MOV CX, 10     ; 将计数器初值10存储到CX寄存器中
L1:            ; 标记循环开始处
<LOOP-BODY>    ; 循环体中的指令
LOOP L1        ; 继续执行循环,直到CX寄存器中的值为0

在这个示例中,首先使用MOV指令将计数器的初值10存储到CX寄存器中。然后定义一个名为L1的标号,表示循环的开始位置。接着执行循环体(LOOP-BODY)中的指令,这些指令可以根据具体需求进行编写。最后使用LOOP指令对CX先进行减1的操作,然后指示CPU在CX寄存器中的值不为0时跳转回L1标号处执行循环体,直到CX寄存器中的值为0时结束循环。

2、字符串

2.1、指定字符串的长度

我们可以使用表示位置计数器当前值的 $location 计数器符号来显式存储字符串长度。

在以下实例中:

msg  db  'Hello, world!',0xa ;字符
len  equ  $ - msg            ;字符长度

2.2、字符串指令

每个字符串指令可能需要一个源操作数,一个目标操作数或两者。对于 32 位段,字符串指令使用 ESI 和 EDI 寄存器分别指向源和目标操作数。但是,对于 16 位段,SI 和 DI 寄存器分别用于指向源和目标。

有 5 种用于处理字符串的基本指令

MOVS - 该指令将从ESI寄存器指向的源地址复制到EDI寄存器指向的目标地址

LODS - 该指令将数据从ESI寄存器指向的源地址读取到AL/AX/EAX寄存器中,并递增或递减ESI寄存器的值。

STOS - 该指令将AL/AX/EAX寄存器的值写入EDI寄存器指向的目标地址,并递增或递减EDI寄存器的值。

CMPS - 该指令将ESI寄存器指向的源地址处的一个字节与EDI寄存器指向的目标地址处的一个字节进行比较,并递增或递减ESI和EDI寄存器的值

SCAS -该指令将AL/AX/EAX寄存器的值与与EDI寄存器指向的目标地址处的一个字节进行比较,并递增或递减EDI寄存器的值。

下面我们分别看五个简短的示例:

; movs
section .data
src_buf db 1,2,3,4,5
dst_buf times 5 db 0    ; 初始化为5个0

section .text
global _start

_start:
mov esi, src_buf ; 设置源地址
mov edi, dst_buf ; 设置目标地址
mov ecx, 5       ; 设置要传送的字节数

rep movsb        ; 在两个缓冲区之间传送所有字节
***
section .data
buf db 1,2,3,4,5

section .text
global _start

_start:
mov esi, buf ; 设置源地址
mov ecx, 5   ; 设置要读取的字节数

xor eax, eax ; 清零累加器eax

loop_start:
lodsb        ; 读取一个字节到al寄存器中,并递增esi寄存器的值
add eax, al  ; 将al寄存器中的值加到eax寄存器中
loop loop_start

mov ebx, eax ; 将结果保存到ebx寄存器中

mov eax, 1   ; 设置系统调用号为exit
xor ecx, ecx ; 设置退出码为0
int 0x80     ; 调用系统调用
section .data
buf db 1,2,3,4,5

section .text
global _start

_start:
mov edi, buf ; 设置目标地址
mov ecx, 5   ; 设置要写入的字节数
xor al, al   ; 设置要写入的字节值为0

rep stosb    ; 将5个字节设置为0

mov eax, 1   ; 设置系统调用号为exit
xor ebx, ebx ; 设置退出码为0
int 0x80     ; 调用系统调用
section .data
buf1 db 1,2,3,4,5
buf2 db 1,2,3,4,6

section .text
global _start

_start:
mov esi, buf1 ; 设置源地址1
mov edi, buf2 ; 设置源地址2
mov ecx, 5   ; 设置要比较的字节数

repe cmpsb   ; 比较两个缓冲区中的5个字节是否相等

jz success   ; 如果两个缓冲区中的字节都相等,则跳转到success标签
***
section .data
buf db 1,2,3,4,5

section .text
global _start

_start:
mov edi, buf ; 设置目标地址
mov ecx, 5   ; 设置要查找的字节数
mov al, 4    ; 设置要查找的字节值为4

repe scasb   ; 在缓冲区中查找字节值为4的字节

jnz not_found   ; 如果没找到,则跳转到not_found标签
***

2.3、重复前缀

  • REP是一个通用前缀,它可以与大多数指令一起使用。它的作用是根据指令类型重复执行指令,直到ECX计数器变为0。例如,REP MOVSB指令可以用于在两个存储器之间传输字符串,每执行一次MOVSB指令,ESI和EDI寄存器的值都会增加或减少,ECX计数器的值也会递减,直到ECX计数器为0。

  • REPE前缀表示“repeat while equal”,它通常与字符串比较指令(如CMPSB)一起使用,用于比较两个字符串,如果相等则继续执行,直到ECX计数器为0,或者找到不同处,即ZF标志位被清除。例如,REPE CMPSB指令可以用于比较两个字符串,每执行一次CMPSB指令,ESI和EDI寄存器的值都会增加或减少,ECX计数器的值也会递减,直到ECX计数器为0,或者字符串中出现不匹配的字符,即ZF标志位被清除。

  • REPNE前缀表示“repeat while not equal”,它与REPE类似,但是用于比较两个字符串时,如果不相等则继续执行,直到ECX计数器为0,或者找到相同处,即ZF标志位被设置。例如,REPNE CMPSB指令可以用于比较两个字符串,每执行一次CMPSB指令,ESI和EDI寄存器的值都会增加或减少,ECX计数器的值也会递减,直到ECX计数器为0,或者字符串中出现匹配的字符,即ZF标志位被设置。

  • REPF前缀表示“repeat while equal, forward”,它通常与字符串搜索指令(如SCASB)一起使用,用于搜索字符串中是否存在一个给定字符,如果找到了,则继续执行,直到ECX计数器为0,或者搜索完整个字符串,即ZF标志位被清除。例如,REPF SCASB指令可以用于搜索字符串中是否存在某个字符,每执行一次SCASB指令,EDI寄存器的值都会增加或减少,ECX计数器的值也会递减,直到ECX计数器为0,或者找到了给定字符,即ZF标志位被清除。

  • REPNF前缀表示“repeat while not equal, forward”,它与REPF类似,但是用于搜索字符串中是否存在一个给定字符时,如果没找到,则继续执行,直到ECX计数器为0,或者搜索完整个字符串,即ZF标志位被设置。例如,REPNF SCASB指令可以用于搜索字符串中是否存在某个字符,每执行一次SCASB指令,EDI寄存器的值都会增加或减少,ECX计数器的值也会递减,直到ECX计数器为0,或者没找到给定字符,即ZF标志位被设置。

3、数组

数组是啥不用我说了吧。

section .data
array db 1, 2, 3, 4, 5 ; 定义一个包含5个字节的数组
section .data
    array:                  ; 数组名
        times 5 db 0   ; 声明5个字节的数组,初始化为0;

4、递归

递归也不用介绍了,直接看个例子:

;程序展示了如何在汇编语言中实现阶乘 n。为了保持程序简单,我们将计算阶乘 3。

section .text
   global _start         ;必须声明才能使用 gcc
_start:                  ;告诉链接器入口点
   mov bx, 3             ;用于计算阶乘 3
   call  proc_fact
   add   ax, 30h
   mov  [fact], ax
   mov    edx,len        ;消息长度
   mov    ecx,msg        ;消息
   mov    ebx,1          ;文件描述 (stdout)
   mov    eax,4          ;系统调用号 (sys_write)
   int    0x80           ;调用内核
   mov   edx,1           ;消息长度
   mov    ecx,fact       ;消息
   mov    ebx,1          ;文件描述 (stdout)
   mov    eax,4          ;系统调用号 (sys_write)
   int    0x80           ;调用内核
   mov    eax,1          ;系统调用号 (sys_exit)
   int    0x80           ;调用内核
proc_fact:
   cmp   bl, 1
   jg    do_calculation
   mov   ax, 1
   ret
do_calculation:
   dec   bl
   call  proc_fact
   inc   bl
   mul   bl        ;ax = al * bl
   ret
section .data
msg db 'Factorial 3 is:',0xa
len equ $ - msg
section .bss
fact resb 1

5、宏

编写宏是确保用汇编语言进行模块化编程的另一种方法。宏是一系列指令,由名称指定,可以在程序中的任何位置使用。

在 NASM 中,宏是用 %macro 和 %endmacro 指令定义的。宏以 %macro 指令开始,以 %endmacro 指令结束。

宏的语法如下:

%macro macro_name  number_of_params
<macro body>
%endmacro

其中,number_of_params 指定数字参数,macro_name 指定宏的名称。

通过使用宏名称和必要的参数来调用宏。当您需要在程序中多次使用某个指令序列时,可以将这些指令放在宏中并使用它,而不是一直编写指令。

例如,程序的一个常见需求是在屏幕上写入字符串。要显示字符串,您需要以下指令序列:

movedx,len  ;message length
movecx,msg  ;message to write
movebx,1    ;file descriptor (stdout)
moveax,4    ;system call number (sys_write)
int0x80     ;call kernel

在上面显示字符串的实例中,INT 80H 函数调用使用了寄存器 EAX、EBX、ECX 和 EDX。因此,每次需要在屏幕上显示时,都需要将这些寄存器保存在堆栈上,调用 INT 80H,然后从堆栈中恢复寄存器的原始值。因此,编写两个宏来保存和恢复数据可能很有用。

我们注意到,一些指令,如 IMUL、IDIV、INT 等,需要将一些信息存储在某些特定寄存器中,甚至在某些特定的寄存器中返回值。如果程序已经使用这些寄存器来保存重要数据,那么这些寄存器中的现有数据应该保存在堆栈中,并在指令执行后恢复。

6、文件操作

文件处理系统调用
下表简要介绍了与文件处理相关的系统调用:

%eax 名称 %ebx %ecx %edx 备注
2 sys_fork struct pt_regs - -
3 sys_read 文件描述符(unsigned int) 缓冲区的地址(char) 要读取的字节数(size_t)
4 sys_write 文件描述符(unsigned int) (缓冲区的地址)const char 要写入的字节数(size_t)
5 sys_open 文件名(const char) 文件访问模式(int) 文件权限(int)
6 sys_close 文件描述符(unsigned int) - -
8 sys_creat 文件名(const char) 文件权限(int) -
19 sys_lseek 文件描述符(unsigned int) 偏移值(off_t) 偏移量的参考位置(unsigned int) 参考位置可以是:文件开头 :0;当前位置:1;文件结尾:2。

以上所有的系统调用如果出现错误,系统调用将返回 EAX 寄存器中的错误代码。

我们来看两个示例:

;sys_fork
***
_start:
    ; 调用sys_fork系统调用创建子进程
    mov eax, 0x02 ; sys_fork的系统调用号
    int 0x80 ; 触发系统调用

    ; 检查返回值
    test eax, eax ; 如果eax为0,此条命令的执行结果为0,存储在标志寄存器中
    jz child_process ; jz(jump if zero),当标志寄存器中的值为0时,则跳转到child_process继续执行。
    ***
child_process:    
***
section .data
filename db 'example.txt', 0
mode rdwr ; 以读写方式打开文件

section .bss
fd resd 1 ; 用于存储文件描述符

section .text
global _start

_start:
    ; 调用sys_open函数打开文件
    mov eax, 0x05 ; sys_open系统调用号
    mov ebx, filename ; 文件名的地址
    mov ecx, mode ; 打开文件的模式
    int 0x80 ; 触发系统调用
    mov [fd], eax ; 将返回值(文件描述符)存储在fd变量中

    ; 如果文件描述符小于0,则表示打开文件失败
    cmp eax, 0 ; 比较eax与0的大小
    jl open_failed ; 如果小于0,则跳转到open_failed

    ; 在此处对文件进行操作
    ; ...

    ; 关闭文件
    mov eax, 0x06 ; sys_close系统调用号
    mov ebx, [fd] ; 文件描述符
    int 0x80 ; 触发系统调用

    ; 程序退出
    mov eax, 0x01 ; sys_exit系统调用号
    xor ebx, ebx ; 返回值为0
    int 0x80 ; 触发系统调用

open_failed:
    ; 文件打开失败的处理
    ; ...

7、内存管理

说内存管理之前我们先来看一个系统调用,sys_brk。
sys_brk()是一个操作系统中的内核函数,用于改变进程的堆空间大小。堆是进程运行时动态分配内存空间的区域,通过sys_brk()函数可以在堆上分配或释放指定大小的内存空间。

在Linux系统中,使用malloc()、calloc()等函数来进行内存动态分配时,都会使用sys_brk()函数来实现。sys_brk系统调用详见博主的另一篇博文。

section .text
   global _start         ;必须声明才能使用 gcc
_start:                  ;告诉链接器入口点
   mov  eax, 45          ;sys_brk
   xor  ebx, ebx
   int  80h              ; 这一步执行的是sys_brk(0),即获取到当前的堆的尾地址,保存在eax中。
   add  eax, 16384       ; eax += 16384,即堆增长16KB。
   mov  ebx, eax
   mov  eax, 45          ;sys_brk
   int  80h
   cmp  eax, 0
   jl   exit             ;exit, if error
   mov  edi, eax         ;EDI = highest available address
   sub  edi, 4           ;pointing to the last DWORD
   mov  ecx, 4096        ;number of DWORDs allocated
   xor  eax, eax         ;clear eax
   std                   ;backward
   rep  stosd            ;repete for entire allocated area
   cld                   ;put DF flag to normal state
   mov  eax, 4
   mov  ebx, 1
   mov  ecx, msg
   mov  edx, len
   int  80h              ;打印消息
exit:
   mov  eax, 1
   xor  ebx, ebx
   int  80h
section .data
msg     db      "Allocated 16 kb of memory!", 10
len     equ     $ - msg

执行结果如下:
在这里插入图片描述

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

asm:常用语法 的相关文章

  • 在我的 index.php 中加载 CSS 和 JS 等资源时出现错误 403

    我使用的是 Linux Elementary OS 并在 opt 中安装了 lampp My CSS and JS won t load When I inspect my page through browser The console
  • jq中如何分组?

    这是 json 文档 name bucket1 clusterName cluster1 name bucket2 clusterName cluster1 name bucket3 clusterName cluster2 name bu
  • 在脚本内使用不带密码的 sudo

    由于某种原因 我需要作为用户在没有 sudo 的情况下运行脚本 script sh 该脚本需要 root 权限才能工作 我认为将 sudo 放入 script sh 中是唯一的解决方案 让我们举个例子 script sh bin sh su
  • 如何更改 Apache 服务器的根目录? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何更改 Apache 服务器的文档根目录 我基本上想要localhost从 来 users spencer projects目录而不是
  • 如何在 Bash 中给定超时后终止子进程?

    我有一个 bash 脚本 它启动一个子进程 该进程时不时地崩溃 实际上是挂起 而且没有明显的原因 闭源 所以我对此无能为力 因此 我希望能够在给定的时间内启动此进程 如果在给定的时间内没有成功返回 则将其终止 有没有simple and r
  • MySQL 中的创建/写入权限

    我的设备遇到一些权限问题SELECT INTO OUTFILE陈述 当我登录数据库并执行简单的导出命令时 例如 mysql gt select from XYZ into outfile home mropa Photos Desktop
  • php exec 返回的结果比直接进入命令行要少

    我有一个 exec 命令 它的行为与通过 Penguinet 给 linux 的相同命令不同 res exec cd mnt mydirectory zcat log file gz echo res 当将命令直接放入命令行时 我在日志文件
  • 我如何知道 C 程序的可执行文件是在前台还是后台运行?

    在我的 C 程序中 我想知道我的可执行文件是否像这样在前台运行 a out 或者像这样 a out 如果你是前台工作 getpgrp tcgetpgrp STDOUT FILENO or STDIN FILENO or STDERR FIL
  • 快速像素绘图库

    我的应用程序以每像素的方式生成 动画 因此我需要有效地绘制它们 我尝试过不同的策略 库 但结果并不令人满意 尤其是在更高分辨率的情况下 这是我尝试过的 SDL 好的 但是慢 OpenGL 像素操作效率低下 xlib 更好 但仍然太慢 svg
  • Windows CE 与嵌入式 Linux [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 现在我确信我们都清楚 Linux 与 Windows 桌面的相对优点 然而 我对嵌入式开发世界的了解却少得多 我主要对行业解决方案感兴
  • 在 C++ linux 中将 STRINGS 写入串口

    我知道这个问题遍布互联网 但仍然没有任何东西能让我完全解决这个问题 我想用 C linux 将数据写入 Propeller 板的串行端口 从控制台获取输入时程序运行良好 但是当我向它写入字符串时总是返回 ERROR Invalid comm
  • 为什么C Clock()返回0

    我有这样的事情 clock t start end start clock something else end clock printf nClock cycles are d d n start end 我总是得到输出 时钟周期是 0
  • 警告:请求的映像平台 (linux/amd64) 与检测到的主机平台 (linux/arm64/v8) 不匹配

    警告 请求的映像平台 linux amd64 与检测到的主机平台 linux arm64 v8 不匹配 并且未请求特定平台 docker 来自守护程序的错误响应 无法选择具有功能的设备驱动程序 gpu 我在 mac 上尝试运行此命令时遇到此
  • 每个命令都返回“bash:<命令>:找不到命令...”[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我刚刚安装了 Scala 并添加了路径gedit bashrc export SCALA HOME home avijit sca
  • 如何在 GNU/Linux 上设置 Subversion (SVN) 服务器 - Ubuntu [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一台运行 Ubuntu 的笔记本电脑 我想将其用作 Subversion 服务器 既让我自己在本地承诺 也让其他人远程承诺 要使其
  • 让 TeXstudio 在 linux mint 中工作:找不到文件“url.sty”。

    刚刚切换到 Linux Mint 以前的顽固 Windows 用户 我在尝试安装 TeXstudio 时遇到一些问题 Sudo apt get install texstudio 给了我一个正确的安装 至少 我是这么认为的 但是当我尝试构建
  • 如何从 C 程序中获取 NIC 详细信息?

    我想要获取连接到我的计算机的所有 NIC 的以下详细信息 1 接口名称 例如eth0 2 接口编号 如Windows http answers yahoo com question index qid 20080517041705AAOmJ
  • linux命令中括号的用途是什么[重复]

    这个问题在这里已经有答案了 我在 Linux 终端中运行以下命令 谁能告诉我 Linux 终端中括号和以下命令的用途是什么 echo GET HTTP 1 0 echo 主机 www google com echo 数控 www googl
  • Raspberry 交叉编译 - 执行程序以“分段错误”结束

    我有一个自己编写的程序 我想从我的 x86 机器上为 Raspberry Pi 构建它 我正在使用 eclipse 生成的 makefile 并且无法更改此内容 我已经阅读了 CC for raspi 的教程 Hackaday 链接 htt
  • X11 模式对话框

    如何使用 Xlib 在 X11 中创建模式对话框 模态对话框是一个位于应用程序其他窗口之上的窗口 就像瞬态窗口一样 并且拒绝将焦点给予应用程序的其他窗口 在 Windows 中 当试图从模态窗口夺取焦点时 模态也会通过闪 烁模态窗口的标题栏

随机推荐

  • html使用iframe包含pdf文件,HTML embedded PDF iframe

    It s downloaded probably because there is not Adobe Reader plug in installed In this case IE it doesn t matter which ver
  • 【数据架构系列-06】一文搞懂数据模型的3种类型——概念模型、逻辑模型、物理模型

    数据模型就是模拟现实世界的方法论 是通向智慧世界的基石 从现实世界发展到智慧世界 要数经历现实世界 信息世界 计算机世界 数据世界 智慧世界五个不同的世界 我们天生具有从混沌的世界抽象信息变为信息世界的能力 但是到另外几个世界需要我们懂得计
  • spring的自动装配即装配的各种模式

    Spring的自动装配 无须在Spring配置文件中描述javabean之间的依赖关系 IOC容器会自动建立JavaBean之间的关联关系 根据属性名称自动装配autowire byName 根据数据类型自动装配autowire byTyp
  • 完整安装datax-web教程

    1 安装mysql5 7 a 创建目录下载安装rpm包 mkdir p opt software cd opt software wget i c http dev mysql com get mysql57 community relea
  • 【c++复习笔记】——智能指针详细解析(智能指针的使用,原理分析)

    个人主页 努力学习的少年 版权 本文由 努力学习的少年 原创 在CSDN首发 需要转载请联系博主 如果文章对你有帮助 欢迎关注 点赞 收藏 一键三连 和订阅专栏哦 目录 一 智能指针的基本概念 二 智能指针的定义和使用 三 auto ptr
  • Pytorch-Lightning基本方法介绍

    文章目录 LIGHTNINGMODULE Minimal Example 一些基本方法 Training Training loop Validation loop Test loop Inference Inference in rese
  • Qt之再谈阴影边框

    前面就窗口阴影已经写过一篇博客 使用九宫格的思路实现的 在我看来 凡是用程序能实现的尽量不要使用图片代替 在保证效率的前提下 今天再次分享关于我的一些小见解 先看效果 窗口阴影任意调节 包括阴影像素 是否圆角等 直接上代码 void Dro
  • linux如何查看入口地址,宝塔Linux面板安全入口地址忘了(方法一)

    宝塔Linux面板安全入口地址忘了 方法一 面板 地址 入口 宝塔 所示 宝塔Linux面板安全入口地址忘了 方法一 易采站长站 站长之家为您整理了宝塔Linux面板安全入口地址忘了 方法一 的相关内容 现在新安装的宝塔 Linux 面板时
  • win10-未知的USB设备-解决自己问题的记录

    若是没有解决你的问题 再找找其他办法看看 我也是网上搜的 刚好解决了我的问题我就记录了一下而已 哈哈哈 原文链接 修复 未知的USB设备 设备描述符请求失败 在Windows 10中 1 设备管理器 gt 通用串行总线控制器 gt 未知US
  • 基于opencv的手势识别

    大家好 我是一名本科生 我的主要学习方向是计算机视觉以及人工智能 按照目前的学习进度来说 我就是一小白 在这里写下自己编写的程序 与大家分享 记录一下自己的成长 今天与大家分享的是基于OpenCv的手势识别 思路分析 获取图片 在图片中找到
  • unity添加多个相机渲染物体多个视角的图片

    添加相机 我渲染物体多视角的图片是要用到cave空间 所以添加了四个相机 并且都放在空物体下面 还有两个物体 用在cave空间要保证四个相机的位置一致 rotation互成90 前 0 0 0 右 0 90 0 左 0 270 0 下 90
  • 用matplotlib动画功能,一帧一帧的录制排序算法

    1 matplotlib绘制动画 matplotlib是python中最经典的绘图包 里面animation模块能绘制动画 首先导入小例子使用的模块 from matplotlib import pyplot as plt from mat
  • 高性能MySQL:创建高性能索引

    文章目录 前言 一 索引的语法 1 1 创建索引 1 2 删除索引 1 3 查看索引 1 4 查看查询语句使用索引的情况 二 索引的优缺点 2 1 索引的优点 2 2 索引的缺点 三 索引的类型 3 1 按照功能逻辑区分 3 2 按照数据结
  • BH1750简单介绍

    bh1750是16位数字输出型 环境光强度传感器集成电路 主要应用有移动电话 液晶电视 笔记本电脑 便携式游戏机 数码相机 数码摄像机 汽车定位系统 液晶显示器 目录 1 bh1750中文资料 2 bh1750引脚说明 3 bh1750传感
  • 算法入门 24. TSP问题(状态压缩DP)

    TSP问题 问题描述如下 假设有一个旅行商人要拜访n个城市 他必须选择所要走的路径 路径的限制是每个城市只能拜访一次 而且最后要回到原来出发的城市 路径的选择目标是要求得的路径路程为所有路径之中的最小值 include
  • warning: #940-D: missing return statement at end of non-void function “fgetc“解决方案

    问题描述 warning 940 D missing return statement at end of non void function fgetc 解决方案 解决措施 引入头文件stdio h
  • 前端面试知识点整理——项目整理

    前端面试知识点整理 项目整理 文章目录 一 华工线上黑市 安卓 二 二手闲置商场 健身管理系统 小程序 三 birthday app swift 四 给Joey的生日页面 移动端 五 开发者博客 vue 一 华工线上黑市 安卓 1 MVP架
  • npm install 离线安装

    将外网装好的npm 将其缓存拷到内网 再通过缓存文件安装 注意内外网的nodejs npm版本要一致 不一致要 将其卸载 重装成一致的 卸载时 看 usr local lib usr local include usr local bin
  • HardFault_Handler问题查找方法

    一 程序进入HardFault Handler 可能原因 1 内存溢出 常见的于数组访问越界 2 堆栈溢出 堆栈设置过小等 二 排查方法 方法1 出现该情况后 可首先查看LR寄存器中的值 确定当前使用堆栈为MSP或PSP 1 打开寄存器窗口
  • asm:常用语法

    常用语法 1 循环 1 1 使用条件跳转指令实现循环 1 2 使用LOOP指令实现循环 2 字符串 2 1 指定字符串的长度 2 2 字符串指令 2 3 重复前缀 3 数组 4 递归 5 宏 6 文件操作 7 内存管理 1 循环 1 1 使