第三章 ARM汇编语言程序设计——ARM
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相关推荐
- 汇编语言ax=0c58ch,第4章89C5汇编语言程序设计.ppt
第4章89C5汇编语言程序设计 三.实验说明 1.因为本实验是交通灯控制实验,所以要了解实际交通灯的变化情况和规律.假设一个十字路口为东西南北走向.初始状态0为东西红灯,南北红灯.然后转状态1东西绿灯 ...
- 沈阳师范大学大一上册C语言PTA题目集以及答案(第三章 循环结构程序设计 编程题篇)
沈阳师范大学大一上册C语言PTA题目集以及答案(第三章 循环结构程序设计 编程题篇) 7-1 求阶乘序列前N项和 (15分) 本题要求编写程序,计算序列 1!+2!+3!+⋯ 的前N项之和. 输入格式 ...
- ARM裸机开发篇3:ARM汇编语言程序设计
写在前面: 本文章为<ARM Cortex-A7裸机开发篇>系列中的一篇,全系列总计11篇.笔者使用的开发平台为华清远见FS-MP1A开发板(STM32MP157开发板). 针对FS-MP ...
- c语言程序设计教程博客,C语言教程第三章: C语言程序设计初步
if(表达式1) 语句1: else if(表达式2) 语句2: else if(表达式3) 语句3: - else if(表达式m) 语句m: else 语句n:其语义是:依次判断表达式的值,当出现 ...
- 【blockly教程】第三章Blockly顺序程序设计
3.1 什么是Blockly语言 2012年6月,Google发布了完全可视化的编程语言Google Blockly,整个界面清晰明了, 你可以如同在玩拼图一样用一块块图形对象构建出应用程序.每个图 ...
- 第三章 分支语句 程序设计练习
3.1(代数:解二次方程)二次方程的两个根可由下列公式得出:与,其中称为二次方程的判别式.如果它为正,则方程会有两个实根.如果它为零,则方程有一个根.如果它为负,则方程无实根.编写程序,提示用户输入a ...
- 第三章 同步 Windows程序设计 王艳平版
/// // CriticalSection.cpp文件 #include <stdio.h> #include <windows.h> #include <proces ...
- 第三章 事件 windows程序设计 王艳平版
/// // EventDemo.cpp文件 #include <stdio.h> #include <windows.h> #include <process.h> ...
- ARM 汇编语言入门
[翻译]二进制漏洞利用(二)ARM32位汇编下的TCP Bind shell:https://bbs.pediy.com/thread-253511.htm ARM汇编语言入门 From:ARM汇编语 ...
- 汇编语言程序设计钱晓捷第五版期末复习参考
汇编语言程序设计钱晓捷第五版期末复习参考 第一章:汇编语言基础知识 1.1 8086的寄存器 处理器内部需要高速存储单元,用于暂时存放程序执行过程中的代码和数据,这些存储单元被称为寄存器(Regist ...
最新文章
- mac 不显示 外接屏幕_苹果笔记本A1707电脑屏幕不显示,主板进水腐蚀,一招秒杀...
- iOS架构-Xcode创建Workspace管理多个子工程(23)
- nginx_upsteam
- winform list集合怎么 in过滤_python3基础04字典(dict)和集合(set)
- 独家专访Mockplus CEO老布,原型设计领域的弄潮儿
- 大数据算法与分析技术国家工程实验室将建设
- 计算机网络 第四章 网络层
- C++11 处理时间和日期的处理,以及chrono库介绍
- 无法解析具体reference那个同名文件
- java知识总结-19
- 数学建模 最优化方法:动态规划 学习笔记
- 腾讯翻译君在线翻译怎么翻译整个文件_7款好用的英文翻译软件推荐
- 上海理工大计算机学研究生怎么样,上海理工大学(专业学位)计算机技术考研难吗...
- day16正则表达式作业
- 【颜纠日记】祛痘广告那么神?分享确切的祛痘方式。
- HDU 5745 La Vie en rose(水~)
- 泰勒级数(Taylor Series)和利用python计算自然常数
- Git如何保留两地并行开发的提交
- 小甲鱼老师《带你学C带你飞》的后续课程补充
- 转行智能控制的这些年(月无声智控事业部的前世今生)
热门文章
- PPT训练营-【目录页】
- ABC三类地址及其子网掩码
- rk3568 sensor调试记录
- linux 安装adobe字体,Adobe Creative Cloud应用程序已更新,为iOS 13和iPadOS提供免费的自定义字体...
- 淘宝客商城带分销APP源码(原生双端IOS+安卓+后台+数据 库+开发文档),用于学习或二开使用,开发语言:安卓java,苹果oc,后台php。
- nekohtml转换html时标签变大写的问题
- java中udp的使用
- Micropython——L298N电机驱动模块
- 数据分析岗位需求分析报告
- ToStringBuilder用法