zoukankan      html  css  js  c++  java
  • ARM基础

    ARM基础

     

    ARM主要有7个基本工作模式

    • User:非特选模式,大部分任务执行在这种模式
    • FIQ:当一个高优先级(fast)中断产生时会进入这种模式
    • IRQ:当一个低优先级(normal)中断产生时将会进入这种模式
    • Supervisor:当复位或软中断指令时将会进入这种模式
    • Abort:当存取异常时将会进入这种模式
    • Undef:当执行未定义指令时会进入这种模式
    • System:使用和User模式相同寄存器集的特权模式

    ARM有37个寄存器

    • 1个用作PC(Program Counter)
    • 1个作用CPSR(Current Program Status Register)
    • 5个作用SPSR(Saved Program Status Registers)
    • 30个通用寄存器

    CPSR寄存器

    汇编基础

    1: 基本结构

    DATAS SEGMENT
        ;此处输入数据段代码  
    DATAS ENDS
    
    STACKS SEGMENT
        ;此处输入堆栈段代码
    STACKS ENDS
    
    CODES SEGMENT
        ASSUME CS:CODES,DS:DATAS,SS:STACKS ;段寻址伪指令用来指明段与段寄存器的对应关系
    START:
        MOV AX,DATAS
        MOV DS,AX
        ;此处输入代码段代码
        MOV AH,4CH ;
        INT 21H ; dos系统调用系统终端 执行AH程序中程序退出指令
    CODES ENDS
        END START ; 指定开始的地址

    2:基本指令

      

    一、数据传送指令

    1、传送指令:MOV (move)

    (1) CPU内部寄存器之间的数据传送,如:mov ah,al

    (2) 立即数送至通用寄存器(非段寄存器)或存储单元,如:mov al,3 mov [bx],1234h

    (3) 寄存器与存储器间的数据传送,如:mov ax,var mov ax,[bx]

    二、堆栈操作指令

    1、进栈指令:push

    格式:push src
    功能: 把16位数据src压入堆栈。
    注: 源操作数src可以是通用寄存器和段寄存器,也可以是字存储单元

    如: push si
    push [si]
    push var ;var是16位(字)变量
    2、出栈指令:pop

    格式:pop dst
    功能:从堆栈弹出16位数据至dst
    注: dst可以是通用寄存器和段寄存器,但不能是CS,可以是字存储单元

    如: pop si
    pop [si]
    pop var ;var是字变量

    三 加减运算指令

    (1) add(Addtion)
    格式:add OPRD1,OPRD2
    功能:OPRD1 = OPRD1 + OPRD2
    注: 影响FLAG

    如:add al,5
    add bl,var ;var是字节变量
    add var,si ;var是字变量

    (2) adc(add with Carry) ;带进位的加法
    格式:adc OPRD1,OPRD2
    功能:带进位的加法,OPRD1 = OPRD1 + OPRD2 + CF
    注: 影响FLAG,主要用于多字节运算

    如: adc al,[bx]
    adc dx,ax
    adc dx,var ;var是字变量

    (3) inc(Increment)
    格式:inc OPRD
    功能:OPRD = OPRD + 1
    注: 不影响CF

    如:inc al
    inc var ;var是字节变量,也可以是字变量
    inc cx

    2、减法指令:sub、sbb、dec、neg、cmp

    (1) sub(Subtraction)
    格式:sub OPRD1,OPRD2
    功能:OPRD1 = OPRD1 - OPRD2

    如: sub ah,12
    sub bx,bp
    sub al,[bx]
    sub [BP],AX
    sub AX,VAR ;VAR是字变量

    (2) sbb(Sub with Borrow)
    格式:sbb OPRD1,OPRD2
    功能:OPRD1 = OPRD1 - OPRD2 - CF
    注: 主要用于多字节数相减的情况

    (3) dec(decrement)
    格式:dec OPRD
    功能:OPRD = OPRD - 1
    注: 操作数OPRD可以是通用寄存器,也可以是存储单元。相减时把操作数作为一个无符号数对待,这条指令影响ZF、SP、OF、PF、AF,但不影响CF,该指令主要用于调整地址指针和计数器。

    (4) neg(Negate)
    格式:NEG OPRD
    功能:对操作数取补,即OPRD = 0 - OPRD
    注: 操作数可以是通用寄存器,也可以是存储单元。此指令结果影响CF、ZF、OF、AF、PF,一般会使CF为1,除非OPRD=0

    (5) cmp(Compare)
    格式:cmp OPRD1,OPRD2
    功能:执行OPRD1 - OPRD2,但运算结果不运送到OPRD1
    注: 该指令通过OPRD - OPRD2影响标志位CF、ZF、SF、OF、AF、PF来判断OPRD1和OPRD2的大小关系。通过ZF判断是否相等;如果是无符号数,通过CF可判断大小;如果是有符号数,通过SF和OF判断大小

    四、乘除运算指令

    (1) mul(Multiply) ;无符号数乘法指令
    格式:MUL OPRD
    功能:将OPRD与AX或AL中的操作数相乘,结果保存在DX:AX中或AX中
    注: 无符号数相乘分为16位*16位和8位*8位,结果分别为32位和16位,保存在DX:AX中或AX中,其中结果为32位时,DX为高16位,AX为低16位;结果为16位时,AH为高8位,AL为低8位。

    (2) imul(Signed Multiply) ;有符号数乘法指令
    格式:IMUL OPRD
    功能:把乘数和被乘数均作为有符号数进行乘法运算。其余与mul类似
    注: 如果乘积结果的高位部分(DX或AH)不是低位的符号扩展,则CF=1,OF=1,否则CF=0,OF=0。即CF=1,OF=1表示AH或DX中含有结果的有效数。
    如果除数为0,或8位数除时商超过8位,16位数除时商超过16位,则认为是除溢出,引起0号中断。除法指令对标志位的影响无定义。

    2、除法指令:div、idiv

    (1) div(Division) ;无符号数除法指令
    格式:DIV OPRD
    功能:OPRD为除数,被除数存放在DX:AX或AX中,做除法,结果存放在DX:AX(DX存放余数,AX存放商)或AX(AH余数,AL商)。
    注: 8086中除法有32位除以16位和16位除以8位。前者被除数为32位,高位在DX中,低位在AX中,除数OPRD为16位通用寄存器或16位存储器操作数,结果为16位,其中16位余数存放在DX中,16位商存放在AX中;若为16位除以8位,被除数存放在AX中,OPRD为8位通用寄存器或存储器操作数,结果8位余数存放在AH中,8位商存放在AL中。

    (2) idiv(Signed Division) ;有符号数除法指令
    格式:IDIV OPRD
    功能:把除数和被除数看做有符号数做除法,其余与div类似

    3、符号扩展指令:cbw、cwd

    (1) cbw(Convert Byte to Word)
    格式:CBW
    功能:把寄存器AL中的符号位扩展到寄存器AH

    (2) cwd(Convert Word to Double Word)
    格式:CWD
    功能:把寄存器AX中的符号扩展到寄存器DX

    五、逻辑运算和移位指令

    (1) NOT
    格式:NOT OPRD
    功能:把操作数OPRD取反,然后送回OPRD。
    注: OPRD可以是通用寄存器,也可以是存储器操作数,此指令对标志没有影响

    (2) AND
    格式:AND OPRD1,OPRD2
    功能:对两个操作数进行按位逻辑“与”运算,结果送到OPRD1中
    注: 该指令执行后,CF=0,OF=0,标志PF、ZF、SF反映运算结果,AF未定义。
    某个操作数与自身相与,值不变,但可以使CF置0。

    (3) OR
    格式:OR OPRD1,OPRD2
    功能:对两个操作数进行按位逻辑“或”运算,结果送到OPRD1中
    注: 该指令执行后,CF=0,OF=0,标志PF、ZF、SF反映运算结果,AF未定义。
    某个操作数与自身相或,值不变,但可以使CF置0。

    (4) XOR
    格式:XOR OPRD1,OPRD2
    功能:对两个操作数进行按位逻辑“异或”运算,结果送到OPRD1中
    注: 该指令执行后,CF=0,OF=0,标志PF、ZF、SF反映运算结果,AF未定义。

    (5) TEST
    格式:TEST OPRD1,OPRD2
    功能:把OPRD1与OPRD2按位“与”,但结果不送到OPRD1中,仅影响标志位。
    注: 该指令执行后,CF=0,OF=0,标志PF、ZF、SF反映运算结果。常用于检测某些位是否为1

    2、一般移位指令:SAL/SHL,SAR/SHR

    (1) SAL/SHL(Shift Arithmetic Left / Shift Logic Left) ;算术左移/逻辑左移
    格式:SAL OPRD,m
    SHL OPRD,m
    功能:把操作数OPRD左移m位,每移动一位,右边用0补足1位,移出的最高位进入标志位CF
    注: 算术左移和逻辑左移进行相同的动作,为了方便提供了两个助记符。

    (2) SAR(Shift Arithmetic Right) ;算数右移指令
    格式:SAR OPRD,m
    功能:操作数右移m位,同时每移1位,左边的符号位保持不变,移出的最低位进入标志位CF
    注: 对有符号数和无符号数,算数右移1位相当于除以2

    (3) SHR(Shift Logic Right) ;逻辑右移指令
    格式:SHR OPRD,m
    功能:操作数右移m位,同时每移1位,左边用0补足,移出的最低位进入标志位CF
    注: 对无符号数,逻辑右移1位相当于除以2

    3、循环移位指令:ROL、ROR、RCL、RCR

    4 、循环指令:LOOP、LOOPE/LOOPZ、LOOPNE/LOOPNZ、JCXZ

    (1) Loop ;计数循环指令
    格式:loop 标号
    功能:使转移标号与Loop指令间的指令循环执行CX次
    原理:指令执行至loop时,cx减1,如果cx不为0,则跳转至标号处,否则继续执行下一条指令
    即:DEC CX
    JNZ 标号

    (2) LOOPE/LOOPZ ;等于/全零循环指令
    格式:LOOPE 标号
    LOOPZ 标号
    功能:该指令使CX自减1,若结果不为0,并且ZF=1,则转移至标号,否则顺序执行。注意指令本身实施的CX自减1操作不影响标志

    (3) LOOPNE/LOOPNZ ;不等于/非零循环指令
    格式:LOOPNE 标号
    LOOPNZ 标号
    功能:该指令使CX自减1,若结果不为0,并且ZF=0,则转移至标号,否则顺序执行。注意指令本身实施的CX自减1操作不影响标志

    (4) JCXZ ;跳转指令
    格式:JCXZ 标号
    功能:当寄存器CX的值为0时跳转到标号,否则顺序执行

    跳转指令汇总:

    助记符说明标志位/寄存器助记符说明标志位/寄存器
    JZ 为零跳转 ZF=1 JNO 无溢出跳转 OF=0
    JNZ 非零跳转 ZF=0 JS 有符号跳转 SF=1
    JC 进位跳转 CF=1 JNS 无符号跳转 SF=0
    JNC 无进位跳转 CF=0 JP 偶校验跳转 PF=1
    JO 溢出跳转 OF=1 JNP 奇校验跳转 PF=0
    助记符说明
    JE 相等跳转 (leftOp=rightOp)
    JNE 不相等跳转 (leftOp M rightOp)
    JCXZ CX=0 跳转
    JECXZ ECX=0 跳转
    JRCXZ RCX=0 跳转(64 位模式)
    助记符说明助记符说明
    JA 大于跳转(若 leftOp > rightOp) JB 小于跳转(若 leftOp < rightOp)
    JNBE 不小于或等于跳转(与 JA 相同) JNAE 不大于或等于跳转(与 JB 相同)
    JAE 大于或等于跳转(若 leftOp ≥ rightOp) JBE 小于或等于跳转(若 leftOp ≤ rightOp)
    JNB 不小于跳转(与 JAE 相同) JNA 不大于跳转(与 JBE 相同)
    助记符说明助记符说明
    JG 大于跳转(若 leftOp > rightOp) JL 小于跳转(若 leftOp < rightOp)
    JNLE 不小于或等于跳转(与 JG 相同) JNGE 不大于或等于跳转(与 JL 相同)
    JGE 大于或等于跳转(若 leftOp ≥ rightOp) JLE 小于或等于跳转(若 leftOp ≤ rightOp)
    JNL 不小于跳转(与 JGE 相同) JNG 不大于跳转(与 JLE 相同)

    3:通用寄存器用途

    通用寄存器的主要用途

    寄存器的分类 寄存器

    主 要 用 途

    数据

     

    寄存器

    AX

    乘、除运算,字的输入输出,中间结果的缓存

    AL

    字节的乘、除运算,字节的输入输出,十进制算术运算

    AH

    字节的乘、除运算,存放中断的功能号

    BX

    存储器指针

    CX

    串操作、循环控制的计数器

    CL

    移位操作的计数器

    DX

    字的乘、除运算,间接的输入输出

    变址
    寄存器
    SI

    存储器指针、串指令中的源操作数指针

    DI

    存储器指针、串指令中的目的操作数指针

    变址
    寄存器
    BP

    存储器指针、存取堆栈的指针

    SP

    堆栈的栈顶指针

    指令指针

    IP/EIP  
    标志位寄存器 Flag/EFlag  
    32位

    CPU的

    段寄存器

    16位CPU的

    段寄存器

    ES  附加段寄存器
    CS  代码段寄存器
    SS  堆栈段寄存器
    DS  数据段寄存器
    新增加的
    段寄存器
    FS  附加段寄存器
    GS  附加段寄存器

    4:常用DOS指令表

    表:DOS系统功能调INT 21H
     
     
     
     
     
     
    AH
    功能
    调用参数
    返回参数
    00
    程序终止(同INT 20H)
    CS=程序段前缀
     
    01
    键盘输入并回显
     
    AL=输入字符
    02
    显示输出
    DL=输出字符
     
    03
    异步通迅输入
     
    AL=输入数据
    04
    异步通迅输出
    DL=输出数据
     
    05
    打印机输出
    DL=输出字符
     
    06
    直接控制台I/O
    DL=FF(输入)
    DL=字符(输出)
    AL=输入字符
    07
    键盘输入(无回显)
     
    AL=输入字符
    08
    键盘输入(无回显)
    检测Ctrl-Break
     
    AL=输入字符
    09
    显示字符串
    DS:DX=串地址
    '$'结束字符串
     
    0A
    键盘输入到缓冲区
    DS:DX=缓冲区首地址
    (DS:DX)=缓冲区最大字符数
    (DS:DX+1)=实际输入的字符数
    0B
    检验键盘状态
     
    AL=00 有输入
    AL=FF 无输入
    0C
    清除输入缓冲区并
    请求指定的输入功能
    AL=输入功能号
    (1,6,7,8,A)
     
    0D
    磁盘复位
     
    清除文件缓冲区
    0E
    指定当前缺省的磁盘驱动器
    DL=驱动器号 0=A,1=B,...
    AL=驱动器数
    0F
    打开文件
    DS:DX=FCB首地址
    AL=00 文件找到
    AL=FF 文件未找到
    10
    关闭文件
    DS:DX=FCB首地址
    AL=00 目录修改成功
    AL=FF 目录中未找到文件
    11
    查找第一个目录项
    DS:DX=FCB首地址
    AL=00 找到
    AL=FF 未找到
    12
    查找下一个目录项
    DS:DX=FCB首地址
    (文件中带有*或?)
    AL=00 找到
    AL=FF 未找到
    13
    删除文件
    DS:DX=FCB首地址
    AL=00 删除成功
    AL=FF 未找到
    14

    顺序读

    DS:DX=FCB首地址

    AL=00 读成功
      =01 文件结束,记录中无数据
      =02 DTA空间不够
      =03 文件结束,记录不完整
    15
    顺序写
    DS:DX=FCB首地址
    AL=00 写成功
      =01 盘满
      =02 DTA空间不够
    16
    建文件
    DS:DX=FCB首地址
    AL=00 建立成功
      =FF 无磁盘空间
    17
    文件改名
    DS:DX=FCB首地址
    (DS:DX+1)=旧文件名
    (DS:DX+17)=新文件名
    AL=00 成功
    AL=FF 未成功
    19
    取当前缺省磁盘驱动器
     
    AL=缺省的驱动器号 0=A,1=B,2=C,...
    1A
    置DTA地址
    DS:DX=DTA地址
     
    1B

    取缺省驱动器FAT信息

     
    AL=每簇的扇区数
    DS:BX=FAT标识字节
    CX=物理扇区大小
    DX=缺省驱动器的簇数
    1C
    取任一驱动器FAT信息
    DL=驱动器号
    同上
    21

    随机读

    DS:DX=FCB首地址

    AL=00 读成功
      =01 文件结束
      =02 缓冲区溢出
      =03 缓冲区不满
    22
    随机写
    DS:DX=FCB首地址
    AL=00 写成功
      =01 盘满
      =02 缓冲区溢出
    23
    测定文件大小
    DS:DX=FCB首地址
    AL=00 成功(文件长度填入FCB)
    AL=FF 未找到
    24
    设置随机记录号
    DS:DX=FCB首地址
     
    25
    设置中断向量
    DS:DX=中断向量
    AL=中断类型号
     
    26
    建立程序段前缀
    DX=新的程序段前缀
     
    27

    随机分块读

    DS:DX=FCB首地址
    CX=记录数
    AL=00 读成功
      =01 文件结束
      =02 缓冲区太小,传输结束
      =03 缓冲区不满
    28
    随机分块写
    DS:DX=FCB首地址
    CX=记录数
    AL=00 写成功
      =01 盘满
      =02 缓冲区溢出
    29
    分析文件名
    ES:DI=FCB首地址
    DS:SI=ASCIIZ串
    AL=控制分析标志
    AL=00 标准文件
      =01 多义文件
      =02 非法盘符
    2A
    取日期
     
    CX=年
    DH:DL=月:日(二进制)
    2B
    设置日期
    CX:DH:DL=年:月:日
    AL=00 成功
      =FF 无效
    2C
    取时间
     
    CH:CL=时:分
    DH:DL=秒:1/100秒
    2D
    设置时间
    CH:CL=时:分
    DH:DL=秒:1/100秒
    AL=00 成功
      =FF 无效
    2E
    置磁盘自动读写标志
    AL=00 关闭标志
    AL=01 打开标志
     
    2F
    取磁盘缓冲区的首址
     
    ES:BX=缓冲区首址
    30
    取DOS版本号
     
    AH=发行号,AL=版本
    31
    结束并驻留
    AL=返回码
    DX=驻留区大小
     
    33

    Ctrl-Break检测

    AL=00 取状态
      =01 置状态(DL)
    DL=00 关闭检测
      =01 打开检测
    DL=00 关闭Ctrl-Break检测
      =01 打开Ctrl-Break检测
    35
    取中断向量
    AL=中断类型
    ES:BX=中断向量
    36


    取空闲磁盘空间


    DL=驱动器号 
    0=缺省,1=A,2=B,...

    成功:AX=每簇扇区数
         BX=有效簇数
         CX=每扇区字节数
         DX=总簇数
    失败:AX=FFFF
    38
    置/取国家信息
    DS:DX=信息区首地址
    BX=国家码(国际电话前缀码)
    AX=错误码
    39
    建立子目录(MKDIR)
    DS:DX=ASCIIZ串地址
    AX=错误码
    3A
    删除子目录(RMDIR)
    DS:DX=ASCIIZ串地址
    AX=错误码
    3B
    改变当前目录(CHDIR)
    DS:DX=ASCIIZ串地址
    AX=错误码
    3C
    建立文件
    DS:DX=ASCIIZ串地址
    CX=文件属性
    成功:AX=文件代号
    错误:AX=错误码
    3D

    打开文件

    DS:DX=ASCIIZ串地址
    AL=0 读
      =1 写
      =3 读/写
    成功:AX=文件代号
    错误:AX=错误码
    3E
    关闭文件
    BX=文件代号
    失败:AX=错误码
    3F

    读文件或设备

    DS:DX=数据缓冲区地址
    BX=文件代号
    CX=读取的字节数
    读成功:
      AX=实际读入的字节数
      AX=0 已到文件尾
    读出错:AX=错误码
    40
    写文件或设备
    DS:DX=数据缓冲区地址
    BX=文件代号
    CX=写入的字节数
    写成功:
      AX=实际写入的字节数
    写出错:AX=错误码
    41
    删除文件
    DS:DX=ASCIIZ串地址
    成功:AX=00
    出错:AX=错误码(2,5)
    42


    移动文件指针


    BX=文件代号
    CX:DX=位移量
    AL=移动方式(0:从文件头绝对位移,1:从当前位置相对移动,2:从文件尾绝对位移)
    成功:DX:AX=新文件指针位置
    出错:AX=错误码

    43

    置/取文件属性

    DS:DX=ASCIIZ串地址
    AL=0 取文件属性
    AL=1 置文件属性
    CX=文件属性
    成功:CX=文件属性
    失败:CX=错误码
    44




    设备文件I/O控制




    BX=文件代号
    AL=0 取状态
      =1 置状态DX
      =2 读数据
      =3 写数据
      =6 取输入状态
      =7 取输出状态
    DX=设备信息




    45
    复制文件代号
    BX=文件代号1
    成功:AX=文件代号2
    失败:AX=错误码
    46
    人工复制文件代号
    BX=文件代号1
    CX=文件代号2
    失败:AX=错误码
    47
    取当前目录路径名
    DL=驱动器号
    DS:SI=ASCIIZ串地址
    (DS:SI)=ASCIIZ串
    失败:AX=出错码
    48
    分配内存空间
    BX=申请内存容量
    成功:AX=分配内存首地
    失败:BX=最大可用内存
    49
    释放内容空间
    ES=内存起始段地址
    失败:AX=错误码
    4A
    调整已分配的存储块
    ES=原内存起始地址
    BX=再申请的容量
    失败:BX=最大可用空间
         AX=错误码
    4B

    装配/执行程序

    DS:DX=ASCIIZ串地址
    ES:BX=参数区首地址
    AL=0 装入执行
    AL=3 装入不执行
    失败:AX=错误码

    4C
    带返回码结束
    AL=返回码
     
    4D
    取返回代码
     
    AX=返回代码
    4E
    查找第一个匹配文件
    DS:DX=ASCIIZ串地址
    CX=属性
    AX=出错代码(02,18)
    4F
    查找下一个匹配文件
    DS:DX=ASCIIZ串地址
    (文件名中带有?或*)
    AX=出错代码(18)
    54
    取盘自动读写标志
     
    AL=当前标志值
    56
    文件改名
    DS:DX=ASCIIZ串(旧)
    ES:DI=ASCIIZ串(新)
    AX=出错码(03,05,17)
    57
    置/取文件日期和时间
    BX=文件代号
    AL=0 读取
    AL=1 设置(DX:CX)
    DX:CX=日期和时间
    失败:AX=错误码
    58
    取/置分配策略码
    AL=0 取码
    AL=1 置码(BX)
    成功:AX=策略码
    失败:AX=错误码
    59

    取扩充错误码

     
    AX=扩充错误码
    BH=错误类型
    BL=建议的操作
    CH=错误场所
    5A
    建立临时文件
    CX=文件属性
    DS:DX=ASCIIZ串地址
    成功:AX=文件代号
    失败:AX=错误码
    5B
    建立新文件
    CX=文件属性
    DS:DX=ASCIIZ串地址
    成功:AX=文件代号
    失败:AX=错误码
    5C


    控制文件存取


    AL=00封锁
      =01开启
    BX=文件代号
    CX:DX=文件位移
    SI:DI=文件长度
    失败:AX=错误码


    62
    取程序段前缀
     
    BX=PSP地址

    arm汇编指令的条件码

    条件玛 助记符 标志 含义
    0000 EQ Z置位 相等
    0001 NE Z清零 不相等
    0010 CS C置位 无符号数大于或等于
    0011 CC C清零 无符号数小于
    0100 MI N置位 负数
    0101 PL N清零 整数或零
    0110 VS V置位 溢出
    0111 VC V清零 未溢出
    1000 HI C置位Z清零 无符号数大于
    1001 LS C清零Z置位 无符号数小于或等于
    1010 GE N等于V 带符号数大于或等于
    1011 LT N不等于V 带符号数小于
    1100 GT Z清零且(N等于V) 带符号数大于
    1101 LE Z置位或(N不等于V) 带符号数小于或等于
    1110 AL 忽略 无条件执行
    Songzhibin
  • 相关阅读:
    IOS 网络编程 + 后台保持连接
    iOS 通过代码关闭应用程序
    iOS 委托和协议区别和联系
    对于WIFI版ipad(无GPS芯片)定位功能的释疑
    iOS单例
    svn不能添加.a文件的解决方法
    mac下SVN上传.a静态库文件
    iOS7 兼容及部分细节
    app被Rejected 的各种原因翻译
    iOS 沙盒购买,弹出“需要验证”,“继续登录”的问题?
  • 原文地址:https://www.cnblogs.com/binHome/p/12877102.html
Copyright © 2011-2022 走看看