DV.*_*DV. 4 assembly mips cpu-registers spim
我写在MIPS某些代码,我已经来到这里的要求是存储结果,暂时在点HI
和LO
特殊寄存器(均为4个字节宽).这些说明由我掌握:
divu s,t lo <-- s div t ; hi <-- s mod t
multu s,t hi / lo < -- s * t ;
Run Code Online (Sandbox Code Playgroud)
因此,divu
存储除法LO
和余数的结果HI
,同时multu
存储乘法LO
(低4字节)和HI
(高4字节)的结果.
稍后,为了检索结果HI
和LO
寄存器,我可以:
mfhi $v0
mflo $v1
Run Code Online (Sandbox Code Playgroud)
我已经想出了如何将计算结果存储在LO
:
ori $v0,$0,1 # Store result from $a0 into LO
divu $a0,$v0
Run Code Online (Sandbox Code Playgroud)
divu
在LO分工的结果保存,所以我只是除以1的结果得到它.但是,存储HI
更复杂.一种方法是强制multu
指令将值移位32位(4字节):
multu $a0,0x80000000 # Shift $a0 by 32 bits and store into HI/LO
Run Code Online (Sandbox Code Playgroud)
但是,其结果是,在价值HI
是它应该是(所以如果我的值是1个右0100 1000
,然后HI
将包含0010 0100
).
有谁知道如何在HI
寄存器中存储东西?
我想扩展Nils Pipenbrinck的回答:
来自MIPS32 arquitechture的程序员
格式:MIPS32(MIPS I)
MTHI rs
Run Code Online (Sandbox Code Playgroud)
目的:将GPR复制到专用HI寄存器
Description: HI ? rs
Run Code Online (Sandbox Code Playgroud)
GPR rs的内容被加载到专用寄存器HI中.
限制:
在将新结果写入HI或LO之前,必须由MFHI或MFLO读取由DIV,DIVU,MULT或MULTU写入HI/LO对的计算结果.如果在遵循这些算术指令之一但在MFLO或MFHI指令之前执行MTHI指令,则LO的内容是不可预测的.以下示例显示了这种非法情况:
MUL r2,r4 # start operation that will eventually write to HI,LO
... # code not containing mfhi or mflo
MTHI r6
... # code not containing mflo
# this mflo would get an UNPREDICTABLE value
MFLO r3
Run Code Online (Sandbox Code Playgroud)
历史信息:
在MIPS I-III中,如果前两个指令中的任何一个是MFHI,那么MFHI的结果是不可预测的.必须将HI或LO特殊寄存器的读取与通过两条或更多条指令写入的后续指令分开.在MIPS IV及更高版本中,包括MIPS32和MIPS64,此限制不存在.
格式:MIPS32(MIPS I)
MTLO rs
Run Code Online (Sandbox Code Playgroud)
目的:将GPR复制到专用LO寄存器描述:
LO ? rs
Run Code Online (Sandbox Code Playgroud)
GPR rs的内容被加载到专用寄存器LO中.
限制:在将新结果写入HI或LO之前,必须由MFHI或MFLO读取由DIV,DIVU,MULT或MULTU写入HI/LO对的计算结果.
如果在遵循这些算术指令之一但在MFLO或MFHI指令之前执行MTLO指令,则HI的内容是不可预测的.以下示例显示了这种非法情况:
MUL r2,r4 # start operation that will eventually write to HI,LO
... # code not containing mfhi or mflo
MTLO r6
... # code not containing mfhi
# this mfhi would get an UNPREDICTABLE value
MFHI r3
Run Code Online (Sandbox Code Playgroud)
历史信息:
在MIPS I-III中,如果前两个指令中的任何一个是MFHI,那么MFHI的结果是不可预测的.必须将HI或LO特殊寄存器的读取与通过两条或更多条指令写入的后续指令分开.在MIPS IV及更高版本中,包括MIPS32和MIPS64,此限制不存在.
MIPS指令集与MFLO/MFHI具有对应关系.
它被称为MTLO/MTHI并且完全符合您的要求:
mtlo $v0 # moves the contents of v0 into the lo-register
mthi $v1 # moves the contents of v1 into the hi-register
Run Code Online (Sandbox Code Playgroud)
这些指令很少见,通常不会出现在汇总指令集引用中.
顺便说一下:务必查看处理器手册,了解LO/HI注册涉及的延迟和危险.它们非常特殊,您的代码可能需要在写入和读取之间至少等待三个周期.不幸的是,这种行为取决于您正在使用的CPU.
对于有抱负的MIPS程序员来说,错误是一个常见的陷阱:-)