- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在帮助实验室进行 ARM7 汇编语言类(class),今天遇到一个问题,学生输入了以下表达式:
MUL R0, R0, R1
代码未编译。解决方案是将表达式更改为:
MUL R0, R1, R0
即MUL 的前两个参数不能是同一个寄存器。我已经知道这一点,因为它是 ARM 文档的一部分: http://infocenter.arm.com/help/topic/com.arm.doc.dui0489i/DUI0489I_arm_assembler_reference.pdf
学生很高兴他们的问题得到了解决,但我很沮丧,因为我不知道为什么 ARM7 要求这样传递参数。我认为这可能与乘法器移位和加法时用于存储中间值的寄存器之一有关,但我什至不确定乘法在 ARM 上是否是这样工作的(事实上,我相当清楚)当然不是)。为什么参数的顺序在这里如此重要?
最佳答案
“在 ARMv6 之前的架构中,Rn 必须与 Rd 不同”这一事实表明,这是原始三级 ARM 流水线中如何实现乘法的设计限制。 ARMv6 之前是指采用 ARM7 或更早设计的 CPU,这些 CPU 都使用简单的三级管道。与大多数指令不同,乘法需要多个周期来执行,并且根据指令集限制,您的怀疑似乎是正确的,目标寄存器Rd在每个周期都会被修改以计算结果。
论文Verifying ARM6 Multiplication by Anthony Fox ,通过图 4(下面重新格式化以适应 Stack Exchange 标记的限制)显示了在 ARM6 内核执行乘法指令期间如何修改 Rd 来支持这一点:
t3
- Fetch an instruction
- Increment the program counter
- Set
mul1
toreg[Rs]
- Set
borrow
to falseSet
count1
to zeroSet
reg[Rd]
toreg[Rn]
if accumulate, otherwise zero- Set
mul
tomul1[1:0]
- Set
mul2
tomul1[31:2]
- Set
borrow2
toborrow
- Set
mshift
toMSHIFT2(borrow,mul,count1)
tn
- Set
alub
toreg[Rm]
shifted left bymshift
- Set
alua
toreg[Rd]
- Set
mul1
tomul2[29:0]
- Set
borrow
tomul[1]
Set
count1
tomshift[4:1] + 1
Set
reg[Rd]
toALU6<sup>*</sup>(borrow2,mul,alua,alub)
- Set
mul
tomul1[1:0]
- Set
mul2
tomul1[31:2]
- Set
borrow2
toborrow
- Set
mshift
toMSHIFT2(borrow,mul,count1)
- Update
NZC
flags ofCPSR
(ifS
flag set)- If the last iteration then decode the next instruction
Fig. 4: ARM6 implementation of the multiply instructions. Each cycle is split into two phases. The tn cycle is repeated until
MULX(mul2,borrow,mshift)
is true. RegisterRd
is not updated whenRd
is equal toRm
or fifteen.
自 reg[Rd]
在初始设置周期 t3 和重复 tn 周期期间进行修改,结果将是垃圾如果 Rd == Rm
因为步骤“将 alua
设置为 reg[Rm]
左移 mshift
”期望读取 Rm 的原始未修改值,而不是存储在 Rd 中的当前中间值>.
某些 ARM7 CPU 有一个“快速乘法器”,每个周期处理 8 位,而不是如上所述的每个周期处理 2 位,但它似乎也会在计算过程中修改寄存器。
关于assembly - 为什么 ARM7 上 MUL 表达式的前两个参数不能相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33046876/
我正在用 yacc/bison 编写一个简单的计算器。 表达式的语法看起来有点像这样: expr : NUM | expr '+' expr { $$ = $1 + $3; } | expr '-'
我开始学习 lambda 表达式,并在以下情况下遇到了以下语句: interface MyNumber { double getValue(); } MyNumber number; nu
这两个 Linq 查询有什么区别: var result = ResultLists().Where( c=> c.code == "abc").FirstOrDefault(); // vs. va
如果我们查看 draft C++ standard 5.1.2 Lambda 表达式 段 2 说(强调我的 future ): The evaluation of a lambda-expressio
我使用的是 Mule 4.2.2 运行时、studio 7.5.1 和 Oracle JDK 1.8.0_251。 我在 java 代码中使用 Lambda 表达式,该表达式由 java Invoke
我是 XPath 的新手。我有网页的html源 http://london.craigslist.co.uk/com/1233708939.html 现在我想从上面的页面中提取以下数据 完整日期 电子
已关闭。这个问题是 off-topic 。目前不接受答案。 想要改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 已关闭10 年前。 Improve th
我将如何编写一个 Cron 表达式以在每天上午 8 点和下午 3:30 触发?我了解如何创建每天触发一次的表达式,而不是在多个设定时间触发。提前致谢 最佳答案 你应该只使用两行。 0 8 * * *
这个问题已经有答案了: What do 3 dots next to a parameter type mean in Java? (9 个回答) varargs and the '...' argu
我是 python 新手,在阅读 BeautifulSoup 教程时,我不明白这个表达式“[x for x in titles if x.findChildren()][:-1]”我不明白?你能解释一
(?:) 这是一个有效的 ruby 正则表达式,谁能告诉我它是什么意思? 谢谢 最佳答案 正如其他人所说,它被用作正则表达式的非捕获语法,但是,它也是正则表达式之外的有效 ruby 语法。 在
这个问题在这里已经有了答案: Why does ++[[]][+[]]+[+[]] return the string "10"? (10 个答案) 关闭 8 年前。 谁能帮我处理这个 JavaSc
这个问题在这里已经有了答案: What is the "-->" operator in C++? (29 个答案) Java: Prefix/postfix of increment/decrem
这个问题在这里已经有了答案: List comprehension vs. lambda + filter (16 个答案) 关闭 10 个月前。 我不确定我是否需要 lambda 或其他东西。但是,
C 中的 assert() 函数工作原理对我来说就像一片黑暗的森林。根据这里的答案https://stackoverflow.com/a/1571360 ,您可以使用以下构造将自定义消息输出到您的断言
在this页,John Barnes 写道: If the conditional expression is the argument of a type conversion then effec
我必须创建一个调度程序,它必须每周从第一天上午 9 点到第二天晚上 11 点 59 分运行 2 天(星期四和星期五)。为此,我需要提供一个 cron 表达式。 0-0 0-0 9-23 ? * THU
我正在尝试编写一个 Linq 表达式来检查派生类中的属性,但该列表由来自基类的成员组成。下面的示例代码。以“var list”开头的 Process 方法的第二行无法编译,但我不确定应该使用什么语法来
此 sed 表达式将输入字符串转换为两行输出字符串。两条输出行中的每一行都由输入的子串组成。第一行需要转换成大写: s:random_stuff\(choice1\|choice2\){\([^}]*
我正在使用 Quartz.Net 在我的应用程序中安排我的工作。我只是想知道是否可以为以下场景构建 CRON 表达式: Every second between 2:15AM and 5:20AM 最
我是一名优秀的程序员,十分优秀!