MIPS中addi指令被分成三条指令的问题
问题
基于MIPS写CPU时,突然发现addi指令有时会被mars拆解为三条指令,再转为机器码。
发现这个问题是因为显然我们有为一个32位寄存器赋值的需求,使用addi $t1, $zero, imm
来实现很方便。但addi指令中的imm(立即数)字段只有16位,如果立即数太大了,mars并不会报错,而是自动地用其他可行的语句实现我们的需求。
实验
case1:
addi $t1, $zero, 0x8000汇编程序将其拆解为三条:
lui $1, 0x00000000
ori $1, $1, 0x00008000
add $9, $0, $1
case2:
addi $t1, $zero, 0x7fff汇编程序翻译:
addi $9, $0, 0x00007fff # 16位立即数能表示的最大正数为0x7fff
汇编默认程序员输入的常数如果不带负号就是正数(方便编程,如果想用一个负数还需要手动转它的补码表示,肯定崩溃了)。16位立即数能表示的最大正数为0x7fff。当addi中的立即数太大,超过0x7fff时,addi指令中的imm字段放不下。但ori指令的按位或并不care最高位是不是符号位,借助lui和ori即可实现。
当然,这种”默认“不是没有底线的。如果程序员输入的常数大于等于0x80000000,超出了32位寄存器能存下的最大正数,汇编程序再怎么搞也不行。这种情况下,mars只能将其理解为一个负数(仍然不会报错)。
case3:
addi $t1, $zero, 0xffff7fff汇编程序将其拆解为三条:
lui $1, 0xffffffff
ori $1, $1, 0x00007fff
add $9, $0, $1
case4:
addi $t1, $zero, 0xffff8000汇编程序翻译:
addi $9, $0, 0xffff8000 # 16位立即数能表示的最小负数为0x8000
这两种情况和上面的case1和case2是类似的,负数如果太大,imm字段就放不下,借助lui和ori实现。
总结
- 当立即数在0x00000000~0x7fffffff范围内时,mars认为你想表示一个正的立即数。
- 0x00000000~0x00007fff,imm字段能放下,一条指令实现。
- 0x00007fff~0x7fffffff,imm字段放不下太大的正数,三条指令实现。
- 当立即数在0x80000000~0xffffffff范围内时,mars认为你想表示一个负的立即数。
- 0x80000000~0xffff7fff,imm字段放不下太小的负数,三条指令实现。
- 0xffff8000~0xffffffff,imm字段能放下,一条指令实现。
MIPS中addi指令被分成三条指令的问题相关推荐
- 标准的网页浏览器都提供一个功能:保留最近浏览过页面的历史记录。通过后退或向前按钮就能在历史记录之间跳转。现在,请你模拟这个功能,接收如下三条指令:1. BACK:回退功能,即回退到上一个访问的
标准的网页浏览器都提供一个功能:保留最近浏览过页面的历史记录.通过后退或向前按钮就能在历史记录之间跳转. 现在,请你模拟这个功能,接收如下三条指令: 1. BACK:回退功能,即回退到上一个访问的页面 ...
- 三条中线分的六个三角形_解读三角形中的三边关系和三条线段的应用
作为东方文化四大奇迹之一,金字塔是古埃及文明的代表作.在尼罗河下游,至今仍然散布着约80座金字塔遗迹.金字塔的庄严感和稳定性,主要来自于各面都是等腰三角形,有的甚至于接近等边三角形. 三角形是数学中最 ...
- 从李飞飞、吴恩达、安德鲁的年度总结中,我们发现了三条2018年AI行业发展趋势...
"AI梦想远大,但它还只是一门年轻的科学.只有在深思熟虑.兼容并包的探索下,2018的AI才会取得更多的进步."李飞飞在其年终总结的最后写到. 首先,祝大家圣诞节快乐!(当然如果你 ...
- 回归指令_用一条指令在新款 Mac 上找回经典的开机启动声
多年使用 Mac 的老用户肯定知道,Mac 在启动时会发出一声「噔-」的启动声音,伴随着 Apple logo 在屏幕上亮起,Mac 正在安全地启动.但如果你在最近几年换了新款 Mac 电脑,你会发现 ...
- 下面的 3 条指令执行后, cpu 几次修改 IP? 都是在什么时候? 最后 IP 中的值是多少?
1 2 3 mov ax,bx sub ax,ax jmp ax 第1次:从存储器中读取mov ax, bx指令之后,IP立即改变,指向下一条指令(sub ax, ax)的地址. 第2次:从存储器读取 ...
- c语言rsi2010中制运行,汇编语言初探(控制类指令)-来自第三章3.6的笔记-P135-P163
1.正溢出与负溢出: 首先,一个正数与一个负数相加,不可能溢出,因为结果的绝对值一定小于两个加数的绝对值,既然两个加数能合理表示出来,结果一定也能合理表示出来. 其次,正溢出是由于两个很大的正数相加, ...
- 一条指令在cpu中的执行流程(理解CPU组成)
CPU: 1.寄存器; 2.控制器CU(Control Unit): 指令寄存器IR(InstructionRegister).程序计数器PC(ProgramCounter)和操作 ...
- jmp指令流程图怎么写_应用程序里的指令可以分成向操作系统请求特定的服务和什么?-常见问题...
理论上说,应用程序里的指令可以分成用于向操作系统请求特定的服务和中央处理器(CPU)的指令集.CPU操作指令的处理流程大概分为:取指.译码.执行.访存.写回等几步:每条指令需要1~6个字节不等,这取决 ...
- MIPS中的异常处理和系统调用【转】
转自:http://blog.csdn.net/jasonchen_gbd/article/details/44044091 权声明:本文为博主原创文章,转载请附上原博链接. 异常入口 系统调用是用户 ...
- ARM中LDR伪指令与LDR加载指令
ARM指令集中,LDR通常都是作加载指令的,但是它也可以作伪指令. LDR伪指令的形式是"LDR Rn,=expr".下面举一个例子来说明它的用法. COUNT EQU ...
最新文章
- u-boot中filesize环境变量【转载】
- Grafana常用的监控
- Web3.js 0.20.x API 中文版翻译 1
- 【Groovy】MOP 元对象协议与元编程 ( 通过 MetaMethod#invoke 执行 Groovy 方法 )
- woocommerce产品选项卡描述_适合WooCommerce卖家的7款Dropshipping插件+功能介绍
- 如何在Go中编写防弹代码:不会失败的服务器工作流程
- Cs代码写在html页面哪里,当用于在details.cshtml页面上查看时,我用什么代码来查看模型中的项目列表?...
- matlab实验函数编写与程序设计,matlab实验四函数编写与程序设计
- halcon 旋转_HALCON高级篇:3D相机标定
- SAP License:SAP的采购组
- Android* 4.1.1 (Jelly Bean) x86 模拟器系统映像
- mysql limti_MYSQL分页 limint
- 从delphi 10.3到delphi 10.4的改变实务
- WEBQQ登陆综合帖
- 微信短视频小程序——视频封面,视频缩略图
- 爱快路由器接水星交换机-划分vlan
- python中-是什么意思
- 首个Nginx windows Stable 版--轻量级Web服务器Nginx 0.7.59
- 相约2023 | 第 20 期高级转录组分析和R数据可视化火热报名中!!!
- 学英语看美剧学地道英文必看的10部美剧!