主要的汇编指令有哪些啊
LDR 和 STR - 用于无符号字和字节命令格式:LDR/STR{cond}{T}Rd, LDR/STR{cond}B{T}Rd, LDR{cond }{ T}Rd, 将指定地址的字数据加载到Rd中; STR{cond}{T}Rd,将Rd内的数据存储到指定的地址单元中; 指令 LDR{cond}B{T}Rd, 将指定地址处的字节数据加载到 Rd 的最低字节(Rd Clear 的高 24 位); STR{cond}B{T}Rd,指令将Rd中的最低字节数据存储到指定的地址单元中。T 是可选后缀。
如果T存在,即使处理器处于特权模式,存储系统也会将访问视为处理器处于用户模式,并且不能与前者一起使用。
偏移索引T。
可用的地址段有四种类型:零偏移(zerooffset)[Rn],Rn值用作数据传输的地址。
例如:LDRR0,[R1]; pre -indexedoffset [Rn, Flexoffset] {!} 在传输数据之前,将 Flexoffset 偏移量添加到 Rn。
结果用作传输数据的内存地址。
如果后缀“!” 使用时,结果将记录为 Rn,Rn 不允许为 R15,如:LDRBR0,[R1,#8]LDRR0,[R1,#8]!相对补偿程序(相对标签程序(标签必须是在当前命令的±4KB以内)。
程序的相对偏移量是预索引形式的另一个版本从PC计算偏移量并使用PC作为Rn来创建命令 不能使用后缀“!”,例如:LDRR0,地址在索引偏移之后加载到 R0 中。
传输数据后,将Flexoffset偏移量加上Rn,并将结果写回到Rn,这是不允许的R15,如:LDRR0,[R1],R2,LSL#2从内存地址读取数据; R1写入寄存器R0,并将新地址R1+R2×4写入R1。
Flexoffset偏移量可以采用以下两种形式之一: 1)表达-4095到+4095之间的整数,通常是常数,如:STRR5,[R7],#--82)一个寄存器 添加一个移位(移位为由立即数指定),例如:{-}Rm{,shift} 其中: -:可选负号。
如果符号为“1”,则将从 Rn 中减去偏移量。
否则,向 Rn 添加偏移量。
Rm:包含偏移量的寄存器。
不允许的Rm是R15。
Shift:Rm 的可选移位方法。
它可以是以下任意一种: ASRn:算术移位 n 位 (1<=n<=32) LSLn:逻辑左移 n 位 (1<=n<=31) LSRn:逻辑右移 n 位 (1 <= n<=32)RORn:右移n位 (1<=n<=31)RRX:右移1位,带扩展。
AND————逻辑运算指令“AND” 命令格式:命令 AND{cond}{S}Rd,Rn,operand2AND 将 operand2 和 Rn 的值进行按位逻辑与,并将结果存入目的地址注册 线 . 如果设置了 S,则根据运算结果影响 N 和 Z 位。
计算第二个操作数时,C 位被更新,V 位不受影响(ORR、EOR 和 BIC 指令对标志位的影响与 AND 指令相同)。
钱包命令示例:ANDSR1,R1,R2; R1=R1&R2,根据运算结果更新标志位ANDR0,R0,#0x0F; R0=R0&0x0F,取出R0的最低4位数据。
ORR——逻辑“或”运算指令 命令格式:ORR{cond}{S}Rd,Rn,operand2 ORR指令将operand2和Rn的值进行按位逻辑或,并将结果存储到注册目的地Rd 。
命令示例:ORRSR1,R1,R2; R1=R1|R2并根据运算结果更新ORRR0,R0,#0x0F标志位; R0=R0|0x0F,将R0的最低4位设置为1,其他位不变。
BIC-----按位指令格式:BIC{cond}{S}Rd,Rn,operand2 BIC 指令将值 Rn 与 operand2 操作数的补码进行按位逻辑与,并将结果存储到条写入目的地 Rd 。
命令示例:BICR0,R0,#0x0F; 清除 R0 的最低 4 位,其余位保持不变。
CMP————————比较命令格式: CMP{cond}Rn,operand2 CMP 命令将 Rn 的值减去 operand2,并反映结果的状态(rn 大于、小于或等于比较与操作数2)放在CPSR中,以便后续指令可以根据条件标志来确定程序的方向。
CMP 命令与 SUBS 命令执行相同的操作,只不过 CMP 命令只做减法,不保存结果。
命令示例:cmpR0,R1; 比较R0、R1beqstop; R0
汇编指令LSL
R0的值:0x39
该运算符的功能:R1+8*R2。
结果发送到R08*R2=0x10
R2,LSL。
3号——R2的左侧。
移位 3 位相当于乘以 8。
因此结果为 0x39。
扩展信息。
汇编指令是汇编语言中使用的一些运算符和助记符,包括一些伪指令(例如,假设、终止)。
指令用于告诉汇编器如何进行汇编。
它们不控制机器的操作,也不被编译成机器代码。
它们只能被汇编程序识别并指示汇编程序如何操作。
常用汇编指令简要说明:
1. 传输数据的一般指令。
MOV 传输字或字节。
MOVSX- 符号先扩展然后发送。
MOVZX 首先扩展零,然后然后发送。
PUSH 将单词压入堆栈。
POP 将单词从堆栈中弹出。
PUSHA 压入 AX 、CX、DX、BX, SP,BP, SI、DI 依次入栈。
POPA 依次从栈中弹出 DI、SI、BP、SP、BX、DX、CX 和 AX。
PUSHAD 弹出 EAX, ECX、ED X、EBX、ESP、EBP、ESI 和 EDI 依次压入堆栈。
POPAD 依次弹出 EDI、ESI、EBP、ESP、EBX, 堆栈中的 EDX、ECX 和 EAX。
。
BSWAP 反转 32 位寄存器的字节顺序。
XCHG 反转字或字节(至少一个操作数是寄存器,段寄存器不能用作操作数)
XCHG 反转字或字节(至少一个操作数是寄存器,段寄存器不能用作操作数)。
CM PXCHG 比较并交换操作数(第二个操作数必须是累加器 AL/AX/EAX)
首先是 XADD 交换然后求和(结果在第一个操作数中)
XLAT字分区查找表转换。
──BX指向256字节表的起始点,AL为索引值表(0-255,即
0-FFH); 返回 AL 作为表搜索的结果。
([BX+AL); ]->AL)
2. 输入输出端口传输指令。
INI/O端口输入(语法:累加器IN,{端口号│DX})
OUTI/O端口输入(语法:OUT{端口number│DX},累加器)
立即模式下指定输入输出端口时,指定范围为0-255 在寄存器DX中,
>范围 0-65535。
3. 目的地址传输命令。
LEA加载有效地址。
示例:LEADX、字符串; 将偏移地址存储在DX中。
/p>
LDS 传递目标指针,将指针的加载到 DS 中。
示例:LDSSI,字符串; 存储段地址:DS:SI中的偏移地址。
LES传递目标指针,将指针加载到ES中。
示例:LESDI,字符串; 保存段地址:ES:DI中的偏移地址。
LFS传递目标指针并加载指针的。
输入FS。
示例:LFSDI,字符串; 存储段地址:FS中的偏移地址:DI。
LGS传递目标指针,并将指针的加载到GS中。
示例:LGSDI,字符串; 将段地址:偏移地址存储在GS:DI中。
LSS传递目标指针,并将指针的加载到SS中。
示例:LSSDI,string Address: offset; 地址保存到SS:DI。
4. 传输标志命令。
传输LAHF标志寄存器并将标志加载到AH。
传输SAHF标志寄存器。
和加载标志 AH 寄存器。
PUSHF 标志被压入堆栈。
POPF 标志被弹出。
32 位 PUSHD 标志被压入堆栈。
32 位 POPD 标志被提升。
汇编ret指令怎么用?
Ret使用堆栈数据来更新IP的以接收传输。
重新处理步骤:
(1):(IP)=((SS)*16+SP)
(2):(SP)= ( SP )+2
实现过程
恢复指令利用堆栈中的数据来更新IP的值,以接近传输。
当CPU执行ret指令时; 它执行以下两个步骤:
(IP)=((SS)*16+(SP))
(SP )=(SP)+2;
接下来使用retn(n为整数)
等于
(IP)=((SS ) *16+ (SP))
(SP)=(SP)+2;
(SP)=(SP)+n;
例如, ret4
popip
addsp,4
返回调用站点
示例:
pusheax
push0
push0
pushax
push0
cal ldwordptr[MessageBoxA]
ret; 这是发行EIP; 返回通话目的地; 继续【标记1】
扩展信息:功能-
从堆栈中取出高8位和低8位字节pc; 将堆栈指针减 2,并从 pc 值开始继续执行程序。
它不影响任何标志。
示例
;主程序
MAIN:SETBP1.0 (1) 启动主程序; P1.0端口设置为1(P1.0端口输出时可以控制LED点亮)
LCALLDELAY (2) 此时, 当前堆栈指针加2并调用(6)DELAY延迟。
时序例程
CLRP1.0 (3)清除P1.0口(P1.0输出,可控制LED的关闭)
LCALLDELAY; (4) 当此项将当前堆栈指针加2时; (6) 在主程序中调用DELAY子程序
LJMPMAIN(5)。
跳。
使LED亮一圈
;正常程序
R7 R6D2:DJNZR6,D2;(8)(R6-1); 如果等于零, 如果不为零,则执行下一步; D2
DJNZR7,D1 (9) (R7-1); 如果等于零,则执行。
如果不等于0,则跳转到D1
RET。
(10) 当前堆栈指针减2,MAIN 返回到CLRP1.0 继续主程序(3)。
汇编语言指令大全,要详细的!!!!
一组汇编语言指令
汇编语言是一种低级语言,其语法随不同的处理器架构而变化。
以下是一些常见的汇编语言指令及其解释:
数据传输指令
1.MOV:移动指令,用于数据传输。
例如,MOVAX,5将值5传送到AX寄存器。
2.PUSH和POP:压入和出栈指令,用于将数据压入堆栈或弹出堆栈。
例如:PUSHBX将BX寄存器的压入堆栈。
POPCX 将数据从堆栈弹出到 CX 寄存器中。
数学练习说明
ADD:加法说明。
例如:ADDAX、BX将AX和BX的值相加,结果存储在AX中。
其他还有SUB、MUL、DIV等。
逻辑运算和移位指令
此类指令包括AND、OR、NOT等逻辑运算和SHL、SHR等移位运算。
例如:ANDAX,0FFh用于清除AX中的最高有效位。
SHRBX, 1 将 BX 的右移一位。
控制传输指令
此类指令用于改变程序执行的流程。
包括JZ、JNZ等条件跳转,JMP等无条件跳转,以及CALL、RET等调用和返回指令等。
例如:JMPlabel跳转到tag标签处执行代码。
CALLfunction 调用函数函数并设置返回地址。
系统控制指令
这些指令用于系统级操作,例如中断处理、系统调用等。
和INT一样,用于中断处理,比如设置IO口等。
例如:INT0x21调用中断服务。
不同的CPU和操作系统可能有不同的系统控制指令。
除了上述指令外,汇编语言还有很多其他指令,如比较指令、位操作指令等。
每个订单都有其自己的目的和功能。
掌握这些指令对于编写有效的汇编语言程序至关重要。
需要注意的是,不同的处理器架构可能有不同的指令集,因此在实际应用中,需要根据具体的处理器来学习和使用相关的语言指令。
主要的汇编指令有哪些?
LDR 和 STR - 用于字和无符号字节指令格式:
LDR/STR{cond}{T}Rd,
LDR/STR{cond}B{T}Rd,\ x0d\ x0a
LDR{cond}{T}Rd,指定地址处的字数据 Load into Rd;
STR{cond}{T}将Rd和Rd的字数据存储到指定的地址单元中。
LDR{cond}B{T}Rd,指令将指定地址的字节数据加载到Rd的最低有效字节中。
medium(Rd的高24位清零);
STR{cond}B{T}Rd,该指令将Rd的最低有效字节数据保存到指定的地址单元。
T 是可选后缀。
如果为 T,则即使处理器处于特权模式,存储系统也会将访问视为处理器处于用户模式。
T 在用户模式下无效,并且不能从用户模式偏移。
使用 T 将先前的索引一起移动。
地址部分有四种格式:
Zerooffset [Rn],Rn 中的值作为发送数据的地址。
示例:
LDRR0,[R1];
Pre-indexedoffset(预索引偏移)[Rn, Flexoffset]{!} 在发送数据之前将偏移量 Flexoffset 添加到 Rn。
结果用作传输数据的内存地址。
如果使用后缀'!',则结果写回Rn。
Rn 不能是 R15(例如:
LDRBR0,[R1,#8]
LDRR0,[R1,#8)]!
\ x0a 程序相关标签(标签当前为(必须在指令的 ±4KB 范围内) )。
过程相对偏移是预索引形式的另一个版本。
计算 PC 的偏移量并使用 PC 作为 Rn 生成预索引指令。
LDRR0,place;
place 地址被加载到 R0
中。
后索引偏移(post-indexedoffset)[Rn],Flexoffset。
发送数据后,我们需要将偏移量Flexoffset添加到Rn中,并将结果写回到Rn中。
例如,
LDRR0,[R1],R2,LSL#2;
内存。
地址R1处的字数据被读入寄存器R0,并且新地址R1+R2×4被写入R1。
偏移量 Flexoffset 可以采用以下两种形式之一:
1) 其值为 -4095 到 +4095 范围内的整数的表达式(通常是诸如
STRR5 数值常量的表达式)[R7] ,#--8
2) 寄存器和移位(移位用立即数指定)。
示例:
{-}Rm{,shift}
其中:\ x0d
-:可选负号。
如果符号为“1”,则从 Rn 中减去偏移量。
否则,将偏移量添加到 Rn。
Rm:包含偏移量的寄存器。
Rm 不能是 R15。
Shift:Rm 的可选移位方法。
它可以是以下格式之一:
ASRn:算术右移 n 位 (1<=n<=32)
LSLn:逻辑左移 n 位 (1<=n<=31)
\ x0aLSRn: 逻辑右移 n 位 (1<=n<=32)
RORn: 右移 n 位 (1<=n<=31)
RRX:带扩展的 1 位右旋转。
AND————逻辑“与”运算指令
指令格式:
AND{cond}{S}Rd,Rn,operand2
AND 指令将操作数 2 设置为位 执行对单元进行逻辑运算 当与 Rn 的值进行 AND 运算时,结果存储在目标寄存器 Rd 中将被存储在 如果设置了 S,则根据运算结果,N 和 Z 位会受到影响。
当计算第二个操作数时,C 位被更新,但 V 位不受影响(指令 ORR、EOR 和 BIC 无效)。
标志位与 AND 指令相同)。
指令示例:
ANDSR1,R1,R2; R1=R1&R2,根据运算结果更新标志位
ANDR0,R0,R0=R0&0x0F; 。
ORR————逻辑“或”运算指令
指令格式:ORR{cond}{S}Rd,Rn,operand2 ORR指令将操作数operand2和Rn的值进行转换。
对于按位逻辑“OR”,结果存储在目标寄存器 Rd 中。
示例指令:
ORRRR1,R1,R2; R1=R1|R2,根据运算结果更新标志位
ORRR0,R0,#0x0F;其余位不变; 。
BIC————位清指令
指令格式:
BIC{cond}{S}Rd,Rn,operand2
BIC指令将Rn的值和操作数清零。
比较。
操作数2的补码是按位逻辑与,结果存储在目标寄存器Rd中。
指令示例:BICR0,R0,#0x0F;清除R0 的低4 位,其余位保持不变。
CMP ————比较命令
命令格式:
CMP{cond}Rn,operand2
CMP 命令将 Rn 的值减去操作数 operand2,并将结果相加。
条件(与操作数 2 相比,Rn 大于、小于或等于)在 CPSR 中反映如下: 后续指令根据条件标志确定程序的方向。
CMP 指令执行与 SUBS 指令相同的操作,只不过它只做减法而不存储结果。
指令示例:
cmpR0,R1; 比较R0,R1
beqstop
bltless; 跳转到更少
.
.
.
Less:
.
\ x0a.
.
停止:
.
.
.
SUB————减法指令
\x 0a 指令格式:
SUB{ cond}{S}Rd,Rn,operand2 SUB 指令为 Rn 从 的值中减去操作数 operand2,并将结果存储到目标寄存器 Rd 中。
示例指令:
SUBSR1,R1,R2; R1=R1-R2,根据运算结果更新标志位
SUBGTR3,3,#1; R3=R3-1
SUBR0,R2,R3, LSL #2; R0=R2-(R3<<2)
\x0 大于 aARM 分支指令
助记符
描述
操作
B{cond}lable
分支指令
PC←lable
\x0 aBL{cond}lable
带链接的分支指令
LR←PC-4, PC←lable
BX{cond}Rm
带状态切换的分支指令
PC←Rm,切换处理器状态 条件
指令 条件代码
条件代码 助记符后缀 标志含义
0000EQZ 设置(Z=1) 等于
0001NEZ 清除(Z=0) 不等于
\ x0a0010CSC 设置无符号数大于或等于
0011CCC 清除 无 符号数小于
0100MIN 设置负数
0101PLN 清除整数或0
0110VSV 设置溢出\x0 d
0111VCV 被清零,不溢出
1000HIC被置位,Z被清零,无符号数更大
1001LSZ被置位,C被清零,无符号数量小于
1010GEN。
GEN 等于 V(N=V=1 或 N=V=0)。
有符号数大于或等于
1011LTN。
有符号数不等于 V。
1100GTZ 被清零且 N 等于 V 有符号数大于
1101LEZ 或 N 不等于 V 有符号数小于等于
1110AL 忽略无条件执行 GPIO 寄存器 宏定义
GPFCONEQU0x56000050
GPFDATEQU0x56000054
GPFUPEQU0x56000058
\x 0d
EXPORTLEDTEST
AREALEDTESTASM,CODE,READONLY; 该指令定义了一个代码段。
段名称为 LEDTESTASM,属性为只读
LEDTEST
。
输出 ut
ldrr0,=GPFCON
ldrr1,[r0]
bicr1,r1,#0xff00
orrr1,r1,#0x5500
strr1,[r0]
\ x0a ; 屏蔽端口 7
ldrr0,=GPFUP
ldrr1,[r0]
orrr1,r1,#0xf0
strr1,[r0]
looptest\ x0d
;加上数据口F的数据寄存器的地址。
寄存器 r2
ldrr2,=GPFDAT
ldrr3,[r2]
bicr3,r3,#0xf0
orrr3,r3,#0xb0
strr3,[r2];GPF6output0 给出
\x0 aldrr0,=0x2fffff
bllay;调用延迟子程序
ldrr3,[r2]
bicr3,r3,#0xf0
orrr3,r3,#0x70
strr3,[r2 ] ;GPF7输出 put0
ldrr0,=0x2fffff;初始计数值
bllay;调用延时子程序
ldrr3,[r2]
bicr3,r3,#0xf0
orrr3,r3,# 0xd0
strr3,[r2];GPF5output0
ldrr0,=0x2fffff
bllay;调用延迟子程序
ldrr3,[r2]
bicr3,r3,#0xf0
orrr3,r3 , #0 xe0
strr3,[r2];GPF4output0
ldrr0,=0x2fffff
bllay;调用延迟子程序
blooptest
lay
subr0,r0, #1;r0=r0-1
cmpr0,#0x0;将r0的值与0
bnelay进行比较。
比较结果不为0(r0不为0)。
继续打电话延迟。
如果没有,请运行以下函数: 项语句
movpc,lr;返回值
END;