【发布时间】:2012-10-11 20:32:56
【问题描述】:
我在将汇编中的特定行转换为Nios II 的机器代码时遇到问题。 我已经成功编译了这些行:
START_TIMER = 0xF68C
r0 = 0x0
r8 = 0x8
label = 50000
#orhi r8, r0, %hiadj(label) --> 00000 01000 ???????????????? 110010
addi r8, r8, %lo(label) --> 01000 01000 1100001101010000 000100
subi r8, r8, 1 --> 01000 01000 1111111111111111 000100
bne r8, r0, START_TIMER --> 01000 00000 1111011010001100 011110
我遇到问题的那一行是 IMM16:
orhi r8, r0, %hiadj(label)
如上面链接的手册中所述,“%lo”表示“提取 immed32 的位 [15..0]”,“%hiadj”表示“提取位 [31..16] 并添加 immed32 的第 15 位” .但是,二进制的 50000 是 1100001101010000,因此是 16 位数字。据我所知,它不包含 16 到 31 之间的任何位。我尝试使用 0000000000000001,但它不正确。
我做错了什么?
编辑: 只是为了消除任何误解;我只是想知道如何手动编译“orhi r8, r0, %hiadj(label)”。变量“r8”、“r0”和“label”如上所述,不变。
编辑 2: 我试过的是将 50000 变成 32 位二进制:
00000000000000001100001101010000
...提取位 [31...16]:
0000000000000000
...添加第 15 位(这很令人困惑,因为他们没有告诉我它是值 2^15 还是 2^0,我都试过了,根本不加)
0000000000000001
1000000000000000
0000000000000000
全部不正确。
编辑 3: 根据this link,当16位值为0x8000或更大时,它会将其余的符号扩展为0xffff8000并将位[31...16]加1,这会将数字重载为0x100008000~0x00008000,这就是你的杰拉德说,但显然仍然不正确。
【问题讨论】:
标签: compilation assembly