【问题标题】:Compiling Assembly Manually手动编译程序集
【发布时间】: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


    【解决方案1】:

    您提供的代码采用“label”处的值,这是一个 16 位半字,并将其扩展为 32 位字以成为地址。由于您的标签是 16 位值,因此您必须将零移到寄存器的上半部分。

    所以你想要做的是将零加载到高位,然后添加低位......

    orhi  r8, r0, %hiadj(label) --> 00000 01000 0000000000000000 110010
    addi  r8, r8, %lo(label) --> 01000 01000 1100001101010000 000100
    

    【讨论】:

    • "orhi" 和 "addi" 是伪指令 "mvia" (mvia r8,50000) 的一部分,因此它直接出现在 "addi" 之前。除了这四个之外,没有其他指令提供给我,所以它不是一个完整的程序,只是一个 sn-p。当你说“将位移到 [31...16]”时,你的意思是我应该把它变成 11000011010100000000000000000000 吗?我对汇编编程很陌生,所以请多多包涵。
    • 谢谢,但这也不正确。我很困惑,因为它说“提取位 [31...16](全为零)并添加位 15”。由于第 15 位已经为 1,它应该延续到第 16 位,因此为 000000000000001,但也不正确...
    • 0xFFFF 是一个有符号的 16 位数字,所以它实际上是 -1。添加低 16 位数字的高位将是 -1 + 1 = 0。所以高 16 位再次出现零。我看到你的 r8 寄存器的值是 0x08。你的意思是这样做,还是应该是0x00?当您“或”寄存器时设置第 3 位将保留第 3 位设置。
    • 非常抱歉,我在输入数字时犯了一个简单的错误。你是对的。谢谢:]
    猜你喜欢
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-19
    • 2013-01-20
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多