我正在编写简单的SMIPS程序集测试,以便在HDL定义的处理器上运行.
例如,我有以下代码,应该生成溢出异常:
main:
#Test Overflow Exception
addi $2, $0, 0xffffffff
addi $3, $2, 0x1 我知道,如果处理器做的是正确的事情,它应该重定向到位于address 0xdeadbeef的处理程序。我只知道为跳转添加标签,就像向上面添加以下代码一样:
overflowHandler:
addiu $5 $0, 1
bne $0, $5, pass是否有办法使overflowHandler代码从正确的0死牛肉地址开始?主从地址0开始吗?
编辑:(我控制来自用HDL描述的处理器的跳转地址)
由于我控制处理器跳转地址的描述,从处理器的设计,我可以更改为可除以4,并跳转到一个更近,更方便的位置。所以我的问题是:地址是否从main开头的地址0x0开始计数??什么是最好的解决方案?:更改地址跳转,或标签以对应它?
提前谢谢你,
发布于 2013-01-30 21:30:30
由于您的处理器是用Bluespec建模的,所以使用Verilog的$readmemh()函数(该函数读取包含内存内容的文本文件)似乎会将要执行的代码加载到处理器的内存中。使用$readmemh()函数的参数和文本文件中的地址说明符来决定代码将被加载到哪个地址,这将取决于Bluespec模型创建者。
创建带有内存内容的文本文件的最简单方法是通过MIPS汇编程序运行程序集源代码,并从汇编程序的源代码列表中提取十六进制操作码。
问题:“地址是否从地址0x0开始计数?”
当重置时,MIPS处理器开始在0x1cf00000上执行代码。( 简单MIPS处理器在重置时从0x00001000开始。)通常情况下,您将跳转到您的测试程序的开始在重置地址。如果加载要在address 0x0上执行的测试程序,JR $zero应该可以工作。
测试程序中的分支都应该是相对地址,所以您不需要做任何特殊的事情来指定测试代码中标签的地址。如果您需要分支到一个已知位置进行PASS并失败,请执行类似的操作(假设PASS位于address 0x4000):
LI $t0, 0x4000
JR $t0发布于 2013-01-31 22:54:01
这个问题没有得到很清楚的回答。通常,某些标签的地址由汇编程序(或链接器)自动分配,并取决于许多因素。
汇编程序总是有一些指令,允许程序员在一定程度上控制代码和标签放在地址空间的位置。"org“指令通常用于设置装配过程的当前地址。
在大多数汇编程序中,下面的代码将标签overflowHandler设置为0x死牛肉。
org 0xdeadbeef ; or any other number
overflowHandler:
; some code here但是,这同样取决于特定的汇编程序语法(而且,作为一种规则,它们在不同的实现中是不同的)。另一个问题是,即使编译正确,代码也必须以正确的地址加载到内存中。此任务不是汇编程序任务,而是链接器、OS的任务,并取决于所使用的二进制文件格式。
请注意,在大多数操作系统中,程序员无法自由选择加载二进制文件的地址。
这里的正确方法是仔细学习用于项目的工具--汇编程序语法(我指的是汇编程序指令,而不是处理器指令)、链接器特性、所使用的二进制格式以及加载这些代码以供执行的操作系统功能。
https://stackoverflow.com/questions/14441464
复制相似问题