目录

汇编指令入门学习

【汇编指令】MSP430汇编指令

IAR下的汇编/单片机启动代码汇编

ARM 汇编&ARM 指令集 学习笔记


汇编指令入门学习

  在进行汇编程序设计时,MSP430的指令系统是程序的主体,但为了方便程序编制,还定义了一些指令,这些指令不参与和影响程序的执行,也不在计算机中运行,这类指令称为伪指令。

一般汇编器伪指令能帮助用户完成以下事情:

·将代码和数据汇编到规定的段中

·在存储器中用未初始化的变量保留空间

·控制汇编后列表文件的格式

·初始化存储器

·汇编条件块

·定义全局变量

·规定汇编器可以从中获得宏的库

·产生符号化的调试信息

模块控制伪指令:

NAME,PROGRAM—程序模块的开始

MODULE,LIBRARY—库模块的开始

ENDMOD—当前汇编模块的结束

END—汇编文件的结束

符号控制伪指令:EXTERN(IMPORT)-引入外部符号PUBLIC(EXPORT)-输出符号

段控制伪指令:ASEG—绝对段的开始RSEG—相对段的开始STACK—定义堆栈 段COMMON—定义公共段ORG—定位指针ALIGN—校准PC
EVEN—PC对准偶地址

数值分配伪指令:

SET(ASSIGN,VAR)—赋临时值

EQU(=)—赋永久值,当前模块内有效

DEFINE—定义文件内有效的值

数据定义与分配伪指令::

DB—定义字节(8bit)

DW—定义字(16bit)

DL—定义32bit整数

DF—定义32bit float

DS n—定义n个连续的字节

DC8 DB 生成(8位)常量/字符串

DC16 DW 生成(16位)常量

DC32 DL 生成32位常量

DC64 生成32位常量

DF32 DF 生成32位浮点常量

DF64 生成64位浮点常量

.double 生成48位TI格式的 浮点常量

.float 生成32位TI格式的 浮点常量

DS8 DS 分配8位整数空间DS16 DS 2 分配16位整数空间DS32 DS 4 分配32位整数空间DS64 DS 8 分配64位整数空间

 MSP430汇编指令集

MSP430汇编指令集 - 百度文库

百度文库

MCS-51指令详解

http://www.51c51.com/web/zhilin.htm

;说明:为了使MCS-51单片机初学者快速入门,迅速掌握单片机指令含意、操作码、操作数及;对应地址,汇编语言怎样编写等,现按指令操作码按顺序编写,可对照本公司编写的<<MCS-51八位高档单片计算机及其应用>>一书第145页指令手册查看,更详细资料请阅 第四章 MCS-51指令系统" 及第124页指令系统摘要。并在仿真器上装入;JJM.HEX文件,并对有关单元置数,用单步(F8)验证其正确性及其运行结果。

ORG     0000H

NOP                 ;空操作指令

AJMP    L0003   ;绝对转移指令

L0003:  LJMP    L0006   ;长调用指令

L0006:  RR      A       ;累加器A内容右移 (先置A为88H)

INC     A           ; 累加器A 内容加1

INC     01H     ;直接地址(字节01H)内容加1

INC     @R0     ; R0的内容 (为地址) 的内容即间接RAM加1

;(设R0=02H,02H=03H,单步执行后02H=04H)

INC     @R1     ; R1的内容 (为地址) 的内容即间接RAM加1

;(设R1=02H,02H=03H,单步执行后02H=04H)

INC     R0      ; R0的内容加1 (设R0为00H,单步执行后查R0内容为多少)

INC     R1      ; R1的内容加1(设R1为01H,单步执行后查R1内容为多少)

INC     R2      ; R2的内容加1 (设R2为02H,单步执行后查R2内容为多少)

INC     R3      ; R3的内容加1(设R3为03H,单步执行后查R3内容为多少)

INC     R4      ; R4的内容加1(设R4为04H,单步执行后查R4内容为多少)

INC     R5      ; R5的内容加1(设R5为05H,单步执行后查R5内容为多少)

INC     R6      ; R6的内容加1(设R6为06H,单步执行后查R6内容为多少)

INC     R7      ; R7的内容加1(设R7为07H,单步执行后查R7内容为多少)

JBC     20H,L0017; 如果位(如20H,即24H的0位)为1,则转移并清0该位

L0017:         ACALL   S0019   ;绝对调用

S0019:  LCALL   S001C   ;长调用

S001C:  RRC     A       ;累加器A的内容带进位位右移(设A=11H,C=0

;单步执行后查A和C内容为多少)

DEC     A       ;A的内容减1

DEC     01H     ;直接地址(01H)内容减1

DEC     @R0     ;R0间址减1,即R0的内容为地址,该地址的内容减1

DEC     @R1     ; R1间址减1

DEC     R0      ; R0内容减1

DEC     R1      ; R1内容减1

DEC     R2      ; R2内容减1

DEC     R3      ; R3内容减1

DEC     R4      ; R4内容减1

DEC     R5      ; R5内容减1

DEC     R6      ; R6内容减1

DEC     R7      ; R7内容减1

JB      20H,L002D;如果位(20H,即24H的0位)为1则转移

L002D:  AJMP    L0017    ;绝对转移

RET                 ;子程序返回指令

RL      A       ;A左移

ADD     A,#01H  ;A的内容与立即数(01H)相加

ADD     A,01H   ; A的内容与直接地址 (01H内容)相加

ADD     A,@R0   ; A的内容与寄存器R0的间址内容相加

ADD     A,@R1   ; A的内容与寄存器R1的间址内容相加

ADD     A,R0        ; A的内容与寄存器R0的内容相加

ADD     A,R1        ; A的内容与寄存器R1的内容相加

ADD     A,R2        ; A的内容与寄存器R2的内容相加

ADD     A,R3        ; A的内容与寄存器R3的内容相加

ADD     A,R4        ; A的内容与寄存器R4的内容相加

ADD     A,R5        ; A的内容与寄存器R5的内容相加

ADD     A,R6        ; A的内容与寄存器R6的内容相加

ADD     A,R7        ; A的内容与寄存器R7的内容相加

JNB     30H,L0041   ;直接位(30H)为0相对转移

L0041:  ACALL   S0100   ;绝对调用

RETI                ;中断返回指令

RLC     A       ;带进位位左移

ADDC    A,#02H  ;A带进位位与立即数(#02H)相加

ADDC    A,02H   ; A带进位位与直接地扯(02H内容)相加

ADDC    A,@R0   ; A带进位位与R0间扯内容相加

ADDC    A,@R1   ; A带进位位与R1间扯内容相加

ADDC    A,R0        ; A带进位位与R0内容相加

ADDC    A,R1        ; A带进位位与R1内容相加

ADDC    A,R2        ; A带进位位与R2内容相加

ADDC    A,R3        ; A带进位位与R3内容相加

ADDC    A,R4        ; A带进位位与R4内容相加

ADDC    A,R5        ; A带进位位与R5内容相加

ADDC    A,R6        ; A带进位位与R6内容相加

ADDC    A,R7        ; A带进位位与R7内容相加

JC      L0095   ;进位为1转移

NOP

AJMP    L0017   ;绝对转移

ORL     02H,A   ;直接地址内容与A或

ORL     02H,#02H    ; 直接地址内容与立即数或

ORL     A,#44H  ;A与立即数或

ORL     A,02H   ; A与直接地址内容或

ORL     A,@R0   ; A与R0间址内容或

ORL     A,@R1   ; A与R1间址内容或

ORL     A,R0        ; A与R0内容或

ORL     A,R1        ; A与R1内容或

ORL     A,R2        ; A与R2内容或

ORL     A,R3        ; A与R3内容或

ORL     A,R4        ; A与R4内容或

ORL     A,R5        ; A与R5内容或

ORL     A,R6        ; A与R6内容或

ORL     A,R7        ; A与R7内容或

JNC     L0017   ;进位为0转移

ACALL   L0017   ;绝对调用

ANL     02H,A   ; 直接地址与A与

ANL     02H,#02H    ; 立即数与直接地址与

ANL     A,#02H  ; A与立即数与

ANL     A,02H   ;A与直接地址与

ANL     A,@R0   ; A与R0间址与

ANL     A,@R1   ; A与R1间址与

ANL     A,R0        ; A与R0与

ANL     A,R1        ; A与R1与

ANL     A,R2        ; A与R2与

ANL     A,R3        ; A与R3与

ANL     A,R4        ; A与R4与

ANL     A,R5        ; A与R5与

ANL     A,R6        ; A与R6与

ANL     A,R7        ; A与R7与

JZ      L0084   ;A为零转移

L0084:  AJMP    L0017   ;绝对转移

XRL     01H,A   ;直接地址与A异或

XRL     02H,#01H    ; 直接地址与立即数异或

XRL     A,#01H  ;A与立即数异或

XRL     A,01H   ; A与直接地址异或

XRL     A,@R0   ; A与R0间址址异或

XRL     A,@R1   ; A与R1间址址异或

XRL     A,R0        ; A与R0异或

XRL     A,R1        ; A与R1异或

XRL     A,R2        ; A与R2异或

XRL     A,R3        ; A与R3异或

XRL     A,R4        ; A与R4异或

L0095:  XRL     A,R5        ; A与R5异或

XRL     A,R6        ; A与R6异或

XRL     A,R7        ; A与R7异或

JNZ     L0084   ;A不为零转

L009A:  ACALL   L0084   ;绝对调用

ORL     C,01H   ;直接位或到进位

JMP     @A+DPTR;相对于DPTR间接转

MOV     A,#01H  ;立即数送A

MOV     01H,#02H    ;立即数送直接地址

MOV     @R0,#01H    ;立即数送间址R0

MOV     @R1,#02H    ; 立即数送间址R1

MOV     R0,#01H ; 立即数送R0

MOV     R1,#01H ; 立即数送R1

MOV     R2,#01H ; 立即数送R2

MOV     R3,#01H ; 立即数送R3

MOV     R4,#01H ; 立即数送R4

MOV     R5,#01H ; 立即数送R5

MOV     R6,#01H ; 立即数送R6

MOV     R7,#01H ; 立即数送R7

SJMP    L00BA   ;短转移

L00BA:  AJMP    L0095   ;绝对转移

ANL     C,02H   ;直接地址与进位与

ORG     00C0H   ;

MOV     02H,01H ;直接地址送直接地址

MOV     01H,@R0;间址R0送直接地址

MOV     01H,@R1; 间址R1送直接地址

MOV     01H,R0  ; R0送直接地址

MOV     01H,R1  ; R1送直接地址

MOV     01H,R2  ; R2送直接地址

MOV     01H,R3  ; R3送直接地址

MOV     01H,R4  ; R4送直接地址

MOV     01H,R5  ; R5送直接地址

MOV     01H,R6  ; R6送直接地址

MOV     01H,R7  ; R7送直接地址

NOP

MOV     DPTR,#1234H;建立数据指针地址为1234H

ACALL   L00BA   ;绝对调用

MOV     03H,C   ;进位送03H位(即20H的03位)

MOVC    A,@A+DPTR   ;由A+DPTR寻扯的程序存贮器字节送A

SUBB    A,#01H  ;A减去立即数和进位位

SUBB    A,02H   ; A减去直接地址内容和进位位

SUBB    A,@R0   ; A减去R0间接RAM和进位位

SUBB    A,@R1   ; A减去R1间接RAM和进位位

SUBB    A,R0        ; A减去R0和进位位

SUBB    A,R1        ; A减去R1和进位位

SUBB    A,R2        ; A减去R2和进位位

SUBB    A,R3        ; A减去R3和进位位

SUBB    A,R4        ; A减去R4和进位位

SUBB    A,R5        ; A减去R5和进位位

SUBB    A,R6        ; A减去R6和进位位

SUBB    A,R7        ; A减去R7和进位位

ORL     C,/00H  ;直接位的反或到进位

AJMP    L0084   ;绝对转移

MOV     C,03H   ;直接位数送进位

INC     DPTR        ;数据指针加1

MUL     AB      ;A乘以B

NOP               ;A5H为二字节空操作指令

NOP

MOV     @R0,05H ;直接字芯送R0间接RAM

MOV     @R1,05H ; 直接字芯送R1间接RAM

MOV     R0,05H  ; 直接字芯送R0

MOV     R1,05H  ; 直接字芯送R1

S0100:  MOV     R2,05H  ; 直接字芯送R2

MOV     R3,05H  ; 直接字芯送R3

MOV     R4,05H  ; 直接字芯送R4

MOV     R5,05H  ; 直接字芯送R5

MOV     R6,05H  ; 直接字芯送R6

MOV     R7,05H  ; 直接字芯送R7

ANL     C,/04H  ; 直接位的反与到进位

ACALL   S0100   ;绝对调用

CPL     04H     ;直接位取反

CPL     C       ;进位取反

CJNE    A,#01H,L0139    ;立即数与A比较,不相等则转移

CJNE    A,01H,L0139     ; 直接字节与A比较,不相等则转移

CJNE    @R0,#01H,L0139  ; 立即数与R0间接RAM比较,不相等则转移

CJNE    @R1,#01H,L0139  ; 立即数与R1间接RAM比较,不相等则转移

CJNE    R0,#01H,L0139   ; 立即数与R0比较,不相等则转移

CJNE    R1,#01H,L0139   ; 立即数与R1比较,不相等则转移

CJNE    R2,#01H,L0139   ; 立即数与R2比较,不相等则转移

CJNE    R3,#01H,L0139   ; 立即数与R3比较,不相等则转移

CJNE    R4,#01H,L0139   ; 立即数与R4比较,不相等则转移

CJNE    R5,#01H,L0139   ; 立即数与R5比较,不相等则转移

CJNE    R6,#01H,L0139   ; 立即数与R6比较,不相等则转移

CJNE    R7,#01H,L0139   ; 立即数与R7比较,不相等则转移

PUSH    00H     ;直接字节进栈,SP加1

L0139:  AJMP    L0084   ;绝对转移

CLR     04H     ;直接位清零

CLR     C       ;清零进位

SWAP    A       ;A左环移四位(A的二个半字节交换)

XCH     A,05H   ;交换A和直接字节

XCH     A,@R0   ; 交换A和R0间接RAM

XCH     A,@R1   ; 交换A和R1间接RAM

XCH     A,R0        ; 交换A和R0

XCH     A,R1        ; 交换A和R1

XCH     A,R2        ; 交换A和R2

XCH     A,R3        ; 交换A和R3

XCH     A,R4        ; 交换A和R4

XCH     A,R5        ; 交换A和R5

XCH     A,R6        ; 交换A和R6

XCH     A,R7        ; 交换A和R7

POP     00H     ;直接字节出栈,SP减1

ACALL   L0139   ;绝对调用

SETB    03H     ;置位直接位

SETB    C       ;置位进位

DA      A       ;A的十进制加法调熊

DJNZ    01H,L0139       ;直接字节减1,不为零则转移

XCHD    A,@R0   ;交换A和R0间接RAM的低4位

XCHD    A,@R1   ; 交换A和R1间接RAM的低4位

L0158:  DJNZ    R0,L0139                ; R0减1,不为零则转移

DJNZ    R1,L0158                ; R1减1,不为零则转移

DJNZ    R2,L0158                ; R2减1,不为零则转移

DJNZ    R3,L0158                ; R3减1,不为零则转移

DJNZ    R4,L0158                ; R4减1,不为零则转移

DJNZ    R5,L0158                ; R5减1,不为零则转移

DJNZ    R6,L0158                ; R6减1,不为零则转移

DJNZ    R7,L0158                ; R7减1,不为零则转移

MOVX    A,@DPTR     ;外部数据(16位地址)送A

L0169:  NOP

AJMP    L0139           ;绝对转移

MOVX    A,@R0       ;R0间址即外部数据(8位地址)送A

MOVX    A,@R1       ; R1间址即外部数据(8位地址)送A

CLR     A           ;清零A

MOV     A,05H       ;直接字节送A

MOV     A,@R0       ;R0间接RAM送A

MOV     A,@R1       ; R1间接RAM送A

MOV     A,R0        ; R0送A

MOV     A,R1        ; R1送A

MOV     A,R2        ; R2送A

MOV     A,R3        ; R3送A

MOV     A,R4        ; R4送A

MOV     A,R5        ; R5送A

MOV     A,R6        ; R6送A

MOV     A,R7        ; R7送A

MOVX    @DPTR,A     ;A送外部数据(16位地址)

NOP

ACALL   L0169   ;绝对调用

MOVX    @R0,A   ;A送R0间址即外部数据(8位地址)

MOVX    @R1,A   ; A送R1间址即外部数据(8位地址)

CPL     A       ;A取反

MOV     05H,A   ;A送直接字节

MOV     @R0,A   ; A送R0间址即间接RAM

MOV     @R1,A   ; A送R1间址即间接RAM

MOV     R0,A        ; A送R0

MOV     R1,A        ; A送R1

MOV     R2,A        ; A送R2

MOV     R3,A        ; A送R3

MOV     R4,A        ; A送R4

MOV     R5,A        ; A送R5

MOV     R6,A        ; A送R6

MOV     R7,A        ; A送R7

END

51的汇编控制指令详细列表 8051 INSTRUCTION SET
1.Arithmetic operations:
    Mnemonic            Byte    Cyc
    ADD   A,@Ri 1 1
    ADD   A,Rn 1 1        
    ADD   A,direct 2 1        
    ADD   A,#data 2 1        
    ADDC  A,@Ri 1 1           
    ADDC  A,Rn 1 1     
    ADDC  A,direct 2 1           
    ADDC  A,#data 2 1     
    SUBB  A,@Ri 1 1     
    SUBB  A,Rn 1 1     
    SUBB  A,direct 2 1     
    SUBB  A,#data 2 1     
    INC   A 1 1
    INC   @Ri 1 1
    INC   Rn 1 1
    INC   DPTR 1 1
    INC   direct 2 1
    INC   direct 2 1
    DEC   A 1 1
    DEC   @Ri 1 1
    DEC   Rn 1 1
    DEC   direct 2 1

【汇编指令】MSP430汇编指令

2012-05-15 18:32:50

指    令        操作数位置及执行过程        说    明        状 态 位
代 码        源操作数  目的操作数        指令执行过程详述        VNZC
ADC[.W]或ADC.B        dst dst+C->dst        进位C 加至目的操作数 目的操作数以前的内容丢失        ****
ADD[.W]或ADD.B        src,dst src+dst->dst        源操作数加至目的操作数源操作数不受影响目的操作数以前的内容丢失        ****
ADDC[.W]或ADDC.B        src,dst src+dst+C->dst        源操作数和进位C 加至目的操作数源操作数不受影响目的操作数以前的内容丢失        ****
AND[.W]或AND.B        src,dst src.and.dst->dst        源操作数和目的操作数逻辑与结果放入目的操作        0***
BIC[.W]或BIC.B        src,dst not.src.and.dst->dst        求反后的源操作数和目的操作数逻辑与结果放入目的操作数源操作数不变        ----
BIS[.W]或BIS.B        src,dst src.or.dst->dst        源操作数和目的操作数逻辑或 结果放入目的操作数 源操作数不变        ----
BIT[.W]或BIT.B        src,dst src.and.dst        源操作数和目的操作数逻辑与其结果只影响状态位目的操作数和源操作数不变        0***
BR        dst转移到        无条件转移到64K 地址空间的任一地址处可使用所有的源寻址方式转换指令是一个字指令        ----
CALL        dstPC+2->堆栈,dst->PC        调用64K 地址空间中任一地址处的子程序可使用所有的寻址方式返回地址(后续指令的地址)储存在堆栈中调用指令是一个字指令        ----
CLR[.W]或CLR.B        dst清除目的操作数        清除目的操作数        ----
CLRC        清除进位位        进位位被清零清除进位位指令是一个字指令        ---0
CLRN        清除负位        常数#04H 求反后(0FFFBH)和目的操作数逻辑与结果放入目的操作数清除负位指令是一个字指令        -0--
CLRZ        清除零位        常数#02H 求反后(0FFFDH)和目的操作数逻辑与结果放入目的操作数清除负位指令是一个字指令        --0-
CMP[.W]或CMP.B        dstdst-src        从目的操作数中减去源操作数方法是将源操作数求反再加 1,源操作数和目的操作数不受影响不保存结果只影响状态位        ****
DADC[.W]或DADC.B        dst dst+C->dst(十进制)        进位位C 作为十进制加至目的操作数        ****
DADD[.W]或DADD.B        src,dst src+dst+C->dst(十进制)        源操作数和目的操作数被当作4 个带有正符号的二-十进制BCD 数十进制的源操作数和进位C 被加至目的操作数源操作数不受影响目的操作数以前的内容丢失些结果对于非二-十进制数是不确定的        ****
DEC[.W]或DEC.B        dst dst-1->dst        目的操作数减1 以前的内容丢失        ****
DECD[.W]或DECD.B        dst dst-2->dst        目的操作数减2 以前的内容丢失        ****
DINT

MSP430汇编:

1、MOV,MOVX,MOVC区别和用法

MOV就是移动的意思,C就是Code,代码的意思,X就是eXternal,外部的意思MOVC就是读代码存储器,MOVX就是读写外部存储器,即外部RAM

  MOV: 单片机内部的寄存器或者存储器之间相互传递数据(内部RAM);MOVX: 单片机内部的A累加器与片外的数据存储器(片外RAM)传送数据.MOVC: 单片机内部的A累加器向ROM(程序存储器)读取数据,因为程序存储器是固定的不可以写的,所以,A只能读数据,却不能向它写数据;换句话说MOVX和 MOVC是针对两种不同的存储器而言,一个是片外数据存储器,另一个却是程序存储器。由于内部和外部ROM的地址是连续的,故用MOVC一条指令即可;片内数据存储器与片外数据存储器的地址部分(0000H-00FFH)是重叠的,所以用MOV和MOVX加以区分。明确MOV,MOVX,MOVC的概念针对他们各自的用法进行调用

PDF 资料下载:http://www.eeplace.com/dm/3958/cn/2.pdf

IAR下的汇编/单片机启动代码汇编

原文:ARM下启动代码 - 移动操作系统-Chinaunix

1、

IAR汇编指令SFB和SFE

SFB Segment begin 段开始
语法格式
SFB(segment [{+|-} offset])
参数
segment: 可重定位段的段名, 必须在SFB使用前已定义
offset : 从开始地址的偏移, 是一个可选参数, 当偏移量省略时, 可以不添加小括号
描述
SFB 右边可以接受一个操作数, 而且这个操作数必须是一个可重位段的段名.
这个操作符计算段的首字节地址. 这个操作发生在连接时.

NAME demo
RSEG CODE
start: DC16 SFB(CODE)
即使上面的代码和多个其他的模块进行连接, start标号处仍被置为段的首字节地址

语法格式
SFE (segment [{+|-} offset])
参数
segment: 可重定位段的段名, 必须在SFB使用前已定义
offset : 从开始地址的偏移, 是一个可选参数, 当偏移量省略时, 可以不添加小括号
描述
SFE在其右边接收一个操作数. 操作数必须是一个可重定位段的段名. SFE操作符将段起始地址和段大小相加. 这个操作在连接时发生.
SFE accepts a single operand to its right. The operand must be the name of a relocatable segment. The operator evaluates to the segment start address plus the segment size. This evaluation takes place at linking time.

NAME demo
RSEG CODE
end: DC16 SFE(CODE)
即使当上面的代码被和多个模块想连接时, end标号仍然会被置为段最后一个字节的地址. Even if the above code is linked with many other modules, end will still be set to the address of the last byte of the segment.
段MY_SEGMENT的大小可以通过以下方式计算而得:
SFE(MY_SEGMENT)-SFB(MY_SEGMENT)


arm中的几种跳转

arm汇编的跳转指令无非是b和ldr。但是如果没有足够理解,别人灵活的用一下你就犯晕了。

首先我们要知道两者的两个本质区别:

1、b是位置无关的,ldr不是位置无关的。

2、b的范围只能是+—32MB,而ldr是4GB。

在arm的启动汇编的中断向量表是必然用跳转指令的,但是就是这里也有很多实现形式:

方式1:
                B           InitReset           ; 0x00 Reset handler
undefvec:
                B           undefvec            ; 0x04 Undefined Instruction
swivec:
                B           swivec              ; 0x08 Software Interrupt
pabtvec:
                B           pabtvec             ; 0x0C Prefetch Abort
dabtvec:
                B           dabtvec             ; 0x10 Data Abort
rsvdvec:
                B           rsvdvec             ; 0x14 reserved
irqvec:
                B

ARM 汇编&ARM 指令集 学习笔记

2012-10-25 21:21:25

ARM 处理器寻址方式

1、寄存器寻址

操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值操作

MOV R1,R2 ;R2 -> R1
SUB R0,R1,R2 ;R1 - R2 -> R0

2、立即寻址

地址码部分就是操作数,(操作数)立即数就在指令中

SUBS R0,R0,#1 ;R0 – 1 -> R0
MOV R0,#0xff00 ;0xff00 -> R0

3、寄存器偏移寻址

MOV R0,R2,LSL #3 ;R2 的值左移3 位,结果放入R0,即R0 = R2 * 8
ANDS R1,R1,R2,LSL R3 ;R2 的值左移R3 位,然后和R1 相与操作,结果放入R1

4、寄存器间接寻址

寄存器为操作数的地址指针

LDR R1,[R2] ;将R2 中的数值作为地址,取出此地址中的数据保存在R1 中
SWP R1,R1,[R2];将如中的数值作为地址,取出此地址中的数值与R1 中的值交换

5、基址寻址

将基址寄存器的内容与偏移量相加,形成操作数的有效地址,用于访问寄存器附近存储单元

LDR R2,[R3,#0x0F] ;将R3 中的数值加0x0F 作为地址,取出此地址的数值保存在R2 中
STR R1,[R0,#-2] ;将R0 中的数值减2 作为地址,把R1 中的内容保存到此地址位置

6、多寄存器寻址

多寄存器寻址就是一次可以传送几个寄存器值,允许一条指令传送 16 个寄存器的任何子集或所有寄存器。

LDMIA R1!,{R2-R7,R12} ;将R1 单元中的数据读出到R2-R7,R12,R1 自动加1
STMIA R0!,{R3-R6,R10};将R3-R6,R10 中的数据保存到R0 指向的地址,R0 自动加1

7、堆栈寻址

堆栈是特定顺序进行存取的存储区,操作顺序分为“后进先出”和“先进后出”,
堆栈寻址时隐含的,它使用一个专门的寄存器(堆栈指针)指向一块存储区域(堆栈),
指针所指向的存储单元就是堆栈的栈顶。存储器堆栈可分为两种:
向上生长:向高地址方向生长,称为递增堆栈
向下生长:向低地址方向生长,称为递减堆栈
堆栈指针指向最后压入的堆栈的有效数据项,称为满堆栈;堆栈指针指向下一个要
放入的空位置,称为空堆栈。这样就有4 中类型的堆栈表示递增和递减的满堆栈和空堆
栈的各种组合。
满递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向内含有效数据项的
最高地址。指令如LDMFA,STMFA 等。
空递增:堆栈通过增大存储器的地址向上增长,堆栈指针指向堆栈上的第一个空
位置。指令如LDMEA,STMEA 等。??????????????????

满递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向内含有效数据项的最
低地址。指令如LDMFD,STMFD 等。
空递减:堆栈通过减小存储器的地址向下增长,堆栈指针指向堆栈下的第一个空
位置。指令如LDMED,STMED 等。

STMFD SP!,{R1-R7,LR} ; 将R1~R7,LR 入栈。满递减堆栈。
LDMFD SP!,{R1-R7,LR} ;数据出栈,放入R1~R7,LR 寄存器。满递减堆栈。

8、块拷贝寻址

多寄存器传送指令用于一块数据从存储器的某一位置拷贝到另一位置。

块拷贝寻址指令举例如下:
STMIA R0!,{R1-R7} ;将R1~R7 的数据保存到存储器中,存储器指针在保存第一
                  ;个值之后增加,增长方向为向上增长。
STMIB R0!,{R1-R7} ;将R1~R7 的数据保存到存储器中,存储器指针在保存第一
                  ;个值之前增加,增长方向为向上增长。
STMDA R0!,{R1-R7} ;将R1~R7 的数据保存到存储器中,存储器指针在保存第一
                  ;个值之后增加,增长方向为向下增长。
STMDB R0!,{R1-R7} ;将R1~R7 的数据保存到存储器中,存储器指针在保存第一
                  ;个值之前增加,增长方向为向下增长。

9、相对寻址

相对寻址是基址寻址的一种变通,由程序计数器 PC 提供基准地址,指令中的地址
码字段作为偏移量,两者相加后得到的地址即为操作数的有效地址。

BL ROUTE1 ;调用到ROUTE1 子程序
BEQ LOOP ;条件跳转到LOOP 标号处

LOOP MOV R2,#2    ;(PC+#2)->R2


ROUTE1

二、ARM 指令集

基本格式
<opcode>{<cond>}{S} <Rd>,<Rn>{,<opcode2>}
其中,<>内的项是必须的,{}内的项是可选的,如<opcode>是指令助记符,是必须
的,而{<cond>}为指令执行条件,是可选的,如果不写则使用默认条件AL(无条件执行)。

opcode                     指令助记符,如LDR,STR 等
cond                       执行条件,如EQ,NE 等
S                          是否影响CPSR 寄存器的值,书写时影响CPSR,否则不影响
Rd                         目标寄存器
Rn                         第一个操作数的寄存器
operand2                   第二个操作数

指令格式举例如下:
LDR R0,[R1]               ;读取R1 地址上的存储器单元内容,执行条件AL
BEQ DATAEVEN              ;跳转指令,执行条件EQ,即相等跳转到DATAEVEN
ADDS R1,R1,#1 ;            加法指令,R1+1=R1 影响CPSR 寄存器,带有S
SUBNES R1,R1,#0xD;        条件执行减法运算(NE),R1-0xD=>R1,影响CPSR 寄存器,带有S

在 ARM 指令中,灵活的使用第2 个操作数能提高代码效率,第2 个操作数的形式如
下:
#immed_8r
常数表达式,该常数必须对应8 位位图,即常数是由一个8 位的常数循环移位偶数

MOV R0,#1 ;R0=1
AND R1,R2,#0x0F ;R2 与0x0F,结果保存在R1
LDR R0,[R1],#-4 ;读取R1 地址上的存储器单元内容,且R1=R1-4

Rm
寄存器方式,在寄存器方式下操作数即为寄存器的数值。
寄存器方式应用举例:
SUB R1,R1,R2 ;R1-R2=>R1
MOV PC,R0 ;PC=R0,程序跳转到指定地址
LDR R0,[R1],-R2 ;读取R1 地址上的存储器单元内容并存入R0,且R1=R1-R2

Rm,shift
寄存器移位方式。将寄存器的移位结果作为操作数,但 RM 值保存不变,移位方法
如下:
ASR #n 算术右移n 位(1≤n≤32)
LSL #n 逻辑左移n 位(1≤n≤31)
LSR #n 逻辑左移n 位(1≤n≤32)
ROR #n 循环右移n 位(1≤n≤31)
RRX 带扩展的循环右移1 位
type Rs 其中,type 为ASR,LSL,和ROR 中的一种;Rs 偏移量寄存器,低8
位有效,若其值大于或等于32,则第2 个操作数的结果为0(ASR、ROR
例外)。
寄存器偏移方式应用举例:
ADD R1,R1,R1,LSL #3 ;R1=R1*9

SUB R1,R1,R2,LSR#2 ;R1=R1-R2*4
R15 为处理器的程序计数器PC,一般不要对其进行操作,而且有些指令是不允许使
用R15,如UMULL 指令

条件码
使用指令条件码,可实现高效的逻辑操作,提高代码效率。

对于Thumb 指令集,只有B 指令具有条件码执行功能,此指令条件码同表2.1,但如果为无条件执行时,条件码助记符“AL”不能在指令中书写。

条件码应用举例如下:
比较两个值大小,并进行相应加1 处理,C 代码为
if(a>b)a++;
else b++;

对应的ARM 指令如下。其R0 为a,R1 为b。
CMP R0,R1 ;             R0 与R1 比较
ADDHI R0,R0,#1 ;       若R0>R1,则R0=R0+1
ADDLS R1,R1,#1 ;       若R0<=R1,则R1=R1+1

若两个条件均成立,则将这两个数值相加,C 代码为

If((a!=10)&&(b!=20)) a=a+b;

对应的ARM 指令如下.其中R0 为a,R1 为b.
CMP R0,#10 ;比较R0 是否为10
CMPNE R1,#20 ;若R0 不为10,则比较R1 是否20
ADDNE R0,R0,R1 ;若R0 不为10 且R1 不为20,指令执行,R0=R0+R1

ARM 存储器访问指令

ARM是RISC 处理器,对存储器的访问只能使用加载和存储指令实现。

【单片机】汇编指令入门学习|单片机启动代码汇编相关推荐

  1. wxpython视频教程-单片机C语言入门_单片机教程_单片机编程语言 - C语言网

    本教程由 继承叔 编写,面向对单片机有基础认知的初学者! 1.单片机了解 单片机是一块集成电路的控制芯片,我们熟知的家电例如洗衣机的定时控制和滚筒运作,电饭煲的保温功能和鸣叫提醒,电冰箱,空调等等这些 ...

  2. 汇编指令的学习1——ARM汇编的特点

    以下内容源于朱友鹏<物联网大讲堂>的课程学习,如有侵权,请告知删除. 1.指令和伪指令 指令是CPU机器指令的助记符,经过编译(汇编器加工)后会得到一串10组成的机器码,可以由CPU读取执 ...

  3. 【嵌入式·单片机】老生常谈:学习单片机和嵌入式是否需要学习算法?

    文章目录 前言 什么是算法 嵌入式是否需要算法 如何学习算法 参考资料 前言 刚学习单片机或嵌入式的同学可能会听说过「算法」这个词,部分电子信息类专业的同学也会在自己的培养计划上看到<数据结构与 ...

  4. Vertx入门学习(含代码)

    Vertx入门学习 一.Vertx是什么? 二.Vertx基本概念 三.Vertx能干什么? 四.Vertx的技术体系 五.快速体验:搭建一个简单的Vertx项目并输出Hello World 六.单元 ...

  5. Linux指令入门学习

    此文为本人学习b站狂神说的Linux课程所作的笔记,内容较乱仅供个人后续复习所用. 加粗均为指令 一.开关机 开机后会启动很多程序,在windows中叫做服务,Linux中叫做守护线程 开机后用户需要 ...

  6. ARM64汇编指令入门

    一:寄存器: 1.查看寄存器的方式,xcode连接真机,断点后,输入register read可查看arm64所有的寄存器. 有: x0~x7:传递子程序的参数和返回值,使用时不需要保存,多余的参数用 ...

  7. c语言进位加汇编指令,共同学习hcs08的汇编指令,快速掌握

    简单的介绍,hcs08的指令集,能够看懂c代码的汇编编译,方便硬件调试. 常用的伪指令: 1. 伪地址 ORG $C000 ;定义中断时用到 2. 伪字节 FCB $01,,$02,$03 : 3.伪 ...

  8. 汇编指令的学习2——常用的ARM指令

    一.常用ARM指令1:数据处理指令 (1)数据传输指令 mov mvn(源目标按位取反后赋给目标) (2)算术指令 add sub rsb adc sbc rsc (3)逻辑指令 and orr eo ...

  9. python代码测试_Python入门学习系列——Python代码测试

    Python代码测试 对于编写的代码,可以使用unittest模块中的相关方法进行测试. 测试函数 首先定义一个简单的函数,该函数用来合并名称并返回. name_function.py: def ge ...

最新文章

  1. Quartz.Net 1.30的一些设置说明
  2. 浅谈如何在C#Winform程序中正确使用登录窗体
  3. JProfiler 5.1.4的使用方法
  4. 时钟php,php+js液晶时钟
  5. 睡眠者效应(Sleeper Effect):当下被拒绝,但其实已经
  6. mac乱码 飞秋_ubuntu 下安装 dukto
  7. oracle索引有哪些分类,Oracle中的索引分类
  8. 图论(5)邻接谱,邻接代数,图空间,托兰定理
  9. CSDN超实用的浏览器插件—去自家网站/搜索广告、超快捷万能搜索、各种实用小功能等诸多功能等你探索
  10. 百度快照投诉技巧案例分析百度快照就是这样刷出来的
  11. 微信小程序php签到功能,小程序签到功能的作用
  12. 【前端】报错TypeError: Cannot create property ‘xxx‘ on string ‘xxx‘
  13. 完整版:交换机工作过程和原理
  14. 基于深度学习的视觉三维重建研究总结2进阶
  15. c语言取位,C语言位操作
  16. 深思数盾助力海康机器人,全新VM4.2乘风破浪,安全起航
  17. 个推的推送消息延迟的一个原因记录
  18. 美国2012政治献金数据分析(附有源数据和题目)
  19. 编程题005--判断是不是平衡二叉树--niuke
  20. 变频器按启动没反应_变频器常见故障处理

热门文章

  1. matlab应用测试,moocMATLAB程序与应用单元测试答案
  2. 【虎书】Fundamentals of Computer Graphics(Fourth Edition)第二章习题解答
  3. 经常性无法访问某些国内网站的问题(by quqi99)
  4. 调查显示80后离职率最高 薪水低为辞职第一理由
  5. react中使用AlipayJSBridge 支付宝支付调用接口在H5网页的应用
  6. J2ME移动开发平台搭建篇
  7. Web项目经理手册之项目经理需要铭记在心的话
  8. 【虚幻引擎UE】UE5 简单实现范围计算并绘制圆圈
  9. 常见的五种神经网络(4)-深度信念网络(下)篇之深度信念网络的原理解读、参数学习
  10. 第三章 LD3320语音识别模块的使用