linux mips 指令集无效,linux-mips中经常看到的一些伪指令

本文详细介绍了MIPS汇编中的.set伪指令,包括.setnoreorder、.setreorder、.setvolatile等,讲解了它们在代码排序、执行顺序控制和内存访问稳定性等方面的作用,对于理解和编写MIPS汇编代码具有重要意义。
摘要由CSDN通过智能技术生成

在linux-mips中经常看到的一些伪指令,在这里做一个小结。再碰见再补充啦

//Mips中常见的.set伪指令;//下面的解说,优先使用中文,缺少的部分使用英文。

.set 告诉汇编器如何进行汇编;

标号:"1:"是数字标号,大多数汇编器都接受它作为局部标号。在一个程序里你可以有任意多个标号都为“1:”

通过“1f”引用下一个标号“1:通过“1b”来引用上一个“1:”

.text告诉汇编器,除非另有说明,应当把此后产生的代码直接放进目标文件中名叫“.text”的区中;

.globl声明“name”为全局变量,该变量名要包括在模块的符号表内,而且名字在整个程序范围内必须是唯一的。

.ent 对生成的代码没有影响,只是告诉汇编器将这一点标志为“xxx”函数的起始点;

.name在汇编器的输出中,为改点提供一个名为“name”的标号。

.set mipsn

.set push --> save all settings

.set pop --> restore saved settings

.set reorder/noreorder --> let/don't let assembler reorder instructions

.set at/noat --> let/don't let assembler use the register $at in instruction aliases (li,la, etc.)

.set volatile/novolatile

.set nomacro

1..set mipsn

n是一个从0到5的数字,或是数字32或64。简单说,下面使用什么样的mips子令集;

2..set push     .set pop

" The directives .set push and .set pop may be used to save and restore the current settings for all the options which are controlled by .set. The .set push directive saves the current settings on a stack. The .set pop

directive pops the stack and restores the settings.

These directives can be useful inside an macro which must change an option such as the ISA level or instruction reordering but does not want to change the state of the code which invoked the macro.

Traditional MIPS assemblers do not support these directives. "//这句话告诉我们什么是新式mips

For case here, the thing is: we will change the .set reorder, which may be .set noreorder before.

3..set noreorder/reorder

默认汇编器处在reorder的模式下,该模式允许汇编器对指令进行重新排序,以避免流水线堵塞并获得更好的性能,在这种模式下,是不允许在代码中插入 nop指令的。反之,在

noreorder模式下,指令的顺序不会被改变也不会对代码进行任何优化。这样做的优点是程序员可以完全控制代码的执行顺序,缺点是必须手工对指令排序,并在分支和加载指令的

延迟槽中填上有用的指令或nop指令.比如:

.set noreorder

lw   t0, 0(a0)

nop        #加载指令延迟槽

sub  t0, 1

bne  t0, zero, loop

nop        #分支指令延迟槽

.set reorder

4..set volatile/novolatile

处在volatile区的所有存取指令都不会被移动位置(特别是存取指令之间的相对位置)。这一点对访问内存映射设备的寄存器非常重要。因为对于外围设备而言,读写的次序十分重

要。另外对读状态寄存器也非常重要。因为想得到的状态都是最新的。举例来说,如果下列代码没有使用.set volatile,那么汇编器很有可能会对第二个lw指令移到指令的前面,因为

这样可以填充第一条lw指令的延迟槽:

.set volatile

lw   t0, 0(a0)

sw   t0, 0(a1)

lw   t0, 4(a0)

.set novalatile

避免流水线堵塞的操作以及其他各种优化措施不受该设定的影响.

5. .set noat

阻止汇编器将汇编代码翻译成二进制序列依赖at/$1寄存器

6..set nomacro

阻止汇编器将一条汇编代码翻译成多条指令

参考引用地址:  http://blog.csdn.net/adaptiver/article/details/6760220   《see mips run》网络

阅读(6801) | 评论(0) | 转发(0) |

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值