• 汇编语言语法学习


    主要是介绍汇编指令的用法。

    1、LDR
    指令说明:读内存指令
    例子1:LDR R0 ,[R1]
    例子说明:假设地址R1的值为x,读取地址x上的数据(4个字节)保存到R0中。
    例子2:LDR R0, 0X0209C004
    例子说明:将0X0209C004地址上的值赋值给R0

    2、LDR(伪指令)
    指令说明:伪指令(并不存在的指令,最终被解析成真正的汇编指令)
    例子:LDR R0,=0x12345678
    例子说明:把0x12345678的值赋值给R0。

    3、STR
    指令说明:写内存指令
    例子1:STR R0 ,[R1]
    例子说明:假设R1的值为x,将R0数据写到地址R1上。
    例子2:STR R0,[R1,#8]
    例子说明:将R0中的字数据写入以R1+8为地址的存储器中。
    例子3:STR R0,[R1],#8
    例子说明:将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1

    4、MOV
    指令说明:赋值指令
    例子1:MOV R0,R1
    例子说明:把R1的值赋给R0,即R0=R1。
    例子2:MOV R0,#0x100
    例子说明:把0x100赋值给R0 //#0x100的写法表示为立即数

    5、LEA
    指令说明:取有效地址指令
    例子1:LEA REC,OPRD
    例子说明:把操作数oprd的有效地址传送到操作数rec,源操作数oprd必须是一个存储器操作数,目的操作数rec必须是一个16位或32位的通用寄存器。
    注:与mov指令的区别:mov:移动地址中的值;lea:将地址进行移动。

    6、JMP
    指令说明:无条件段内直接转移指令
    例子1:JMP LABEL
    例子说明:使控制无条件地转移到标号为label的位置。无条件转移指令本身不影响标志

    7、CALL
    指令说明:过程调用指令
    例子1:CALL LABEL
    例子说明:段内直接调用LABEL
    注:与jmp的区别在于call指令会在调用label之前保存返回地址(call 中return之后主程序还可以继续执行,jmp 当label执行完毕后不能返回主程序继续执行)

    8、B
    指令说明:跳转指令。//用于函数跳出不再回来的过程
    例子:
    _start
    ldr sp, =0x80200000 //sp是指向栈顶的指针,此处是设置栈指针
    b main
    例子说明:跳转到main函数

    9、BL
    指令说明:跳转指令。//用于函数调用完之后回来继续当前函数的过程
    例子:
    例子说明:
    注:BL 指令相比 B 指令,在跳转之前会在寄存器 LR(R14)中保存当前 PC 寄存器值,所以可以通过将 LR 寄存器中的值重新加载到 PC 中来继续从跳转之前的代码处运行。

    10、SAL
    指令说明:算术左移
    例子1:SAL OPRD,count
    例子说明:把操作数oprd左移count位,右边补0。

    11、SHL
    指令说明:逻辑左移
    例子1:SHL OPRD,count
    例子说明:把操作数oprd左移count位,右边补0。
    注:与shl指令一样。通过截取count的低5位,实际的移位数被限于0到31之间。

    12、SAR
    指令说明:算术右移
    例子1:SAR OPRD,count
    例子说明:把操作数oprd右移count位,同时每右移一位,左边补符号位,移出的最低位进入标志位CF。

    13、SHR
    指令说明:逻辑右移
    例子1:SHR OPRD,count
    例子说明:把操作数oprd右移count位,左边补0,移出的最低位进入标志位CF。

    14、ROL
    指令说明:左循环移位指令
    例子1:ROL OPRD,count
    例子说明:把操作数oprd左移count位。
    15、ROR
    指令说明:右循环移位指令
    例子1:ROR OPRD,count
    例子说明:把操作数oprd右移count位。

    16、RCL
    指令说明:带进位左循环移位
    例子1:RCL OPRD,count
    例子说明:

    17、RCR
    指令说明:带进位右循环移位
    例子1:RCR OPRD,count
    例子说明:

    18、LOOP
    指令说明:计数循环指令
    例子1:LOOP LABEL
    例子说明:

    19、SUB
    指令说明:减法指令
    例子1:sub r0 ,r1,#5
    例子说明:r0 = r1 - 5。
    例子2:sub r0 ,r1,r2
    例子说明:r0 = r1 - r2。

    20、SBC
    指令说明:带借位的减法
    例子:SBC Rd,Rn,#immed
    例子说明:Rd = Rn - #immed -借位。
    例子2:SBC Rd,Rn,Rm
    例子说明:Rd = Rn - Rm - 借位。

    21、ADD
    指令说明:加法指令
    例子:add r0,r1,#5
    例子说明:r0 = r1+5。
    例子2:add r0 ,r1,r2
    例子说明:r0 = r1 + r2

    22、ADC
    指令说明:带进位的加法运算
    例子:adc Rd,Rn,Rm
    例子说明:Rd = Rn + Rm + 进位
    例子2:add Rd,Rn,#immed
    例子说明:Rd = Rn + #immed + 进位

    23、MUL
    指令说明:乘法指令
    例子:MUL Rd,Rn,Rm
    例子说明:Rd = Rn * Rm

    24、UDIV
    指令说明:无符号除法指令
    例子:UDIV Rd,Rn,Rm
    例子说明:Rd = Rn / Rm

    25、SDIV
    指令说明:有符号除法指令
    例子:UDIV Rd,Rn,Rm
    例子说明:Rd = Rn / Rm

    26、CMP
    指令说明:比较两个操作数的大小
    例子:cmp oprd1,oprd2
    例子说明:执行从目的操作数中减去源操作数的隐含减法操作,并且不修改任何操作数。
    注:它影响flag的CF,ZF,OF,AF,PF,说明如下:
    若执行指令后:ZF=1,则说明两个数相等,因为zero为1说明结果为0.
    当无符号时:
    若CF=1,则说明了有进位或借位,cmp是进行的减操作,故可以看出为借位,所以,此时oprd1 CF=0,则说明了无借位,但此时要注意ZF是否为0,若为0,则说明结果不为0,故此时oprd1>oprd2.
    当有符号时:
    若SF=0,OF=0 则说明了此时的值为正数,没有溢出,可以直观的看出,oprd1>oprd2;
    若SF=1,OF=0 则说明了此时的值为负数,没有溢出,则为oprd1 若SF=0,OF=1 则说明了此时的值为正数,有溢出,可以看出oprd1 若SF=1,OF=1则说明了此时的值为负数,有溢出,可以看出oprd1>oprd2;

    27、TEST
    指令说明: 指令在两个操作数的对应位之间进行 AND 操作,并根据运算结果设置符号标志位、零标志位和奇偶标志位
    例子:
    test eax, 100b ;b后缀意为二进制
    jnz ****** ;如果eax右数第三个位为1,jnz将会跳转
    例子说明:jnz跳转的条件非0,即ZF=0,ZF=0意味着零标志没被置位,即逻辑与结果为1。
    例子2:
    test ecx, ecx
    jz somewhere
    如果ecx为零,设置ZF零标志为1,Jz跳转
    注:TEST AX,BX 与AND AX,BX命令有相同效果,只是Test指令不改变AX和BX的内容,而AND指令会把结果保存到AX中
    注:条件码说明:
    条件码:
    OF(Overflow Flag)溢出标志,溢出时为1,否则置0.标明一个溢出了的计算,如:结构和目标不匹配。
    SF(Sign Flag)符号标志,结果为负时置1,否则置0。
    ZF(Zero Flag)零标志,运算结果为0时置1,否则置0。
    CF(Carry Flag)进位标志,进位时置1,否则置0.注意:Carry标志中存放计算后最右的位。
    AF(Auxiliary carry Flag)辅助进位标志,记录运算时第3位(半个字节)产生的进位置。
    有进位时1,否则置0。
    PF(Parity Flag)奇偶标志.结果操作数中1的个数为偶数时置1,否则置0。
    控制标志位:
    DF(Direction Flag)方向标志,在串处理指令中控制信息的方向。
    IF(Interrupt Flag)中断标志。
    TF(Trap Flag)陷井标志。

    28、BNE
    指令说明:是个条件跳转,即:是“不相等(或不为0)跳转指令”。如果不为0就跳转到后面指定的地址,继续执行
    例子:
    TST R0, #0X8
    BNE SuspendUp ;BNE指令是“不相等(或不为0)跳转指令”:
    LDR R1,#0x00000000
    例子说明:先进行and运算,如果R0的第四位不为1,则结果为零,则设置zero=1(继续下面的LDR指令)。否则,如果R0的第四位为1,zero=0(跳到SuspendUp处执行)。

    29、BEQ
    指令说明:是个条件跳转,即:是“等于0时进行跳转指令”。
    例子:
    TST R0, #0X8
    BEQ SuspendUp ;BNE指令是“不相等(或不为0)跳转指令”:
    LDR R1,#0x00000000
    例子说明:先进行and运算,如果R0的第四位不为1,则结果为零,则设置zero=1且执行BEQ的跳转。否则,如果R0的第四位为1,则设置zero=0,且执行LDR部分。
    注:tst 和bne连用: 先是用tst进行位与运算,然后将位与的结果与0比较,如果不为0,则跳到bne紧跟着的标记(如bne sleep,则跳到sleep处)。
    tst 和beq连用: 先是用tst进行位与运算,然后将位与的结果与0比较,如果为0,则跳到beq紧跟着的标记(如bne AAAA,则跳到AAAA处)

    30、MRS
    指令说明:用于将程序状态寄存器的内容传送到通用寄存器中。
    格式:MRS{条件} 通用寄存器,程序状态寄存器(CPSR或SPSR)
    例子1:MRS R0,CPSR
    例子说明:传送CPSR的内容到R0。
    例子2:MRS R0,SPSR
    例子说明:传送SPSR的内容到R0。
    注:
    MRS指令用于将程序状态寄存器的内容传送到通用寄存器中,使用情况如下:
    1)当需要改变程序状态寄存器的内容时,可用MRS将程序状态寄存器的内容读入通用寄存器,修改后再写回程序状态寄存器
    2)当在异常处理或进程切换时,需要保存程序状态寄存器的值,可先用该指令读出程序状态寄存器的值,然后保存

    31、MSR
    指令说明:将操作数的内容传送到程序状态寄存器的特定域中。其中,操作数可以为通用寄存器或立即数
    格式:MSR{条件} 程序状态寄存器(CPSR或SPSR)_<域>,操作数
    例子1:MSR CPSR,R0
    例子说明:传送R0的内容到CPSR
    例子2:MSR SPSR,R0
    例子说明:传送R0的内容到SPSR
    例子3:MSR CPSR_c,R0
    例子说明:传送R0的内容到SPSR,但仅修改CPSR中的控制位域
    注:
    <域>用于设置程序状态寄存器中需要操作的位,32位的程序状态寄存器可分为4个域:
    1)位[31:24]为条件标志位域,用f表示;
    2)位[23:16]为状态位域,用s表示;
    3)位[15:8]为扩展位域,用x表示;
    4)位[7:0]为控制位域,用c表示;
    该指令通常用于恢复或改变程序状态寄存器的内容,在使用时,一般要在MSR指令中指明将要操作的域。

    32、BIC
    指令说明:BIC指令用于清除(操作数1)的某些位,并把结果放置到目的寄存器中。(操作数1)应是一个寄存器,(操作数2)可以是一个寄存器,被移位的寄存器,或一个立即数。(操作数2)为32位的掩码,如果在掩码中设置了某一位,则清除返一位。未设置的掩码位保持不变。
    格式:BIC{条件}{S} 目的寄存器,操作数1,操作数2
    例子1:bic r0,r0,#0x1f
    例子说明:清除r0的bit[4:0]位。
    例子2:BIC Rd, Rn
    例子说明:Rd = Rd & (~Rn)
    例子3:BIC Rd, Rn, Rm
    例子说明:Rd = Rn & (~Rm)

    33、AND
    指令说明:按位与
    例子1:AND Rd, Rn
    例子说明:Rd = Rd & Rn。
    例子2:AND Rd, Rn, #immed
    例子说明:Rd = Rn & #immed
    例子3:AND Rd, Rn, Rm
    例子说明:Rd = Rn & Rm

    34、ORR
    指令说明:按位或
    例子1:ORR Rd, Rn
    例子说明:Rd = Rd | Rn。
    例子2:ORR Rd, Rn, #immed
    例子说明:Rd = Rn | #immed
    例子3:ORR Rd, Rn, Rm
    例子说明:Rd = Rn | Rm

    35、ORN
    指令说明:按位或非
    例子1:ORN Rd, Rn
    例子说明:Rd = Rd |(~ Rn)

    36、INC
    指令说明:加1指令
    例子1:INC DEST
    例子说明:

    37、DEC
    指令说明:减1指令
    例子1:DEC DEST
    例子说明:

    38、NEG
    指令说明:取补指令
    例子1:NEG OPRD
    例子说明:

    39、EOR
    指令说明:按位异或
    例子:EOR Rd, Rn
    例子说明:Rd = Rd ^ Rn。

    40、PUSH
    指令说明:将寄存器列表存入栈中
    格式:PUSH
    例子1:PUSH {R0~R3, R12}
    例子说明:将 R0~R3 和 R12 压栈。
    例子2:PUSH {LR}
    例子说明:将 LR 进行压栈

    41、POP
    指令说明:从栈中恢复寄存器列表
    格式:POP
    例子1:POP {LR}
    例子说明:先恢复 LR。
    例子2:POP {R0~R3,R12}
    例子说明:再恢复 R0~R3,R12

    42、NOP
    指令说明:空操作指令,用作延时。无任何效果,在指令书写处占用一个字节的内存空间
    例子:LDR R0 ,[R1]
    例子说明:假设R1的值为x,读取地址x上的数据(4个字节)保存到R0中。

    43、XCHG
    指令说明:交换指令
    例子:XCHG OPER1,OPER2
    例子说明:把操作数oper1的内容与操作数oper2的内容交换。oper1和oper2可以是通用寄存器或存储单元,但不能同时是操作单元,也不能是立即数。

    44、LDM
    指令说明:多数据加载,将地址上的值加载到寄存器上
    格式:LDM{cond} mode Rn{!}, reglist{^}
    例子:
    Ldr R1,=0x10000000 //传送数据的起始地址0x10000000
    LDMIB R1!,{R0,R4-R6}
    例子说明:从左到右加载,相当于 LDR R0,10000004 LDR R4,10000008… …
    /*传送前地址加+4,
    所以地址加4,R0=0X1000004地址里的内容,
    地址加4,R4=0X10000008地址里的内容,
    地址加4,R5=0X1000000C地址里的内容,
    地址加4,R6=0X10000010 地址里的内容,
    由于!, 最后的地址写回到R1中,R1=0X10000010。

    45、STM
    指令说明:多数据存储,将寄存器的值存到地址上
    格式:STM{cond} mode Rn{!}, reglist{^}
    例子:stmia sp, {r0 - r12} //注意这里的-号不是减,而是范围
    例子说明:将r0存入sp指向的内存处(假设为0x30001000);然后地址+4(即指向0x30001004),将r1存入该地址;然后地址再+4(指向0x30001008),将r2存入该地址······直到r12内容放入(0x3001030),指令完成。即将r0~r12的内容存入以sp为起始地址的内容空间里。
    注:
    1)8种后缀,如下:
    ia(increase after)先传输,再地址+4
    ib(increase before)先地址+4,再传输
    da(decrease after)先传输,再地址-4
    db(decrease before)先地址-4,再传输
    fd(full decrease)满递减堆栈
    ed(empty decrease)空递减堆栈
    fa(·······) 满递增堆栈
    ea(·······)空递增堆栈
    2) !:表示最后的地址写回到Rn中
    3) reglist:可包含多于一个寄存器范围,用“,”隔开,如{R1,R2,R6-R9},寄存器由小到大顺序排列
    4) ^:不允许在用户模式和系统模式下运行

  • 相关阅读:
    进程终止(你真的学会递归了吗?考验你的递归基础)
    前端的请求分析(get,post,put,delete,patch)
    Sentinel入门
    c++ 调试问题记录
    Anycast CLB 如何支持多地&动态加速的负载均衡服务,高速互联转发!
    linux添加普通用户并且只能访问指定目录
    红队隧道应用篇之NetCat使用(十一)
    不让input表单的输入框保存用户输入的历史记录
    解决电脑出现msvcp140.dll丢失问题,msvcp140.dll丢失的详细解决方法
    消息摘要(数字摘要)的理解 - 查看很多资料后的感悟
  • 原文地址:https://blog.csdn.net/qq_33782617/article/details/126325050