欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

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

更新时间: 2014-01-05 03:16:12 责任编辑: Author_N1

 

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

首先,看过《计算机组成-结构化方法》,《计算机组成-软硬件接口》之后,肯定会有很多人想设计一个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。

上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-01-05 03:16:12
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/20270/
本文WWW.DOC100.NET DOC100.NET版权所有。