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 中。
指令示例:
|
orr
orr指令的格式为:
orr{条件}{S} Rd,Rn,operand
orr指令将Rn 的值与操作数operand2按位逻辑”或”,结果存放到目的寄存器Rd 中。
指令示例:
|
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范围内。