我正在研究一个程序,该程序通过10个数字进行循环.前9个元素的值高于0,第10个元素的值为0.遇到0时循环应断开. i=0; while(A[i]!=0) { A[i]=A[i]+1; i++; } 我知道,如果寄存器的值等于0,我可以使用'BEQ'打破循环.但是,我对在内存中的操作值不够了解. 这是我第一次使用MIPS,您会发现这是一团糟.如果您不能为我修理,您能给我一些指针吗? .data #by default, the "data segment" starts at address 0x10010000 .word 1 .word 2 .word 3 .word 4 .word 5 .word 6 .word 7 .word 8 .word 9 .word 0 .text #instructions start below # MIPS assembly code lui $a0, 0x1001 # $a0 =
以下是关于 mips 的编程技术问答
我试图弄清楚如何在Visual Studio中编译一个简单的Hello World,但对于MIPS处理器.遵循MS #include int main() { std::cout cl /QMR4100 /EHsc forloop.cpp Microsoft (R) C/C++ Optimizing Compiler Version 16.00.30319.01 for x64 Copyright (C) Microsoft Corporation. All rights reserved. **cl : Command line warning D9002 : ignoring unknown
我打算在FPGA上设计一个类似MIPS的CPU. CPU将拥有经典的五阶段管道,而无需转发和预防危险.在计算机架构课程中,我了解到,第一个MIPS-CPU用于从上升时钟边缘上的寄存器文件中读取并在Falling Clock Edge上写入.我正在使用的FPGA不支持使用上升和下降时钟边缘(关于阅读和写入寄存器),所以我不能完全喜欢原始的mips,必须在上升的时钟边缘上做到这一点. 所以,这是我遇到问题的部分.该指令将写回到书面阶段的寄存器写入.写回阶段将数据直接发送到解码阶段.解码阶段中的另一个指令想读取相同的寄存器,也要读取书本阶段想要写的寄存器. 在这种情况下会发生什么?解码阶段是否为指令或仍在寄存器文件中的旧值进行新值? 解决方案 一个适合经典五阶段设计的解码阶段的寄存器文件由三重端口RAM(或两个双端口RAM)和两个Muxers and Comparators组成.需要比较器和Muxers绕过来自写入阶段的数据.这是需要的,因为在下一个周期中,写入数据写入了三
有一个问题被问到有关将负载字节实现到单个周期数据patath而不必更改数据内存的问题,而解决方案则是下面的问题. alt text http://img214.imageshack.us/img214/7107/99897101. JPG 这实际上是一个现实的 问题;大多数内存系统是 完全基于单词和个人 字节通常仅处理 在处理器内部.当你看到一个 许多计算机上的"公交错误" 通常意味着处理器尝试了 访问一个记忆地址 不正确的单词一致, 内存系统提出了例外. 无论如何,因为字节地址可能 不是4个倍数,我们不能通过 他们直接进入内存.但是,我们 仍然可以在任何字节上获得 每个字节都可以在某些人中找到 单词,所有单词地址是 倍数4.所以我们的第一件事 做是确保我们正确 单词.如果我们拿到高30位 地址(即Aluresult [31-2]) 并将它们与两个0位结合 低端(这是左边 Shift 2英寸单元确实在做),我们 具有单词的字节地址 包含所需的字节.这是 只是字节自己的地址,
好吧,这个问题更多是一个讨论.我有这个项目是在VHDL中实现pipelined MIPS处理器. 我完全熟悉管道的概念,但我从未用VHDL实施它. VHDL中的pipelined processors实施实施的一些好资源是什么. 我需要一个刚开始吗? 解决方案 有一本书大卫·哈里斯(David Harris)和莎拉·哈里斯(Sarah Harris)的作品.请参阅第7章有关微观结构. 7.5谈论使用MIPS处理器模型进行管道. 7.6显示Verilog和VHDL代码实现.这是一本教科书,还有第二版,其中来自伴侣网站的HDL示例显然是VHDL和Systemverilog.浏览VHDL代码,似乎并没有强调管道寄存器,而不是构建块. 7.5中的数字应该是一个很大的帮助,也可以从伴侣站点下载. 在Opencores网站上有 ion -mips -mips -mips(tm)兼容CPU ::概述可以下载R3000兼容核心的VHDL模型(注册后).管道阶段在mips_cpu
大家可能知道,MIPS指令集支持CLZ(计数为零)如下: clz $ t0,$ t1计数领先零t0 = t1 中的领先零的# 我正在Verilog中写一个单个周期数据,只是想知道ALU需要支持什么才能做到这一点...任何想法? 解决方案 这是一种可能的方法(我忽略了输入0的情况,最好将其视为特殊情况): 32位数字中领先的零的数量是: 前16位中的前16位中的领先零数量是非零的;或 16,加上底部16位领先零的数量,如果前16位全部为零 给出了5位结果的顶部(忽略输入的特殊情况0 ...). 现在您需要在16位数字中找到领先零的数量,因此再次应用相同的原理. 等. 在Verilog中,它可能看起来像这样: result[4] = (value[31:16] == 16'b0); val16 = result[4] ? value[15:0] : value[31:16]; result[3] = (val16[15:8] == 8
我有此代码: alu.v module ALU( src1_i, src2_i, src3_i, src4_i, ctrl_i, result_o, zero_o ); //I/O ports input [32-1:0] src1_i; input [32-1:0] src2_i; input [4-1:0] src3_i;//shmat is 5 bits instruction[10:6] input [15-1:0] src4_i;//ori have to deal with 'zero-extended' number input [4-1:0] ctrl_i; output [32-1:0] result_o; output zero_o; //Internal signals reg [32-1:0] result_o; wire
我知道基本`include" filename.v"命令.但是,我试图在另一个文件夹中包含一个模块.现在,该模块还包括同一文件夹中存在的其他模块.但是,当我尝试在最高级别上运行模块时,我会遇到错误. C:\Users\Dell\Desktop\MIPS>iverilog mips.v ./IF/stage_if.v:2: Include file instruction_memory_if.v not found No top level modules, and no -s option. 在这里,我正在尝试制作一个MIPS处理器,该处理器包含在" mips.v"中.该文件的第一个语句是"`ixplus'ifly/stage_if.v'.在if文件夹中,我在stage_if.v中包含了许多文件,其中一个是" contermition_memory_if.v.v".下面.是目录级别图. -IF instruction_memory_if.v stage_if.v
如何在嵌入式Linux框上运行Valgrind,以在我的主要软件中查找内存泄漏? 在rcS脚本中,我像这样运行: ./main_app 如何将./main_app程序与Valgrind关联? main_app进程永远不会终止. 我想不断将数据记录为文件.另外,我想访问日志文件而不终止main_app进程.我可以执行telnet并可以访问日志文件.但是问题是直到且除非处理程序关闭,否则我该如何打开文件,即我不太了解哪些valgrind参数控制了如何记录内存泄漏以记录到文件.请帮助! 解决方案 您可以尝试自行构建MIPS,在这里进行步骤: 从这里下载valgrind http://valgrind.org/downloads/ - 我使用了Valgrind 3.8.8.11 用Valgrind解开档案,然后移至Valgrinds文件夹 执行: ./autogen.sh ./configure --host=mipsel-linux-gnu --prefix
我正在学习计算机算术.我使用的书(Patterson和Hennessey)列出了以下问题. 写MIPS代码以进行双重 精密整数减法 64位数据.假设第一操作数 在寄存器中$ t4(hi)和 $ t5(lo),第二$ t6(hi)和 $ t7(lo). 我对答案的解决方案是 sub $t3, $t5, $t7 # Subtract lo parts of operands. t3 = t5 - t7 sltu $t2, $t5, $t7 # If the lo part of the 1st operand is less than the 2nd, # it means a borrow must be made from the hi part add $t6, $t6, $t2 # Simulate the borrow of the msb-of-low from lsb-of-high sub $t
当我尝试在MIPS中使用未签名的整数工作时,我所做的每个操作的结果都会签名(也就是说,整数都在2的补充中),即使我执行的每个操作都是无签名的操作:addu,addu, multu,所以第四... 当我在范围内打印数字[2^31, 2^32 - 1]时,我会像签名一样得到他们的"溢出"负值(我想它们是). 不过,当我尝试这样的事情时: li $v0, 1 li $a0, 2147483648 # or any bigger number syscall 印刷号码始终2147483647 (2^31 - 1) 我很困惑...我想念什么? ps:我还没有包含我的代码,因为它不是很可读(这是汇编代码)并抛开此问题, 似乎工作正常.如果有人觉得有必要,我将立即将其包括在内! 解决方案 来自 wikipedia : MIPS32指令集指出,作为添加和减去指令的一部分的单词无符号是错误的. 命令的签名版本和无符号版本之间的差
在MIPS组装中,使用addiu而不是addi有什么好处?不是addiu未签名(并且会破坏我们的计算吗?) 解决方案 并将破坏我们的计算 不,MIPS使用 em> 两者的补充 相同的加法/减法指令可用于签名和未签名操作.结果没有区别. 对于位指令,非踢踏乘法和许多其他操作也是如此.参见 哪些算术操作在未签名和两个补充签名的数字上相同? 签名和在位上的签名和未签名之间的差异 它们之间的唯一区别是addi当溢出时addiu没有生成陷阱.因此,addi及其溢出家族(add,sub ...)通常没有用.实际上,很少使用 opcode空间到其他说明 在这里,指令名称具有极大的误导性,因为它实际上不是"未签名"的添加.即时符号扩展而不是零扩展.因此,addiu $1, $2, 0xFFFF实际上将从$2中减去1,而不是向其添加65535. 尽管名称,但在我们不关心溢出时,添加即时无符号(addiu)用于将常数添加到签名的整数中. MIPS没有立即减去
我正在尝试在笔记本电脑上安装玉米片,并且在笔记本电脑上有Ubuntu 11.04. 代码在C中,因此要构建它,我认为我需要交叉编译器.这是我的问题.我使用命令 下载了MIPS交叉编译器的源代码 wget http://mll.csie.ntu.edu.tw/course/os_f08/assignment/mips-decstation.linux-xgcc.gz ,我用 解解意味 tar zxvf mips-decstation.linux-xgcc.gz 这没关系,但是当我尝试构建nachos OS的源代码时,我会得到此错误 - /usr/include/gnu/stubs.h:7:27: fatal error: gnu/stubs-32.h: No such file or directory compilation terminated. make: *** [bitmap.o] Error 1 我正在尝试按照此处的说明进行 -
我发现这个代码段,我相信将整数转换为十六进制.但是,我根本不关注它.我添加了说明我认为正在发生的事情的评论,但是我不知道为什么要这样做.因此,假设我正确地指出了每条线在做什么,请有人可以向我解释为什么要这样做?就像以任何方式有助于转换为十六进制吗? $ a0是整数值 $ a1是结果应为 的地址 addi $t0, $0, 48 #set $t0 equal to 48 sb $t0, 0($a1) #store $to (48) at location 0 in $a1 addi $t0, $0, 120 #set $t0 equal to 120 sb $t0, 1($a1) #store $t0 (120) at location 1 in $a1 addi $t1, $a1, 9 #set $t1 = the addre
我的MIPS组装类要求我在解析树中以未知大小的表达方式阅读.我从来不必处理树木,所以这就是我四处存储价值的方式: 说,用户输入了表达式1 + 3-4(每个操作数只能是数字1-9) 我最左边的子节点将是起点,并包含2个数据 1. The operand 2. Pointer to the next node (operator) 这就是我构造树的方式.我将从操作数到操作员到下一个操作数到下一个操作员,直到没有更多的值可以读入. 我的下一个任务是递归遍历树,并输出infix/prefix/postfix符号中的值. 考虑到我是如何建造树的方式. 我被困在前缀上.首先,我不完全理解. 当我在前缀中输出表达式(1 + 3-4)时,它应该出现 - + 1 3 4?我在在线示例之后遇到了麻烦. 您还认为我的树是正确建造的吗?我的意思是,我无法从当前的节点进入以前的节点,这意味着我总是必须从最左边的儿童节点开始遍历,即使我的ta说这是必经之路,也本能
我知道la在MIPS中分解为lui和ori,但是这些说明的论点是什么? 我在这里查看了这个问题 mips pseudo sustructions,replacements >始终使用4097? 考虑以下内容: .data _a: .space 4 .text main: la $s0,_a 这会翻译成这个吗? lui $at,4097 ori $s0,$at,0 谢谢! 解决方案 4097小数为0x1001.这是0x10010000的上部16位. 这是mars模拟器中.data段开始的默认加载地址. 如果您已经完成了la $s0,main,则lui是lui $at,0x0040,因为.text的默认启动地址为0x00400000. 要查看差异,请尝试以下程序: .data _a: .space 100000 _b: .space
我正在尝试翻译MIPS伪指令ROL(向左旋转).我需要在提交作业之前翻译它,这很不幸,因为伪指令对我来说很好. 指令是 rol $s4,$s4, 1 #goes to the left most bit (which as it says, gets the left most bit) 我翻译的方式是 lui $s4, 0x8001 ori $t0, $s4, 0x0004 srl $s4, $t0, 31 sll $s5, $t0, 1 or $s5, $s5, $s3 但它完全弄乱了我的代码,有人可以帮助我正确翻译吗?或告诉我我做错了什么? 预先感谢您, 解决方案 这是 slide nine在rol/ror伪建筑上拉回窗帘. 幕后有一对偏移(srl和sll),它们将相关位移动到其最终所需位置,并用0的s填充非相关位置,然后or要根据需要旋转
我需要将一些MIPS组装说明转换为C代码.我想我明白了,但这似乎是违反直觉的.有帮助吗?我们有变量F,G,H,I,J分别存储在寄存器$ S0,$ S1,$ S2,$ S3和$ S4中.阵列A和B的基础分别存储在$ S6和$ S7中. 4个字节单词.代码中的评论是我自己的. addi $t0, $s6, 4 # $t0 = A[1] add $t1, $s6, $0 # $t1 = A[0] sw $t1, 0($t0) # $t0 = A[0] lw $t0, 0($t0) # $t0 = A[0] add $s0, $t1, $t0 # f = A[0] + A[0] 我只是觉得自己错了.如果我们从不使用它,为什么要首先制作$ t0 a [1]? 解决方案 sw $t1, 0($t0) # $t0 = A[0] 您已经返回了这个.它是 store ,所以它 使用: sw $t1, 0($t0) # A[1] = $t
我在第4章中读了《计算机组织和设计》一书,它描述了单周期MIPS机器.但是,我有几次双打. 如果设计存储器和设计中的指令存储器是SRAM,则如何在招标时钟周期中完成任何指令.以负载指令为例,我认为单周期MIPS设计仍然必须经过以下阶段.仅合并ID和EXE阶段. | 1 | 2 | 3 | 4 | | WB | | | | | | IF | | | | | | ID\EXE | | | | | MEM | 如果在Negedge时钟上更新了数据存储器,则可以合并ID,EXE和MEM阶段,但仍然剩下三个阶段. 任何人都可以解释"单周期"的工作方式?谢谢! 解决方案 您在第4章中阅读的单个周期处理器对现实中可实现的内容有些过分简化.他们没有显示