我一直在尝试设计一个表达式来检查MIPS指令,例如:
lw $t1 70000($s0)
我对lw
和$t1
部分有表达式,但我被困在70000($s0)
部分。
($s0)
之前的数字不能超过−32768
或32767
,$
只能存在一次,s
部分必须是s
或t
并且只出现一次,之后的数字只能从0-7
s
和0-9
t
。
对此的任何帮助将不胜感激。
这是我对脚本另一部分中$s0
部分的表达式:
^($((s?[0-7])|(t?([0-9]))))$
我在 if 语句中使用它来检查输入的文本是否有效,它主要是我卡在上面的前缀数字部分。
谢谢
EDIT1:我设法使用offset=${w3%(*}
将字符串截断到第一个(
之前,将值与($s0)
分开。我的脚本不会处理任何内容,例如值之前的(
。
我现在需要检查此值是小于−32768
还是大于32767
.关于如何存档的任何想法?
编辑2:我已经设法解决了我的问题,并发布了解决方案作为答案,感谢所有回复。
(-?[0-9]{1,5})($(s[0-7]|t[0-9]))
我同意让正则表达式检测数字范围是浪费精力。上面捕获了您描述的偏移和寄存器,并进行了一些更正和简化。
好的,我已经设法解决了这个问题,方法如下:
offset1=${w3%(*} # retrive the offset of the instruction
if [[ ${offset1:0:1} == "-" ]]; then # if the first char is a - then,
offset1NoSign=${w3%(*} # get the offset number
offset1NoSign=${offset1NoSign##*-} # get rid of the -
echo " This should not have a - sign: $offset1NoSign"
fi
if [[ ( ${offset1:0:1} == "-" && $offset1NoSign -gt "32768" ) || ( $offset1 -gt "32767" ) ]]; then
echo "Out of bounds immediate. Immediates range between −32768 and 32767."
else
---- rest of code ----
它不是很漂亮,但它有效。它首先使用offset1=${w3%(*}
截断字符串以获取(
之前的数字(例如。-500($s0)
将被截断为-55
)。
然后它会检查第一个字符是否是-
如果是,请将其删除:
if [[ ${offset1:0:1} == "-" ]]; then # if the first char is a - then,
offset1NoSign=${w3%(*} # get the offset number
offset1NoSign=${offset1NoSign##*-} # get rid of the -
#echo " This should not have a - sign: $offset1NoSign"
fi
接下来,检查它是否超过两个数字
if [[ ( ${offset1:0:1} == "-" && $offset1NoSign -gt "32768" ) || ( $offset1 -gt "32767" ) ]]; then
echo "Out of bounds immediate. Immediate range between −32768 and 32767."
else
它检查第一个字符是否为-
,是否大于32768
或数字是否刚好大于32767
。
指令的其余部分只是使用正则表达式来检查它。