1.ARM汇编的语句格式

汇编语言都具有一些相同的基本特征。

  • 一条指令一行。

  • 使用标号(label)给内存单元提供名称,从第1列开始书写。

  • 指令必须从第2列或能区分标号的地方开始书写。

  • 注释跟在指定的注释字符后面(ARM使用的是“;”),一直书写到行尾。
    ARM汇编语言基本的的语句格式如下:

      {symbol}  {instruction |directive | pseudo-instruction}  {;comment} 符号       指令、伪指令或伪操作                         [; 注释]
    
(1)符号命名规则:
  • 符号由大小写字母、数字及下画线组成,符号不能用数字开头。
  • 符号区分大小写,同名的大、小写符号会被编译器认为是两个不同的符号。
  • 符号在其作用范围内必须唯一。
  • 自定义的符号名不能与系统的保留字相同。
  • 符号名不应与指令或伪指令同名。
(2)伪操作

伪操作(Directive)是ARM汇编语言程序里的一些特殊的指令助记符,其作用主要是为完成汇编程序做各种准备工作,对源程序运行汇编程序处理,而不是在计算机运行期间由处理器执行。
常用伪操作列表:

操作符      语法格式                功能描述
ARM         ARM                     指示编译器处理的是32位ARM指令
CODE32      CODE32                  指示编译器处理的是32位ARM指令
THUMB       THUMB                   指示编译器处理的是16位THUMB指令
CODE16      CODE16                  指示编译器处理的是16位THUMB指令
AREA        AREA name{attr} {attr}  段属性定义
ENTRY       ENTRY                   声明程序的入口
END         END                     源程序结尾标识
EQU         name EQU expr{,type} 定义常量或标号名称
EXPORT      EXPORT name             声明全局标号
IMPORT      IMPORT name             外部符号声明

介绍:

  • ENTRY 和 END

    • 定义程序入口点伪指令 ENTRY用于指定汇编程序的入口点
    • 汇编结束伪指令 END 用于通知编译器汇编工作到此结束,不再往下汇编了
  • EXPORT(或GLOBAL)和 IMPORT(或EXTERN)
    外部可引用符号声明伪指令EXPORT(或GLOBAL)可以声明一个其他源文件可引用的符号,这种符号也叫做外部可引用符号。

      格式:EXPORT 符号 {[WEAK]}符号在程序中区分大小写[WEAK] 选项声明其他的同名符号优先于该符号被引用
    

当在一个源文件中需要使用另外一个源文件的外部可引用符号时,在被引用的符号前面必须使用伪指令 IMPORT 对其进行声明

 格式:IMPORT 符号 {[WEAK]}                    [WEAK] 选项表示当前所有的源文件都没有定义这样一个符号时,编译器也不报错,并在多数情况下将该符号置为0

如果源文件声明了一个引用符号,则无论当前源文件中程序是否真正地使用了该符号,该符号均会被加入到当前源文件的符号表中

(3)伪指令

伪指令是ARM处理器支持的汇编语言程序里的特殊助记符,它不在处理器运行期间由机器执行,只是在汇编时将被合适的机器指令代替成ARM或Thumb指令,从而实现真正的指令操作。
①段定义伪指令

格式:AREA <sectionname> {<attr>}{,<attr>}…sectionname:段名,若段名以数字开头,则必须用符号“|”扩起来,如|1_test|attr:属性字段,多个属性字段用逗号分隔属性         含义          备注CODE          代码段         默认读/写属性为READONLYDATA            数据段         默认读/写属性为READWRITEREADONLY       本段只读    READWRITE       本段可读可写  ALIGN表达式        对齐字节数       ELF的代码段和数据段为字对齐COMMON           多源文件共享段 一个汇编语言程序至少要有一个段。

②符号定义伪指令

符号的命名由编程者决定,但有以下约定:

符号区分大小写,同名的大、小写符号会被编译器认为是两个不同的符号
符号在其作用范围内必须唯一
自定义的符号不能与系统保留字相同
符号不应与指令或伪指令同名
  • 全局变量伪指令(GBLA、GBLL、GBLS):
    GBLA、GBLL 和 GBLS 伪指令用于定义一个ARM程序中的全局变量,并将其初始化。

      例如:GBLA Test1   ;定义一个全局数字变量,变量名为Test1,默认初值为0GBLL Test2   ;定义一个全局逻辑变量,变量名为Test2,默认初值为FGBLS Test3   ;定义一个全局字符串变量,变量名为Test3,默认初值为空
    

    全局变量的变量名在整个程序范围内必须具有唯一性。

  • 局部变量伪指令(LCLA、LCLL、LCLS )
    LCLA、LCLL 和 LCLS 伪指令用于定义一个ARM程序中的局部变量,并将其初始化

      例如:LCLA Test4   ;定义一个局部数字变量,变量名为Test4,默认初值为0LCLL Test5   ;定义一个局部逻辑变量,变量名为Test5,默认初值为FLCLS Test6   ;定义一个局部字符串变量,变量名为Test6,默认初值为空
    

局部变量的变量名在变量作用范围内必须具有唯一性。默认情况下,局部变量只在定义该变量的程序段内有效

  • 变量赋值伪指令(SETA、SETL、SETS)
    SETA、SETL 和 SETS 伪指令用于给一个已经定义的全局变量或局部变量进行赋值

      例如:   Test1  SETA  0xAA         ;将Test1变量赋值为0xAATest2  SETL  {TRUE}   ;将Test2变量赋值为真Test3  SETS  "Testing"    ;将Test3变量赋值为“Testing”
    
  • 定义寄存器列表伪指令 RLIST
    指令 LDM/STM 需要使用一个比较长的寄存器列表,使用伪指令 RLIST 可对一个列表定义一个统一的名称

      格式: <name> RLIST <{list}>name :为表名称{list} :为寄存器列表,列表中的寄存器访问次序根据寄存器的编号由低到高,而与列表中的寄存器排列次序无关例如:RegList RLIST {R0-R5,R8,R10} ;将寄存器列表名称定义为RegList
    

③程序中的标号

在汇编语言中用来表示地址的符号就叫做标号
根据用途不同标号主要有以下2种:

  • 目标地址标号:写在一条指令前面的标号
  • 数据或数据区首地址标号:写在数据或数据区定义伪指令前面的标号

④数据定义伪指令

该指令的功能就是为指定的数据分配存储单元,以及用该数据对已分配存储单元进行初始化。

  • DCB(可用“=”代替)
    用于分配一片连续的以字节为单位的存储区域(操作数可以为-128~255的数值或字符串),并用指定的表达式对其进行初始化。

      格式:  {<label>} DCB <expr>                    label 为标号,为存储区域的首地址(可选)expr 为表达式,为从标号开始存放的数据。该表达式可以为0~255的数字或字符串
    
  • DCW(或DCWU)
    用于为数据分配一片连续的半字存储单元(操作数是16位二进制数),并用表达式对其进行初始化。

      格式:<label> DCW(或DCWU) <expr>表达式可以为程序标号或数字表达式
    

    用 DCW 分配的半字存储单元是严格按半字对齐的,而用DCWU 分配的半字存储单元并不严格按半字对齐。

  • DCD(或DCDU)(可用“&”代替)
    用于分配一片连续的字存储单元(操作数可以是32位的数字表达式),并用伪指令中指定的表达式初始化。

      格式:<label> DCD(或DCDU) <expr>表达式可以为程序标号或数字表达式
    

    用 DCD 分配的字存储单元是字对齐的,而用 DCDU 分配的字存储单元并不严格要求字对齐。

  • DCFD(或DCFDU)
    用于为双精度的浮点数分配一片连续的字存储单元,并用伪指令中指定的表达式初始化每个双精度的浮点数占据两个字单元

      格式:<label> DCFD(或DCFDU) <expr>
    

    用 DCFD 分配的字存储单元是字对齐的而用 DCFDU 分配的字存储单元并不严格字对齐

  • DCFS(或DCFSU)
    用于为单精度的浮点数分配一片连续的字存储单元,并用伪指令中指定的表达式初始化每个单精度浮点数占据一个字单元

      格式:<label> DCFS(或DCFSU) <expr>
    

    用 DCFS 分配的字存储单元是字对齐的而用 DCFSU 分配的字存储单元并不严格字对齐

  • DCQ(或DCQU)
    用于分配一片以8字节为单位的连续存储区域,并用伪指令中指定的表达式初始化

      格式:label> DCQ(或DCQU) <expr>
    

    用 DCQ 分配的存储单元是字对齐的,而用 DCQU 分配的字存储单元并不严格字对齐

  • SPACE(可用“%”代替)
    用于分配一片连续的存储区域并初始化为0

      格式:<label> SPACE <expr>
    
  • LTORG
    来说用明某个存储区域为一个用来暂存数据的数据缓冲区,也叫文字池或数据缓冲池。
    大的代码段也可以使用多个数据缓冲池。

      例如:AREA example, CODE, READONLYStart  BL  Func1…Func1  LDR R1,=0x800MOV PC,LRLTORG  ;定义数据缓冲池的开始位置Date   SPACE  40 ;数据缓冲池有40个被初始化为0的字节  END
    

    当程序中使用 LDR 之类的指令访问数据缓冲池时,为防止越界发生,通常把数据缓冲池放在代码段的最后面,或放在无条件转移指令或子程序返回指令之后,这样处理器就不会错误地将数据缓冲池中的数据当作指令来执行。

  • MAP 和 FIELD

    • MAP 用于定义一个结构化的内存表的首地址

        格式:MAP <expr> {,<baseregister>}expr 为结构化表首地址,可以为标号或数字表达式baseregister 为基址寄存器(可选项)
      

      基址寄存器的值与 expr 的值之和就是表首地址

    • FIELD 伪指令用于定义一个结构化内存表中的数据域

        格式:<label> FIELD <expr>                           label 为标号(为数据域指定一个标号供其他指令引用)expr 为表达式,它的值为数据域所占的字节数
      

      FIELD 伪指令与 MAP 伪指令配合使用来定义结构化的内存表。
      只用于定义数据结构,不分配存储单元。

⑤汇编控制伪指令

  • IF、ELSE 和 ENDIF
    根据条件的成立与否决定是否执行某个程序段
    IF、ELSE、ENDIF 伪指令可以嵌套使用

      例如:GBLL Test ;声明一个全局逻辑变量Test...IF Test = TRUE程序段1 ELSE程序段2ENDIF
    
  • WHILE 和 WEND
    根据条件的成立与否决定是否重复汇编一个程序段
    若 WHILE 后面的逻辑表达式为真,则重复汇编该程序段,直到逻辑表达式为假
    WHILE 和 WEND 伪指令可以嵌套使用

      例如:GBLA Counter  ;声明一个全局数字变量CounterCounter SETA 3    ;赋值...WHILE Counter < 10程序段WEND
    

⑥其他常用的伪指令

伪指令列表伪指令     语法格式                            功能ADR       ADR{cond} register,=expression     它将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中ADRL ADRL{cond} register,=expression        它将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中LDR      LDR{cond} register,=expression     将一个32位的常数或者一个地址值读取到寄存器中,可以看做是加载寄存器的内容NOP     NOP                                 是空操作伪指令,在汇编时将会被替代成ARM中的空操作
  • ADR伪指令————小范围的地址读取
    在汇编编译器编译源程序时,ADR伪指令被编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错误,编译失败。ADR伪指令中的地址是基于PC或寄存器的,当ADR伪指令中的地址是基于PC时,该地址与ADR伪指令必须在同一个代码段中。
    地址表达式expr的取值范围如下:

      当地址值是字节对齐时,其取指范围为−255B~255B;当地址值是字对齐时,其取指范围为−1020B~1020B。
    
  • ADRL伪指令————中等范围的地址读取
    ADRL比ADR伪指令可以读取更大范围的地址。在汇编编译器编译源程序时,ADRL伪指令被编译器替换成两条合适的指令。若不能用两条指令实现,则产生错误,编译失败。
    地址表达式expr的取值范围如下:

      当地址值是字节对齐时,其取指范围为−64KB~64KB;当地址值是字对齐时,其取指范围为−256KB~256KB。
    
  • LDR伪指令————大范围的地址读取
    在汇编编译源程序时,LDR伪指令被编译器替换成一条合适的指令。若加载的常数未超出MOV或MVN的范围,则使用MOV或MVN指令代替该LDR伪指令,否则汇编器将常量放入文字池,并使用一条程序相对偏移的LDR指令从文字池读出常量。

      格式:LDR{cond} reg,={expr | label - expr}reg:目标寄存器名称expr:32位常数label – expr:为基于PC地址表达式程序经常用这条指令把一个地址传递到寄存器 reg 中
    

    汇编器在对这种指令进行汇编时,会根据指令中 expr 的值的大小来把这条指令替换为合适的指令

    • 当expr的值未超过MOV或MVN指令所限定的取值范围时,汇编器用ARM的MOV或MVN指令来取代宏指令LDR
    • 当expr的值超过MOV或MVN指令所限定的取值范围时,汇编器将常数expr放在由LTORG定义的文字缓冲池,同时用一条ARM的装载指令LDR来取代宏指令LDR,而这条装载LDR指令则用PC加偏移量的方法到文字缓冲池中把该常数读取到指令指定的寄存器。

2.ARM汇编的程序结构

在 ARM ( Thumb )汇编语言程序中,以程序段为单位组织代码。段是相对独立的指令或数据序列,具有特定的名称。
段可以分为代码段和数据段,代码段的内容为执行代码,数据段存放代码运行时需要用到的数据。
一个汇编程序至少应该有一个代码段,当程序较长时,可以分割为多个代码段和数据段,多个段在程序编译链接时最终形成一个可执行的映象文件。
可执行映象文件通常由以下几部分构成:

  • 一个或多个代码段,代码段的属性为只读。
  • 零个或多个包含初始化数据的数据段,数据段的属性为可读写。
  • 零个或多个不包含初始化数据的数据段,数据段的属性为可读写。

链接器根据系统默认或用户设定的规则,将各个段安排在存储器中的相应位置。因此源程序中段之间的相对位置与可执行的映象文件中段的相对位置一般不会相同。

(1)顺序程序设计

没有分支、循环等架构的程序,会顺序执行汇编指令;

 AREA EXAMPLE,CODE,READONLY  ; 定义段的名称和属性,表示了一个段的开始ENTRY   ; 标识程序的入口点
start   ; 以下为具体指令MOV    R0,#10  MOV    R1,#3ADD    R0,R0,R1END  ; 标识源文件的结束
(2)分支程序设计

ARM汇编中大部分的指令都支持条件执行,类似C语言中的if-else分支。
ADD指令可以根据已执行代码对状态寄存器的影响来决定是否执行,从而构成简单的分支结构。

例如:CMP  R1,#3 ; 比较R1和#3ADD  HI R0,R0,R1   ; if R1>3 then R0=R0+R1ADD  LS R0,R0,#3    ; if R1<3 then R0=R0+3

B、BL可以条件执行,从而构成复杂的分支架构。

例如:            CMP  R1,#3 ; 比较R1和#3BHI  END   ; if R1>3 then ENDADD  R0,R0,#3  ; R0=R0+3END
(3)循环程序设计

用预先设定的行标与B、BL结合可以设计各种循环结构。

例如: LOOP   ADD   R0,R0,R1 ; R0=R0+R1CMP   R0,#3 ; 比较R0和#3 BLS   LOOP    ; if R0<3 then 跳转到LOOP 循环END
(4)子程序

在ARM汇编语言程序中,子程序的调用一般是通过BL指令来实现的。
在程序中,使用指令:
BL子程序名,即可完成子程序的调用。
该指令在执行时完成如下操作:
将子程序的返回地址存放在连接寄存器LR中,同时将程序计数器PC指向子程序的入口点,当子程序执行完毕需要返回调用处时,只需要将存放在LR中的返回地址重新复制给程序计数器PC即可。在调用子程序的同时,也可以完成参数的传递和从子程序返回运算的结果,通常可以使用寄存器R0~R3完成。
以下是使用BL指令调用子程序的汇编语言源程序的基本结构:

……
BL PRINT_TEXT   ; 跳转到子程序 PRINT_TEXT,并保存PC至LR
……
PRINT_TEXT  ; 子程序入口
……
MOV PC,LR    ; 子程序运行完毕将PC置为LR,准备返回END

3.ATPCS[ARM-Thumb Procedure Call Standard(PCS,Procedure Call Standard(过程调用规范))]

(1)寄存器的使用规则
ATPCS中定义的寄存器寄存器    R0  R1  R2  R3  R4  R5  R6  R7  R8  R9  R10  R11  R12  R13  R14  R15sysnonym  a1  a2  a3  a4  v1  v2  v3  v4  v5  v6  v7   v8   special                               WR      SB  SL   FP   IP   SP   LR   PC
其中:R0~R3:用于传参,r0用于返回值。R4~R11:通用变量寄存器。 R12:用作过程调用中间临时过渡寄存器IP。R13:堆栈指针。R14:连接寄存器。R15:PC。

另外,R9、R10和R11还有一个特殊作用,分别记为:静态基址寄存器SB,数据栈限制指针SL和桢指针FP。

  • 子程序通过寄存器R0~R3来传递参数,这时寄存器可以记作A0~A3,被调用的子程序在返回前无须恢复寄存器R0~R3的内容。
  • 在子程序中,使用R4~R11来保存局部变量,这时寄存器R4~R11可以记作V1~V8。
    如果在子程序中使用到V1~V8的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值,对于子程序中没有用到的寄存器则不必执行这些操作。在Thumb程序中,通常只能使用寄存器R4~R7来保存局部变量。
  • 寄存器R12用作子程序间临时过渡寄存器,记作IP,在子程序的连接代码段中经常会有这种使用规则。
  • 寄存器R13用作数据栈指针,记做SP,在子程序中寄存器R13不能用作其他用途。寄存器SP在进入子程序时的值和退出子程序时的值必须相等。
  • 寄存器R14用作连接寄存器,记作LR。它用于保存子程序的返回地址,如果在子程序中保存了返回地址,则R14可用作其他的用途。
  • 寄存器R15是程序计数器,记作PC,它不能用作其他用途。
  • ATPCS中的各寄存器在ARM编译器和汇编器中都是预定义的。
(2)数据栈的使用规则
  • 数据栈指针(stack pointer):指向最后一个写入栈的数据的内存地址。
  • 数据栈的基地址(stack base):指数据栈的最高地址。由于ATPCS中的数据栈是FD类型的,实际上数据栈中最早入栈数据占据的内存单元是基地址的下一个内存单元。
  • 数据栈界限(stack limit):数据栈中可以使用的最低的内存单元地址。
  • 已占用的数据栈(used stack):数据栈的基地址和数据栈栈指针之间的区域,其中包括数据栈栈指针对应的内存单元。
  • 数据栈中的数据帧(stack frames):在数据栈中,为子程序分配的用来保存寄存器和局部变量的区域。
(3)参数的传递规则
  • 参数个数可变的子程序参数传递规则
    对于参数个数可变的子程序,当参数不超过4个时,可以使用寄存器R0~R3来进行参数传递;当参数超过4个时,还可以使用数据栈来传递参数。在参数传递时,将所有参数看做是存放在连续的内存单元中的字数据。然后,依次将各名字数据传送到寄存器R0,R1,R2,R3;如果参数多于4个,将剩余的字数据传送到数据栈中,入栈的顺序与参数顺序相反,即最后一个字数据先入栈。按照上面的规则,一个浮点数参数可以通过寄存器传递,也可以通过数据栈传递,也可能一半通过寄存器传递,另一半通过数据栈传递。
  • 参数个数固定的子程序参数传递规则
    对于参数个数固定的子程序,参数传递与参数个数可变的子程序参数传递规则不同,如果系统包含浮点运算的硬件部件,浮点参数将按照下面的规则传递:
    各个浮点参数按顺序处理;为每个浮点参数分配FP寄存器;分配的方法是,满足该浮点参数需要的且编号最小的一组连续的FP寄存器。
    第1个整数参数通过寄存器R0~R3来传递,其他参数通过数据栈传递。
(4)子程序结果返回规则
  • 结果为一个32位的整数时,可以通过寄存器R0返回。
  • 结果为一个64位整数时,可以通过R0和R1返回,依此类推。
  • 结果为一个浮点数时,可以通过浮点运算部件的寄存器f0、d0或者s0来返回。
  • 结果为一个复合的浮点数时,可以通过寄存器f0~fN或者d0~dN来返回。
  • 对于位数更多的结果,需要通过调用内存来传递。

4.C语言及汇编语言混合编程

(1)在C / C++程序中使用内嵌的汇编指令

在ARM C语言程序中,使用关键字__asm来标识一段汇编指令程序。
程序格式如下所示:

__asm    ;注意是两个下划线!
{汇编语言程序~~~~~~~~~~汇编语言程序
}

其中一条指令占据多行的时候,要使用续行符号( \ )。必须小心使用物理寄存器,如R0 ~ R3、SP、LR和CPSR中的N、Z、C、V标志位,因为计算汇编代码中的C表达式时,可能会使用这些物理寄存器,并修改N、Z、C、V标志位。

(2)从汇编程序中访问C程序变量

在C程序中的声明的全局变量可以被汇编程序通过地址间接访问。
具体访问方法如下:

  • 使用IMPORT伪指令声明这个全局变量。

  • 使用LDR指令读取该全局变量的内存地址,通常该全局变量的内存地址存放在程序的数据缓冲池中。

  • 根据该数据类型,使用相应的LDR指令读取该全局变量的值,使用相应的STR指令修改该全局变量的值。

          AREA globals, CODE, READONPYEXPORT asmsubIMPORT glovbver    ;声明外部变量glovbverasmsubLDR R1, =glovbver ;装载变量地址LDR R0, [R1] ;读出数据ADDR R0, R0, #1    ;加1操作STR R0, [R1]   ;保存变量值MOV PC, LREND
    
(3)C程序与汇编程序相互调用规则
  • 寄存器的使用规则:

    • 子程序间通过寄存器R0 ~ R3来传递参数。
    • 在子程序中,使用寄存器R4 ~ R11来保存局部变量。
    • 寄存器R12用于保存SP,在函数返回时使用该寄存器出栈,记作IP。
    • 寄存器R13用于数据栈指针,记作SP,寄存器SP在进入子程序时的值和退出寄存器时的值必须相等。
    • 寄存器R14称为链接寄存器,记作LR,它用于保存子程序的返回地址。
    • 寄存器R15是程序计数器,记作PC。
  • 堆栈的使用规则:
    堆栈采用满递减类型(FD,Full Descending),即堆栈通过减小存储器地址而向下增长,堆栈指针指向内含有效数据项的最低地址。

  • 参数的传递规则:
    整数参数的前4个使用r0~r3传递,其他参数使用堆栈传递;
    子程序的返回结果为一个32位整数时,通过r0返回;
    返回结果为一个64位整数时,通过r0和r1返回;
    依此类推。

第三章 ARM汇编语言程序设计——ARM相关推荐

  1. 汇编语言ax=0c58ch,第4章89C5汇编语言程序设计.ppt

    第4章89C5汇编语言程序设计 三.实验说明 1.因为本实验是交通灯控制实验,所以要了解实际交通灯的变化情况和规律.假设一个十字路口为东西南北走向.初始状态0为东西红灯,南北红灯.然后转状态1东西绿灯 ...

  2. 沈阳师范大学大一上册C语言PTA题目集以及答案(第三章 循环结构程序设计 编程题篇)

    沈阳师范大学大一上册C语言PTA题目集以及答案(第三章 循环结构程序设计 编程题篇) 7-1 求阶乘序列前N项和 (15分) 本题要求编写程序,计算序列 1!+2!+3!+⋯ 的前N项之和. 输入格式 ...

  3. ARM裸机开发篇3:ARM汇编语言程序设计

    写在前面: 本文章为<ARM Cortex-A7裸机开发篇>系列中的一篇,全系列总计11篇.笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板). 针对FS-MP ...

  4. c语言程序设计教程博客,C语言教程第三章: C语言程序设计初步

    if(表达式1) 语句1: else if(表达式2) 语句2: else if(表达式3) 语句3: - else if(表达式m) 语句m: else 语句n:其语义是:依次判断表达式的值,当出现 ...

  5. 【blockly教程】第三章Blockly顺序程序设计

    3.1 什么是Blockly语言  2012年6月,Google发布了完全可视化的编程语言Google Blockly,整个界面清晰明了, 你可以如同在玩拼图一样用一块块图形对象构建出应用程序.每个图 ...

  6. 第三章 分支语句 程序设计练习

    3.1(代数:解二次方程)二次方程的两个根可由下列公式得出:与,其中称为二次方程的判别式.如果它为正,则方程会有两个实根.如果它为零,则方程有一个根.如果它为负,则方程无实根.编写程序,提示用户输入a ...

  7. 第三章 同步 Windows程序设计 王艳平版

    /// // CriticalSection.cpp文件 #include <stdio.h> #include <windows.h> #include <proces ...

  8. 第三章 事件 windows程序设计 王艳平版

    /// // EventDemo.cpp文件 #include <stdio.h> #include <windows.h> #include <process.h> ...

  9. ARM 汇编语言入门

    [翻译]二进制漏洞利用(二)ARM32位汇编下的TCP Bind shell:https://bbs.pediy.com/thread-253511.htm ARM汇编语言入门 From:ARM汇编语 ...

  10. 汇编语言程序设计钱晓捷第五版期末复习参考

    汇编语言程序设计钱晓捷第五版期末复习参考 第一章:汇编语言基础知识 1.1 8086的寄存器 处理器内部需要高速存储单元,用于暂时存放程序执行过程中的代码和数据,这些存储单元被称为寄存器(Regist ...

最新文章

  1. intel最新的服务器芯片,Intel最新服务器CPU 芯片组Roadmap
  2. 获取oracle数据库war报告,Oracle 数据库开发及SQL基础实战
  3. 给卡车穿上“隐身衣”,让自动驾驶车辆撞上它!这场自动驾驶比赛,比谁攻得快...
  4. 操作系统的安装与启动基本原理
  5. OpencvSharp的踩坑之路
  6. unix 网络编程总结 二
  7. mysql为用户部分授权,MYSQL为用户授权
  8. 修改windows功能要开启哪个服务器,win7更改windows功能提示出现错误并非所有的功能被成功更改怎么办...
  9. karto探秘之slam_karto
  10. Atitit.常用分区api的attilax总结
  11. 77GHz毫米波雷达快速chirp信号技术(二):测速原理
  12. java设计模式——adapter模式
  13. MATLAB 超定方程组 最小二乘法
  14. java end_Fabric学习笔记(七) - fabric-sdk-java End2endIT运行
  15. 离职原因之3B分类问题
  16. thinkpad e450c 键盘拆解
  17. 程序员技术面试与HR谈薪资技巧的一些经验心得
  18. GwcNet:逐组相关的立体匹配网络(CVPR 2019)
  19. Android创建新的联系人,保存至现有联系人
  20. 09_keras_Tuner使用keras Tuner调整超参数(超参数优化)

热门文章

  1. hfss螺旋平面_微波射频网HFSS平面螺旋天线设计
  2. sprintf_s用法c语言,sprintf_s函数的使用
  3. 电脑上免费的录屏软件有哪些?分享六款录屏小工具,超好用
  4. IXM317CQC回收IMX377CQT回收IMX307LQR-CIMX185LQJ-C回收IMX283CQT
  5. Java读写NFC标签Ntag2x芯片源码
  6. html表格之个人简历
  7. 软件数字签名证书选购指南
  8. 计算机打印服务总是自动关闭,打印机服务怎么使用 打印机服务自动关闭怎么解决...
  9. 为世界之光——交通大学校歌介绍
  10. linux查看内存条pn,查看电脑内存条型号的两种方法【图文】