0

我正在编写要在 HDL 定义的处理器上运行的简单 SMIPS 组装测试。

例如,我有以下代码应该生成溢出异常:

main:

        #Test Overflow Exception

        addi $2, $0, 0xffffffff
        addi $3, $2, 0x1  

我知道如果处理器做正确的事情,它应该重定向到放置在 address 的处理程序0xdeadbeef。我只知道为跳转添加标签,就像在上面添加以下代码一样:

overflowHandler: 
        addiu $5 $0, 1
        bne   $0, $5, pass

有没有办法让 overflowHandler 代码从正确的 0xdeadbeef 地址开始?main 是否从地址 0 开始?

编辑:(我可以控制 HDL 中描述的处理器的跳转地址)

由于我可以从 Bluespec 中的处理器设计描述中控制处理器跳转地址,因此我可以将其更改为可被 4 整除并跳转到更近更方便的位置。所以我的问题是:地址是否从 main 开头的地址 0x0 开始计数?什么是最好的解决方案?: 改地址跳转,还是标签来对应呢?

提前致谢,

4

2 回答 2

0

由于您的处理器是在 Bluespec 中建模的,因此似乎要执行的代码将使用 Verilog 的$readmemh()函数加载到处理器的内存中,该函数读取包含内存内容的文本文件。由 Bluespec 模型创建者决定将代码加载到哪个地址,使用$readmemh()函数的参数和文本文件中的地址说明符。

创建包含内存内容的文本文件的最简单方法是通过 MIPS 汇编器运行汇编源代码,并从汇编器的源代码列表中提取十六进制操作码。

问题:“地址是否从地址 0x0 开始计数?”

0x1cf00000MIPS 处理器在复位时开始执行代码。(一个简单的 MIPS处理器在0x00001000它被复位时开始。)您通常会在复位地址处跳转到测试程序的开头。如果您加载要在地址执行的测试程序0x0JR $zero应该可以工作。

测试程序中的分支都应该指向相对地址,因此您不需要做任何特殊的事情来指定测试代码中标签的地址。如果您需要为 PASS 和 FAIL 分支到已知位置,请执行以下操作(假设 PASS 位于 address 0x4000):

LI $t0, 0x4000
JR $t0
于 2013-01-30T21:30:30.990 回答
0

这个问题回答的不是很清楚。通常,某些标签的地址由汇编器(和/或链接器)自动分配,并取决于许多因素。

汇编器总是有一些指令允许程序员在一定程度上控制代码和标签在地址空间中的位置。“org”指令通常用于设置汇编过程的当前地址。

在大多数汇编程序中,以下代码会将标签 overflowHandler 设置为等于 0xdeadbeef。

                   org 0xdeadbeef ; or any other number
overflowHandler:   
                  ; some code here

但同样,它取决于特定的汇编器语法(通常,它们在不同的实现中是不同的)。另一个问题是即使正确编译,代码也必须加载到正确地址的内存中。这个任务不是汇编任务,而是链接器的任务,操作系统也依赖于使用的二进制文件格式。

请注意,在大多数操作系统中,程序员不能自由选择加载某些二进制文件的地址。

此处正确的方法是仔细学习用于项目的工具 - 汇编器语法(我的意思是汇编器指令,而不是处理器指令)、链接器功能、使用的二进制格式以及将加载此代码以执行的操作系统功能。

于 2013-01-31T22:54:01.317 回答