PC自增与转移地址计算问题总结
2016-12-05 16:55
232 查看
PC自增与转移地址计算问题总结
@(组成原理)在之前的文章中强调过PC的自增问题,以及提到了一点点PC转移时的计算问题。
但是没有对PC自增以后与偏移值相加时会碰到的补码运算问题。此处做一个补充。
http://blog.csdn.net/u011240016/article/details/52723779?locationNum=2&fps=1
http://blog.csdn.net/u011240016/article/details/52727962
值得强调的是,即使不明确指出PC自增,也需要明白,取指令时,每读取一个字节PC就要+1,然后再在此基础上与偏移值做运算。
假设PC当前值为240,指令长度为3个字节。当下一个指令地址是290时,偏移值为多少(偏移值占用一个字节)。
设偏移值为x,则240+3+x=290
这样可以直接计算得到x=47,如果要求化为补码,则直接化为补码即可。
如果用的是另外一种计算思路,即把各个元素均化为二进制考虑。
243=F3H,290=122H
x=122H−F3H
根据补码计算,减去一个数就将加上这个数连同符号位取反加1。注意上面列式中都是用无符号数表示的。F3H取反加1为:0DH
则:122H+0DH=122F,只取最低的一个字节,即为2F.
实际上122H大于F3H,直接减也可。
如果转移地址是200,则偏移值是多少?
240+3+x=200
可以直接计算出x = -43
这是最快的方式。也可以全部换成二进制或者16进制计算,按照补码方式加减。
即:200=C8H,243=F3H
x=C8H−F3H=D5
这是给定的十进制的较小的数,举个十六进制的地址偏移计算。
当前PC值是08048114H,指令长度是4B,求偏移量OFFSET = -6,推导PC转移公式。
分析:一般给定的指令结构中后面的字段是偏移值,一般情况下是直接加上偏移值。但是实际上PC的转移可以是偏移量的整数倍。这里就是一个例子。
指令长度是4B,一定要看到PC自增4后再加上偏移量的倍数。
因此公式是:PC=PC+4+x⋅OFFSET=PC+4−6x
现在看x是什么即可。
当前PC=08048114H,转移到08048100H
即:08048114H+4H−6x=08048100H
→08048118H−6x=08048100H
相差18H = 24
所以6x = 24,即x=4
因此转移方程是:
PC=PC+4+OFFSET⋅4
相关文章推荐
- 关于运行地址和加载地址的几个很多初学者模糊不清的问题我在这里总结一下
- 关于android2.2地图定位的问题,程序员取得了设备所在经纬度,得不到具体的地址。这里做一下总结。
- Java浮点数float和double精确计算的精度误差问题总结
- 一个风控计算负载过高到mysql主从拆分暴露的各种设计复杂性问题以及解决方法总结
- 前端 PC端兼容性问题总结
- 对深圳大学选课系统中的课程学时计算问题总结
- 三维数组的地址计算问题
- Java浮点数float和double精确计算的精度误差问题总结
- IP计算问题总结
- PC、Android、IOS将内容复制到剪切板问题总结
- STM32 DMA外设地址的计算问题
- QT_PC实战常见问题_控件传值问题总结
- STM32 DMA外设地址的计算问题
- 页式管理--物理地址计算问题小结
- Java浮点数float和double精确计算的精度误差问题总结
- 组合数计算问题的总结
- 关于用list_head 来计算结构体地址的问题
- Java浮点数float和double精确计算的精度误差问题总结
- Java浮点数float,bigdecimal和double精确计算的精度误差问题总结
- 浏览器地址框转移字符问题