首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

【汇编器设计】怎么设计一个间接跳转指令

2013-11-21 
【汇编器设计】如何设计一个间接跳转指令。说实话,这个东西在我心里纠缠好多天了,我都没有解决,所以发帖让大

【汇编器设计】如何设计一个间接跳转指令。
说实话,这个东西在我心里纠缠好多天了,我都没有解决,所以发帖让大家讨论一下。

首先,看过《计算机组成-结构化方法》,《计算机组成-软硬件接口》之后,肯定会有很多人想设计一个cpu模拟器,是的,我也是在做这个。
首先是设计一套指令集,模仿mips,它看起来是容易的,算术运算指令,逻辑运算指令,分支指令,传输指令,系统指令等等。
我设计分支指令的时候条件分支使用了,==,!=,<,>,<=,>=当然,
下面说到了重点
这些指令的形式jne $r1,$r2,label的指令,尚能解决。

ok,重点,在设计汇编器的时候阅读了《Assembler and loader》和《linker and loader》当我们会遇到一个重载问题。
        jne $r1,$r2,lable
         ...
label1: dosomething
我们用符号表尚能解决,ok,over。
问题是那条间接跳转指令,我们称之为jmp $r1吧。
我是这样想的,$r1里面存放的肯定是某个地址,但是这个地址是什么时候存放到$r1里面的呢?
我们想象一个这样的流程,
mov $r1,label
jmp $r1
我们这里仍然可以对mov指令重载,但是马上问题来了。
mov $r1,0x20 //数字
mov $r2,0x40
add $r1,$r1,$r2
mov $r1,0x30 //某个地址
jmp $r1
某个汇编语言开发者,十分自信,自己就是要跳转到地址0x30处,他没有使用标号。
这下子麻烦大了,当生成目标文件的时候,这个地址0x30确实变了,很明显我们需要重载信息。
第一:我们可以对所有mov指令重载:
假如我们认为0x30代表着地址,又怎么确定0x20不代表地址呢?假如mov $r1,0x30需要重载,那么mov $r1,0x20要不要重载呢?
第二:只对部分设计到的mov指令重载,但是编程复杂度又提升了。

------------------
然后我意识到我设计指令的时候犯了一个大错。
我应该设计一条jmp label的指令或者伪指令?
而不应该希望通过两步,
mov $r1,0x30
jmp $r1
来实现这个功能。
------------------
我现在想说,求点醒,让我确实我这样确实是设计错误,我好改。
[解决办法]
当然是可以的,不过你这样设计会产生混淆的,如果mov ax,labela代表把labela的地址装入ax,那么把labela的内容装入ax怎么表示呢?如果是在x86中,mov ax,labela和mov ax,[labela]是一样的,代表取值,取地址要用lea ax,labela。

热点排行