关于有效立即数的问题,请高手帮忙解答一下

2019-10-15 17:59发布

如题,ARM汇编指令中使用到的立即数是是由一个8位的立即数循环左移偶数位得到,所以并不是每一个立即数都是有效立即数。但是我刚才发现使用如下指令:MOV R0,#0xfffffffe
编译通过,结果正确。我不明白,这个立即数0xfffffffe是如何由“一个8位的立即数循环左移”得到的,还请大家帮忙答疑解惑一下,谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
K.O.Carnivist
1楼-- · 2019-10-15 23:39
本帖最后由 K.O.Carnivist 于 2017-1-9 12:28 编辑

“MOV R0,#0xfffffffe”会被编译器转成“MVN R0, #0x00000001”吧

修正:应该是汇编器Assembler不是编译器Compiler
teczm
2楼-- · 2019-10-16 00:09
@正点原子 @八度空间 麻烦帮忙看看呗
teczm
3楼-- · 2019-10-16 01:00
 精彩回答 2  元偷偷看……
teczm
4楼-- · 2019-10-16 06:40
这么多人查看没人解答吗,帮顶一下呗,谢谢大家了
xuande
5楼-- · 2019-10-16 09:33

ARM汇编指令中使用到的立即数是是由一个8位的立即数循环左移偶数位得到   —— 这句话哪里看到的?十有八九断章取义了。

MOV R0,#0xfffffffe   —— 这条指令哪里体现移位了?

K.O.Carnivist
6楼-- · 2019-10-16 09:36
xuande 发表于 2017-1-9 11:37
ARM汇编指令中使用到的立即数是是由一个8位的立即数循环左移偶数位得到   —— 这句话哪里看到的?十有八 ...

32位ARM指令的总长度是32位,里面是放不下完整的32位立即数的。处理方法是用12位,其中8位表示立即数,另外4位表示将它右移多少位。

对于“MOV R0,#0xfffffffe”,
移位是在指令机器码解码的时候完成的。
这样一条语句,汇编器会自动处理成类似于“把0x01循环右移0位,然后取反赋给R0”。

一周热门 更多>