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

 目录

汇编指令入门学习

【汇编指令】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 处理器,对存储器的访问只能使用加载和存储指令实现。

posted on 2022-10-04 01:30  bdy  阅读(598)  评论(0编辑  收藏  举报

导航