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. mac 不显示 外接屏幕_苹果笔记本A1707电脑屏幕不显示,主板进水腐蚀,一招秒杀...
  2. iOS架构-Xcode创建Workspace管理多个子工程(23)
  3. nginx_upsteam
  4. winform list集合怎么 in过滤_python3基础04字典(dict)和集合(set)
  5. 独家专访Mockplus CEO老布,原型设计领域的弄潮儿
  6. 大数据算法与分析技术国家工程实验室将建设
  7. 计算机网络 第四章 网络层
  8. C++11 处理时间和日期的处理,以及chrono库介绍
  9. 无法解析具体reference那个同名文件
  10. java知识总结-19
  11. 数学建模 最优化方法:动态规划 学习笔记
  12. 腾讯翻译君在线翻译怎么翻译整个文件_7款好用的英文翻译软件推荐
  13. 上海理工大计算机学研究生怎么样,上海理工大学(专业学位)计算机技术考研难吗...
  14. day16正则表达式作业
  15. 【颜纠日记】祛痘广告那么神?分享确切的祛痘方式。
  16. HDU 5745 La Vie en rose(水~)
  17. 泰勒级数(Taylor Series)和利用python计算自然常数
  18. Git如何保留两地并行开发的提交
  19. 小甲鱼老师《带你学C带你飞》的后续课程补充
  20. 转行智能控制的这些年(月无声智控事业部的前世今生)

热门文章

  1. PPT训练营-【目录页】
  2. ABC三类地址及其子网掩码
  3. rk3568 sensor调试记录
  4. linux 安装adobe字体,Adobe Creative Cloud应用程序已更新,为iOS 13和iPadOS提供免费的自定义字体...
  5. 淘宝客商城带分销APP源码(原生双端IOS+安卓+后台+数据 库+开发文档),用于学习或二开使用,开发语言:安卓java,苹果oc,后台php。
  6. nekohtml转换html时标签变大写的问题
  7. java中udp的使用
  8. Micropython——L298N电机驱动模块
  9. 数据分析岗位需求分析报告
  10. ToStringBuilder用法