汇编指令-汇合

ESP:堆栈指针寄存器,主要用于存放堆栈内存储单元的偏移量,用它可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。

PUSH 指令

PUSH 指令首先减少 ESP 的值,再将源操作数复制到堆栈。操作数是 16 位的,则 ESP 减 2,操作数是 32 位的,则 ESP 减 4。PUSH 指令有 3 种格式:

POP指令

POP 指令首先把 ESP 指向的堆栈元素内容复制到一个 16 位或 32 位目的操作数中,再增加 ESP 的值。如果操作数是 16 位的,ESP 加 2,如果操作数是 32 位的,ESP 加 4:

__asm指令

__asm 关键字用于调用内联汇编程序,并且可在 C 或 C++ 语句合法时出现。 _asm是 __ASM 的同义词。

语法

 __asm后跟一个程序集指令、一组括在大括号中的指令或者至少一对空大括号。

1、__asm与大括号一起使用,则该关键字表示大括号之间的每一行都是一条汇编语言语句。如:

_asm { mov al, 2  mov dx, 0xD007 out al, dx }

2、__asm不与大括号一起使用,放在代码行首部,则 __asm 关键字表示此行的其余部分是一条汇编语言语句。如:

__asm mov al, 2

__asm mov dx, 0xD007

__asm out al, dx

3、__asm做语句分隔符,可将汇编语句放在同一行代码中。如:

__asm mov al, 2 __asm mov dx, 0xD007 __asm out al, dx

bic

bic  (Bit Clear)位清除指令
bic指令的格式为:
bic{条件}{S}  Rd,Rn,operand 

bic指令将Rn 的值与操作数operand2 的反码按位逻辑”与”,结果存放到目的寄存器Rd 中。

指令示例:

bic R0,R0,#0x1F ;    //将R0最低5位清零,其余位不变。

orr

orr指令的格式为:
orr{条件}{S}  Rd,Rn,operand 

orr指令将Rn 的值与操作数operand2按位逻辑”或”,结果存放到目的寄存器Rd 中。

指令示例:

orr R0,R0,#0xd3 ;将R0的第[7:0]位与b'1101 0011按位或,并保存在R0中

 str

STR指令的格式为:

STR{条件}  源寄存器,<存储器地址>

STR指令用亍从源寄存器中将一个32位的字数据传送到存储器中。该指令在程序设计中比较常用,寻址方式灵活多样,使用方式可参考指令LDR。

指令示例:

STR R0,[R1],#8             ;将R0中的字数据写入以R1为地址的存储器中,并将新地址R1+8写入R1。

STR R0,[R1,#8]             ;将R0中的字数据写入以R1+8为地址的存储器中。”

subs

subs pc, lr, #4 /* 将 lr-4 赋给 pc */

subs Rn,Rn,#1 /* Rn 自身减 1 并设置标志位 */

ldr

LDR指令的格式: 

LDR{条件}   目的寄存器     <存储器地址>

作用:将 存储器地址 所指地址处连续的4个字节(1个字)的数据传送到目的寄存器中。

LDR指令的寻址方式比较灵活,实例如下:

LDR R0,[R1]                                                      ;将存储器地址为R1的字数据读入寄存器R0。

LDR R0,[R1,R2]                                             ;将存储器地址为R1+R2的字数据读入寄存器R0。

LDR R0,[R1,#8]                                             ;将存储器地址为R1+8的字数据读入寄存器R0。

LDR R0,[R1],R2                                               ;将存储器地址为R1的字数据读入寄存器R0,并将R1+R2的值存入R1。

LDR R0,[R1],#8                                               ;将存储器地址为R1的字数据读入寄存器R0,并将R1+8的值存入R1。

LDR R0,[R1,R2]!                                          ;将存储器地址为R1+R2的字数据读入寄存器R0,并将R1+R2的值存入R1。

LDR R0,[R1,LSL #3]                                   ;将存储器地址为R1*8的字数据读入寄存器R0。

LDR R0,[R1,R2,LSL #2]                         ;将存储器地址为R1+R2*4的字数据读入寄存器R0。

LDR R0,[R1,,R2,LSL #2]!                       ;将存储器地址为R1+R2*4的字数据读入寄存器R0,并将R1+R2*4的值存入R1。

LDR R0,[R1],R2,LSL #2                            ;将存储器地址为R1的字数据读入寄存器R0,并将R1+R2*4的值存入R1。

LDR R0,Label                                                ;Label为程序标号,Label必须是当前指令的-4~4KB范围内。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值