具有可变宽度指令的数字信号处理器的制作方法

文档序号:6415899阅读:202来源:国知局
专利名称:具有可变宽度指令的数字信号处理器的制作方法
技术领域
本发明涉及数字信号处理,特别涉及处理数字信号的处理电路。
典型的通用数字信号处理器(DSP)包括一个通过控制高速数据通路、寄存器和存储器地址发生器的操作来译码指令的控制器。单个指令以通常每个时钟周期一条指令(或更慢)的速率被提取到控制器,控制器译码每个指令,并将控制信号发送给数据通路、寄存器和存储器地址发生器,以执行该指令所要求的操作。通过编程的指令组合,可以完成各种数据处理操作。
每个DSP(或其它微处理器)与一个有限的、严格定义的等长度指令的集合相关联,这些指令被安置在程序中去操作DSP。指令的数目和长度以及指令执行的操作,视所希望的功能因DSP而异。例如,有些DSP支持相对较长(例如32位)的指令,指令集合相对较大,便于选择许多不同的功能;其它DSP仅支持相对较短(例如16位)的指令,指令集合相对较小,提供较少的功能选择。指令大小与复杂度成正比例。与较小指令相比,较大的指令能标识更具专一性的功能,因而能在每个指令周期内完成更复杂的功能。不过较大的指令要求有更多的空间来存储。由于所有指令大小相同,如果增大一个指令,就要导致其它每个指令的相应增大,进而导致该DSP的所有程序的相应增大-即使给定程序中只有一小部分(或根本没有)指令利用这些需要增加指令大小的复杂功能,也是如此。
按照本发明的原理,DSP支持一个包括16位指令和32位指令两种指令的指令集,使得程序中只需要16位指令的特定部分可以按16位方式编码,由此减少储存这些部分所需的程序存储器。
在这方面的特定实施例中,DSP只根据诸如JUMP(跳转)、CALL(调用)或RETURN(返回)指令等流控制指令,在16位和32位方式之间切换。这些指令要求刷新DSP中的指令流水线,因而是切换指令方式的可用时间。将JUMP和CALL指令编码成指示对JUMP或CALL指令转移到的指令适用的处理器方式,这样,处理器就能在执行JUMP或CALL指令时按需改变方式。在执行CALL指令时,当前处理器方式被存储在处理器的堆栈上,这样,处理器字响应RETURN指令时,就能通过从堆栈检索所存储的方式而返回这个方式。
本发明的另外方面包括根据短指令和长指令控制DSP的操作的方法,以及一种将源代码行程序汇编成短指令和长指令模块并将各模块连接成目标程序的方法。
本发明的以上及其它目的和优点,显见于各附图及其说明。
本说明书所包含并构成说明书一部分的各附图,表示了本发明的实施例并与本发明的以上概述及以下对实施例的详细说明一起,旨在解释本发明的原理。


图1是按照本发明原理的DSP的示意框图;图2图1的DSP的程序存储器和程序控制单元的示意框图,表示了16或32位宽指令存储器的使用;图3A表示一个包括16和32位汇编语言指令的汇编代码程序,图3B表示通过汇编图3A中所示程序而生成的程序存储器的内容;图4A表示图3A的程序的第一段落,图4B表示图3A的程序的第二段落,图4C表示图3A的程序的第三段落;图5A表示一个在图3A的程序的汇编期间生成的表,标识了图4A-4C中所示段落的类型,图5B表示一个在图3A的程序的汇编期间生成的表,标识了图4A-4C中所示段落内部标号的位置;图6A、6B和6C表示汇编程序和连接程序为从图3A中所示的那种汇编代码生成具有图3B中所示的那种16位和32位指令的程序而执行扫描、汇编和连接操作的操作流程图。
参看图1,按照本发明原理的数字信号处理器10包括各种支持能被处理器执行的指令的功能单元。处理器10受程序存储器16中存储的指令程序的控制。
处理器10包括程序控制单元18,它通过总线19从程序存储器16提取指令,然后译码这些指令,让处理器10中的其它功能单元去执行指令的操作。程序控制单元18通过在总线20上向程序存储器16发送地址来从程序存储器16提取指令。程序控制单元18可以提取程序存储器16中的顺序指令,也可以译码和执行各种JUMP(跳转)或CALL(调用)命令,以便在程序存储器16中的指令的控制下,从程序存储器16的一个段落定序到另一个段落。
根据程序控制单元18所提取的各条指令,控制单元18产生控制信号,向处理器10的其它功能单元发送,使这些功能单元执行指令的操作。
处理器10中的功能单元包括地址发生单元30,用于响应来自X-数据总线37的控制信号和/或数据,在总线29和31上生成存储器地址。总线29和31上的存储器地址被发送到X和Y数据存储器33和35。X数据存储器33的输出被发送到总线37,Y数据存储器35的输出被发送到总线39。
处理器10包括一个桶形移位与逻辑单元32,它执行诸如AND、OR和异或(XOR)之类的逻辑操作,也执行对二进制数据的移位操作。除了桶形移位与逻辑单元32之外,处理器10还包括一个乘法/加法单元34,它对其接收的二进制值执行乘法或加法运算。
单元32和34受控于寄存器组36的寄存器中的数据。寄存器组36中的通用寄存器能被单元32和34访问,以按照在程序控制单元18接收的指令所指示的那样执行计算。寄存器组36中寄存器的内容可以由单元32和34通过总线40或41来检索。单元32和34的输出被发送到总线42,并且可以从总线42存储到寄存器组36的寄存器中。
来自寄存器组36的数据也能被发送到总线37或39,以便能在数据存储器33和35中存储数据或者经外围接口44向其它区域输出数据。
现在参看图2,就能推敲程序存储器16和程序控制单元18的交互作用的具体细节。如图2中所示,程序存储器16是个32位宽的存储器,它被划分为第一个16位宽的高段70和第二个16位宽的低段72。如下文中将要详细看到的那样,在程序存储器16中存储的指令可以是16位宽的,也可以是32位宽的。16位宽的指令存储在交错的段70和72中。32位宽的指令存储在成对的跨越段70和72的16位存储单元对中。
如图2中所见,程序控制单元18包括各种译码器73-77,它们将从程序存储器16提取的指令译码,以在控制线路22上生成控制信号并控制程序控制单元18的内部操作。具体来说,立即值寄存器73译码来自指令的立即值并将这些值发送到总线37供在寄存器组36的寄存器中存储。译码器74译码定向到地址发生器单元(AGU)30的指令并将对应的控制信号发送给AGU30。译码器75译码定向到桶形移位/逻辑单元(BLU)32的指令并将对应的控制信号发送给BLU32。译码器76译码定向到乘法/加法单元(MAU)34的指令并将对应的控制信号发送给MAU34。译码器77译码处理程序流的指令(JUMP、CALL等等)并将对应的控制信号发送给程序控制单元18的其它部件。
我们将会看到,译码任务在各种译码器73-77之间的划分,有助于修改任何一个译码器,以改变它根据个别指令执行的操作,同时却不改变由其它译码器根据其它指令所进行的操作。本发明的这个方面便于在果真需要时对处理器10的修改。此外,按照本发明的原理,译码器73-77确定是否要从指令操作码的最低位译码到特定指令。如果某指令的操作码的最低位与分配给特定译码器的不匹配,该译码器就忽略该指令。这不但让指令直接与它们启动的译码器关联,而且也通过将耗电的数字转接限制于那些要译码特定指令就必须处于活动状态的译码器而进一步节省了电力。
译码器73-77是流水线式的,就是说,输入到译码器的指令被存储在译码器中的指令流水线中,并在若干时钟周期以后在解码器输出端被发送。这个流水线方式便于更快速地译码和执行指令。
各译码器73-77均有一对输入端,第一个输入端与总线78相连,用于接收指令的低位(less significant bits),第二个输入端与总线80相连,用于接收指令的高位(more significant bits)。指令是由一个包含第一和第二多路转换器82和84的多路传输电路,经过总线78与80而发送到译码器73-77的。多路转换器82和84,根据正在读取的是来自程序存储器16的交错段70和72的16位指令,或者正在读取的是来自程序存储器16的段70和72中单元对的32位指令,有不同的操作方式。
多路转换器84是个16位的多路转换器,通过总线78,其输出端(经锁存器)与译码器73-77的低输入端相连。多路转换器84有一个与程序存储器16的低段72的输出相连的第一输入端。多路转换器84有一个与程序存储器16的高段70的输出相连的第二输入端。
多路转换器82是个16位的多路转换器,通过总线80,其输出端(经锁存器)与译码器73-77的高输入端相连。多路转换器82有一个与程序存储器16的高段70的输出相连的第一输入端,一个与程序存储器16的低段72的输出相连的第二输入端,以及一个硬连接(hard wired)到零值的第三输入端。
程序流译码器77提取指令,方法是指令程序计数器寄存器86在总线20上产生一个要向程序存储器16发送的适当地址。程序计数器寄存器86在总线20上产生一个地址,地址标识了要从中提取当前指令的在程序存储器16的高段和低段70和72中的两个对应单元。
程序计数器寄存器86产生的地址分成单一的最低位和其余的较高位。地址的较高位被发送到程序存储器16,以访问在程序存储器16的高低段70和72中的两个对应单元。最低位则在多路转换器82和84的内部控制中使用-正如下文所述。
程序流译码器77也连接到一个16/32位方式寄存器88,后者在线路90上产生一个1位的值,以表示程序控制单元18处于16位还是32位的操作方式。如果程序控制单元18处于16位的操作方式,它接收和译码16位或32位的指令;如果程序控制单元18处于32位的操作方式,它只接收和译码32位的指令。
程序控制单元18包括译码单元92,它负责通过在控制线路93a和93b上向多路转换器82和84发送控制信号,控制多路转换器82和84的操作来适当地译码当前指令,译码单元92根据程序计数器86的LSB(最低位)、16/32位方式寄存器88的输出和总线78的内容,适当地控制多路转换器82和84。
译码单元92中的逻辑电路与程序流译码器77交互作用,以下列方式有序通过存储的指令程序在16位方式中,从程序存储器16读出的指令可以是16或32位长的。此外,在程序存储器16的高段或低段72和70中都可能有16位指令。在程序存储器16的高段或低段中也可能有32位指令的高一半或低一半。相应地,如果程序控制单元处于16位方式,(如16/32位方式寄存器的内容所指示),译码单元92将在一开始使多路转换器84从程序存储器16的高段或低段72和70中选择一个16位字并输出到总线78上。如果总线20上当前程序存储器地址的最低位(LSB)的值为“0”,译码逻辑将导致从低段72读出一个16位字。如果总线20上当前程序存储器地址的最低位(LSB)的值为“1”,译码逻辑将导致从高段70读出一个16位字。与此同时,译码逻辑使多路转换器82向总线80上输出一个零值(全部16位都等于“0”)。
如果由多路转换器84在总线78上输出了一个16位字,译码器73-77和译码逻辑92要评估该16位字,以判定该16位字是个完整的16位指令,还是32位指令的低位的一半。如果该16位字是个完整的16位指令,该16位指令将被各译码器73-77译码,产生希望的操作。作为这种译码的一部分,程序流译码器77将导致程序计数器86把总线20上输出的程序存储器地址递增1,使得紧接着的下一条指令将被提取。这将导致总线20上的地址的LSB的转变-其它位也可能转变。这种转变,加上对总线78上的完整的16位指令的识别,就导致译码逻辑92按上述方式通过多路转换器84将一个新的16位字提取到总线78上。
另一方面,如果译码器73-77判定总线78上由多路转换器84所输出的该16位字是32位指令的低位的一半,译码器73-76将检测到结果条件-总线78上有某32位指令的低位的一半,总线80上是个零值,于是判定尚未完整地提取一个32位指令。相应地,译码器73-76将忽略此指令,与此同时,译码器77将使程序计数器寄存器86递增其输出地址。这将导致总线20上的地址的LSB的转变-其它位也可能转变。这种转变,加上对总线78上的不完整32位指令的识别,就导致译码逻辑92指示多路转换器82去提取和存储该32位指令的高位的一半。如果LSB转变成的值为“1”,该高位的一半就将被多路转换器82从程序存储器16的段72中提取出来。如果LSB转变成值“0”,则多路转换器82从程序存储器16的段72中提取高位的一半。
在上述两个地址周期之后,这些步骤的结果是,该完整的32位指令将被发送到各译码器73-77并由它们逐个译码,产生希望的操作。作为这种译码的一部分,程序流译码器导致程序计数器86把总线20上输出的程序存储器地址递增1,使得紧接着的下一条指令将被提取。
在32位方式中,所有从程序存储器16中读取的指令都是32位长的。此外,如下文说明的那样,所有指令都是对齐的,指令的高16位字在程序存储器16的高段70,指令的低16位字在程序存储器16的低段72。相应地,多路转换器82和84可以并行地从程序存储器16中提取32位指令的低位一半和高位一半。因此,多路转换器82和84的操作的复杂性较小。具体来说,当程序控制单元处于32位方式中时(由16/32位方式寄存器88的输出来指示),译码逻辑92总是指示多路转换器82输出从高段70获得的16位字,并总是指示多路转换器84输出从低段72获得的16位字。此外,在32位方式中,程序流译码器77总是使程序计数器86将在总线20上输出的程序存储器地址递增2,使得紧接着的下一条32位指令将被并行地提取。
这样,通过多路转换器82和84与线路90上方式信号以及地址总线20上信号的最低位的交互作用,当在16位方式下操作时,程序控制单元16将从程序存储器16的段70和72中交错的单元提取指令,但是当在32位方式下操作时,将从程序存储器16的段70和72中并行地提取两个16位的单元。
从以上叙述可知,程序存储器16是以32位宽的条目被寻址的,使用的是地址总线20上除最低位以外的所有位。相应地,程序流译码器77在16位方式下,相对于收到的每条指令(或半指令),要将程序计数器86递增一个二进制的值。然而,程序流译码器77在32位方式下,相对于收到的每条指令,要将程序计数器86递增两个二进制的值。
图2也说明了各种其它的寄存器94,它们可被程序控制单元18用来-作为对程序存储器16中的指令的响应的一部分-存储所需的临时信息。此外,图2说明了一个堆栈存储器96,它可被程序控制单元18用来存储并在以后检索寄存器94、程序计数器寄存器86和16/32位方式寄存器88的内容。堆栈96的加入,使得程序控制单元18能从程序存储器16中的程序内的一个单元转移到其它单元并在这种转移之后返回上一个执行点。
要说明程序控制单元18的功能,可以参考图3A中所示的示范程序。图3A中列举的程序,是伪汇编代码格式的程序,便于说明16和32位指令的使用,以及实现调用(CALL)和跳转(JUMP)指令的方式。
如图3A中所见,程序控制单元18的汇编语言包括使用16或32位指令的各段落。汇编语言程序的段落,与对这些段落将要在16位方式还是32位方式下执行的标志一起,被单独存储起来用于汇编。每个段落以PSECT16或PSECT32命令开始,以指示该段落将要在16位方式还是32位方式下执行。具体来说,要在16位方式下执行的汇编语言段落,是由诸如图4A中的100所示的PSECI16命令作为前导的。要在32位方式下执行的汇编语言段落,是由诸如图4C中的98所示的PSECT32命令作为前导的。在程序控制单元18的汇编语言中使用PSECT16和PSECT32命令,使汇编程序能适应程序的特定段落的需要,适当地将命令汇编成16位宽的指令或者是32位宽的指令。
编写程序控制单元18的汇编语言的程序员可以决定在程序的任何个别例程中使用16位方式还是32位方式。32位方式由于利用了高功能性32位指令而能获得更快的速度,但是要以增加对程序存储器的占用作为代价。程序员可以对任何给定程序决定如何在存储器占用与速度和功能之间进行平衡。在许多实例中,程序员会采用32位方式来编写程序中的少量时间性重要并且要被频繁地重复的例程,而用16位方式来编写程序的其余部分,以节省空间。图3A中所示的程序就是按照这些普遍准则编写的。
具体来说,图3A中所示的程序以16位的程序段落(在图4A中单独说明)作为开始。在该段落中,有一系列的16位指令,包括一条与汇编语言标号(具体来说是label 0)相关联的指令A。指令A的下一条是致使程序执行定序到1abel 1的CALL指令102。CALL指令之后是两个16位指令B和C,接着是致使程序执行跳转到label 0的JUMP指令104。
上述的1abel 1位于程序的第二个段落(在图4B中单独说明)中,它所关联的16位指令D,后面是16位的指令E和F,然后是32位的指令G。在此处,第二个CALL指令106使程序执行跳转到第二个汇编语言标号label 2。这个CALL之后还有16位指令H和16位指令I。返回指令108使程序执行返回到16位指令B,这是CALL指令102后的第一条指令。
图3A中所示的Label 2开始了以32位方式编码的第三段落(在图4C中单独说明)。这个32位指令的段落包括32位指令J、K、L、M和N。
应当明白,程序中包括的CALL命令102和106每个都使程序控制单元18将其当前地址单元、寄存器值和当前方式(16位还是32位)存储到堆栈96(图2)。此外,应当明白,程序中的返回命令诸如108和112使程序控制单元18从前一个调用返回,也使程序控制单元18从堆栈96弹出程序计数器寄存器86和方式选择寄存器88的值。这样,程序控制单元18就能在调用之后通过从堆栈检索所有与调用之前的处理器的状态相关联的值来恢复处理。此外,应当明白,每当有JUMP或CALL被程序控制单元18执行时,就必须将译码器73-77的指令流水线中的前一次提取的指令清除,以便让执行在程序控制单元18已经定序到的程序中的新单元继续。相应地,每个诸如102和106的CALL操作或每个诸如104的JUMP操作的结果,或者每个诸如108和112的返回操作的结果是,译码器73-77中的指令流水线在堆栈被下压或弹出以执行CALL、JUMP或RETURN的同时被清除。通过清除指令流水线,程序控制单元18就也能顺利地在程序的16位段落与程序的32位段落之间来回转换。
此外,当有诸如图3A中所示的汇编语言程序被汇编时,程序中的CALL和JUMP命令被编码成CALL16或CALL32指令和JUMP16或JUMP32指令,其中CALL16和JUMP16指令表示CALL或JUMP指令导向的单元是16位的程序段落,而CALL32和JUMP32指令则表示CALL或JUMP指令导向的程序段落是16位的程序段落。汇编诸如图3A中所示程序的汇编程序负责标识每个CALL导向的或每个JUMP导向的指令的方式,以便恰当地编码CALL32或CALL16、JUMP32或JUMP16指令。
现在参看图3B,就能知道汇编机器语言程序的细节。图3B中所示的汇编机器语言程序,是对图3A中所示汇编语言程序进行汇编和连接后的结果。假定与标号0对应的16位指令A存储在存储器地址00f2(H-十六进制),可以看出,CALL指令102、指令B、指令C和JUMP指令104被顺序地存储在程序存储器16的划分成存储器段70和72的16位段落中。CALL指令102和JUMP指令104是32位指令,都存储在段70和72中的两个顺序单元。指令B和C是16位指令,分别存储在段70和72中。于是在执行期间,通过多路转换器84,以交错的方式从段70和72一次16位地加载指令,正如前面结合图2所讨论的那样。
应当注意,汇编机器语言程序中的所有CALL和JUMP指令都是32位的。此外还要注意,CALL16/JUMP16或CALL32/JUMP32指令用于适当地标识CALL或JUMP指令导向的段落中指令的种类。具体来说,CALL指令102由于导向程序的16位段落,所以被编码成32位的CALL16指令,由于类似的道理,JUMP指令104被编码成32位的JUMP16指令。CALL和JUMP指令包括一个程序执行应当跳转到或去调用的存储器地址的标识,具体地址是由汇编器在汇编源程序时通过以下结合图4所讨论的过程来决定的。
图3A中在label 1处开始的代码段在图3B中的存储器地址00f9(H)处开始。可以看到,这个代码段包括指令D、E、F、和G、CALL指令106、指令H和I以及RETURN指令108。指令D、F、G、H和I(即除指令E和CALL及RERUTN指令以外的所有指令),每个都是16位宽,位于交错的存储器段70和72中,使得指令能如上文结合图2所讨论的那样能被多路转换器84从交错的存储器段中读出。指令E和CALL及RERUTN指令是32位的指令,被存储在跨段70和72的两个连续单元中。
在图3B中的120处可见,程序的第二个16位段落在奇数的指令单元(地址105)处结束。在程序的32位段落中,诸如指令J、K、L、M和N的32位指令必须从程序存储器16的段70和72的两个连续单元提取。于是在120(地址105)处插入一条空操作(NO OP)指令,这样,随后的32位段落的程序执行就能在偶数的存储器单元处开始。
图3A中所示的32位程序段落始于图3B中的存储器地址0106。由于这个程序段落是32位的段落,所有指令都占用32位,包括存储器低段72的16位和存储器低段70的16位。指令J、K、L、M和N及RETURN指令112都在这个段落中。注意指令M和N是16位的指令,要是在16位的程序段落中使用的话,仅要占用一个16位字。然而,在32位的程序段落中,这些指令都被汇编成占用32个位。
参看图4A-4C来讨论存储图3A的三个程序段落的文件的格式。汇编程序的语法要求,每个存储程序段落的文件都必须以PSECT16代码行100或者PSECT32代码行98开始,指示以下要汇编的程序段落是用于16位方式还是32位方式。PSECT代码行进一步包括一个段落标识符,用于以后对该段落的引用。在所示例子中,这些段落标识符是“section 1”、“section 2”和“section 3”,但是可以是任何其它标识符,例如标识符可以与代码段落所执行的功能相关。
汇编程序和连接程序(下文作说明)的一个重要功能是确定每个程序段落的类型,以便将16位的段落按16位方式的检索要求来编译,将32位的段落按32位方式的检索要求来编译,并使得CALL和JUMP指令作为CALL或JUMP的一部分来适当设置处理器的方式。为此,在汇编程序操作之前对程序各段落的初始扫描期间,要构建一个诸如图5A中所示的表。这个表有一个放置各段落的段落标识符的列130,一个放置段落类型(16还是32位的)的列132。如下文所述,汇编和连接段落时要引用这个表,以保证各段落被适当地汇编成可执行程序。
注意,段落中的CALL和JUMP代码行可以引用该段落内部定义的标号,例如,图4A的段落1(section 1)中的JUMP代码行引用label0,后者是在图4A的段落1中定义的。或者,段落中的CALL或JUMP代码行也可以引用在另一个段落中定义的标号,例如,图4A的段落1中的CALL代码行引用label 1,后者是在图4B的段落2中定义的。
汇编程序和连接程序的另一个重要功能是标识段落中标号的单元,使得当可执行程序被连接时能置换标号的适当地址。作为这个操作的一部分,要生成一个诸如图5B中所示的表。这个表的第一列134中放置标号标识符。第二列136存储包含该标号的段落的段落标识符。第三列138存储段落的类型,即16位或32位。第四列140存储该标号的单元的相对地址。下面接着就讨论这个数据的收集和使用。
现在参看图6A-6C,就能了解用于汇编和连接诸如图3A所示的汇编语言程序的汇编程序和连接程序的详细操作。
汇编之前,先在图6A中所示的扫描过程150中扫描汇编语言程序,以生成诸如以上结合图5A和5B所讨论的诸表。扫描过程150始于步骤152,将段落号初始化到要扫描的第一个段落。在步骤154中检索当前段落的代码行,在步骤156评估段落的第一行,判定是否有PSECT代码行。如上所述,汇编程序的语法要求,每个存储程序段落都必须以PSECT代码行开始。所以,如果步骤156中没有PSECT行,就在步骤158中生成出错消息,然后扫描过程(以及汇编和连接过程)结束。
如果有PSECT行,则在步骤160中向图6A所示的表中增加一行,以存储PSECT行所标识的当前段落标识符和段落类型(16或32位)。然后在步骤162,将当前代码行初始化到程序中PSECT行之后的第一行,为扫描段落中各行的步骤的循环作准备。
在步骤164,扫描代码行。在步骤166,检查该行的语法,判断该行是否是按照汇编语言正确编码的。如果不是,就在步骤158中生成出错消息,然后,扫描、汇编和连接过程就结束。
如果该行语法正确,就在步骤168中评估该行,判断该行是否有与之关联的标号。如果是,就在步骤170中向图5B的表中增加一个项目,以存储有关标号的信息。具体来说,将标号名、当前段落标识符、段落类型(16或32位)存储在图5B的表中的新项目中。
步骤170后,或者如果当前代码行没有标号时紧接步骤168后,在步骤172中判定当前代码行是否是当前段落的最后代码行。如果不是,就在步骤174中递增当前代码行号,处理返回到步骤164。如果当前代码行是当前段落的最后代码行,就在步骤176中判定是否还有段落。如果是,就在步骤178中递增当前段落号,处理返回到步骤154。如果所有段落都已经被处理,执行就前进到图6B中所示的汇编过程180。
在汇编过程180中,各段代码行都被转换成一个可执行指令模块,它随后要被与其它模块连接,形成一个诸如图3B中所示的完整的程序。汇编过程通过扫描每个段落中每个代码行并将代码行转换成可执行指令而进行。
作为汇编过程的开始,在步骤182中初始化当前段落号。进一步,在步骤184中将从当前段落号产生的当前相对地址初始化。这个相对地址反映相对于与正被输出到该模块中的指令的当前模块的起点的单元。
在这个初始化后,在步骤186,检索当前这段代码行供汇编。在步骤187,判定当前段落是否是32位的段落,当前的相对地址是否是奇数值。如果两个条件都为真,则在模块的开始输出一个16位的NO-OP指令,以便将随后的32位指令在程序存储器16的低段72和高段70中对齐。然后在步骤188中,将当前段落中的行号初始化到PSECT代码行后的第一个代码行。然后在步骤190中,扫描当前代码行中的程序代码。在步骤192,判定代码行是否有与之关联的标号。
如果当前代码行有与之关联的标号,则将当前相对地址-它将是当前代码行将产生的指令的相对地址-存储在图5B的表中,供以后定位该当前代码行中使用。具体来说,在步骤194中,定位图5B的表中与所定义标号对应的条目。然后,将当前代码行的当前相对地址存储到该条目中。(随后,在图5C的连接过程中,这个相对地址被用于生成引用当前行中标号的CALL或JUMP指令。)步骤194之后,或者如果当前代码行没有标号时紧接着步骤192之后,在步骤196中评估当前代码行,判断它是否是一个诸如CALL或JUMP的流控制代码行。如果是,该代码行将包括一个对标号的引用。在这种情况下,就在步骤198中从CALL或JUMP指令中将所引用的标号抽取出来。然后在步骤200中,在图5B中定位与所引用的标号对应的条目,从这个条目的列138将定义该标号所在段落的段落类型(16或32位)检索出来。然后在步骤202,生成一个32位的JUMP或CALL指令并存储到当前段落的输出模块。如果定义该标号所在段落的段落类型是16位的,就生成JUMP16或CALL16指令。如果定义该标号所在段落的段落类型是32位的,就生成JUMP32或CALL32指令。最后,在步骤204中,将相对地址递增2,以反映出已经有代表JUMP或CALL指令的两个16位字被添加到输出模块。
返回到步骤196,如果当前代码行不包括CALL或JUMP指令,则汇编过程前进到步骤206,判定当前代码行是否就是一个32位指令。有些指令,例如那些涉及到相对复杂的操作的指令,必须编码成32位的指令-即使在16位的代码段落中也这样。图3A中的例子包括指令E和G。如果代码行中出现这种32位指令,汇编过程就从步骤206前进到步骤208,在该步骤中生成包含该32位指令的两个16位字并存储到输出模块。然后在步骤210中,将相对地址递增2,以反映出已经有代表该32位指令的两个16位字被添加到输出模块。
回到步骤206,如果当前指令不是32位的指令,则在步骤212中,汇编过程参考图5A的表,定位与当前段落相对应的条目。在步骤214,评估在这个条目的栏132中标识的段落类型,确定当前段落是否是32位的段落。如果是,则为当前段落的输出模块生成的所有指令都应当生成为32位的指令。在这种情况下,处理从步骤214前进到步骤208,去生成该32位指令。另一方面,如果在步骤214中确定当前段落不是32位的段落,则汇编过程前进到步骤216,为当前代码行生成16位的指令,并将该指令的单一16位字存储到当前段落的输出模块中。然后,在步骤218将相对地址递增1,以反映出在输出模块中插入了另一个16位字。
步骤204、210或218之后,如果当前代码行的16或32位的指令已经被添加到输出模块,汇编过程就在步骤220中判定当前段落的最后代码行是否已经被处理。如果不是,就在步骤222递增代码行号,处理然后返回到步骤190去分析下一个代码行。如果已经到达过最后的代码行,汇编过程就在步骤224判定是否还有要汇编的段落。如果是,则在步骤226中递增当前段落号,处理然后返回到步骤186去处理下一个段落。如果所有段落都已经被分析过,则处理就前进到图6C所示的连接过程230。
在连接过程230中,在汇编过程中生成的各模块被扫描和赋予最终形式,然后连接到一起,形成单一的可执行程序。所以,连接过程要对汇编过程所产生的各模块从头至尾地第三次扫描,确定每个在扫描和汇编期间所标识的标号的绝对地址。在步骤232,检索图5B中所示的模块地址表供连接模块时使用。在步骤234,检索一个模块输出文件。
分析模块输出文件中的每个16位字,以判定是否需要一个连接地址。所以,在步骤236中从当前模块输出文件中检索一个16位字,在步骤238中分析该16位字,以判定该16位字是否是部分CALL或JUMP指令。如上所述,在CALL或JUMP指令被汇编时,指令是以部分形式被汇编的,带有一个指向图5B的表中对应所引用标号的条目的指针。也应当注意到,CALL或JUMP指令是32位的指令,在模块输出文件中跨两个16位字。所以,如果从模块输出文件检索的16位字是部分CALL或JUMP指令的一半,则在步骤240中从模块输出文件检索后继的16位字。然后在步骤242中,检索该部分CALL或JUMP指令中的指针,然后在步骤244中,用该指针来检索图5B的表中的一个条目,从该条目中取出相对地址。然后在步骤246中,用这个相对地址,生成32位的完整JUMP或CALL指令并将其输出到最后的可执行文件中。如果在步骤238中所分析的16位字不是一个部分JUMP或CALL指令,则在步骤248中将该16位字直接输出到最后的可执行文件中。
在步骤246或248之后,连接过程在步骤250中判定是否已经到达模块输出文件的结尾。如果不是,连接过程就返回步骤236去分析模块输出文件中的下一个16位字。但是如果已经到达模块输出文件的结尾,连接过程就在步骤252判定是否还有其它要连接的模块输出文件。如果是,处理就返回步骤234去检索另外的模块输出文件。但是如果所有模块输出文件都已经被连接,则连接过程结束,生成了完整的可执行文件。
尽管本发明是通过描述各种实施例加以说明的,尽管对这些实施例的说明相当详细,申请人并不是要把后附的权利要求的范围限制在这种细节中。对于本领域的熟练人员来说,其它优点和改进方法都是显而易见的。因此更全面来说,本发明并不限于所示或文字说明的具体细节、代表性装置及方法和解释性的例子。因此,可以在不脱离申请人的总体发明思想的情况下脱离这类细节。
权利要求
1.一种数字信号处理器,包含一个存储构成所述数字信号处理器的程序的多个指令的行的程序存储器,所述指令包括具有第一数目的数字信号的短指令和具有大于所述第一数目的第二数目的数字信号的长指令;一个从所述程序存储器检索指令并通过生成控制所述数字信号处理器的其它单元的操作的命令信号来响应所述指令的程序控制单元,所述程序控制单元有所述程序控制单元检索和响应短指令的第一方式,以及所述程序控制单元仅仅检索和响应长指令的第二方式;一个存储数字数据的寄存器组;一个地址发生器单元,它与所述数字数据总线、所述寄存器组和所述程序控制单元相连,并响应命令信号,经所述数字数据总线,从所述数字数据存储器检索数据并存储到所述寄存器组,及从所述寄存器组提取数据并存储到所述数字数据存储器;至少一个与所述程序控制单元和所述寄存器组相连并根据命令信号对所述寄存器组中的数据进行数字数据处理的逻辑单元。
2.权利要求1的数字信号处理器,其中,所述程序存储器包含第一段和第二段,所述长指令在所述第一段和第二段的两项中存储,每个短指令在所述第一段或所述第二段的单一项中存储。
3.权利要求2的数字信号处理器,其中,所述程序控制单元还包含一个有与所述程序存储器的所述第一段相连的第一输入端、与所述程序存储器的所述第二段相连的第二输入端和一个输出端的多路转换器,所述多路转换器在所述程序控制单元处于所述第一方式时发送来自所述存储器的所述第一或所述第二段的短指令。
4.权利要求1的数字信号处理器,其中,所述程序控制单元从所述程序存储器检索顺序指令,直到遇到流控制指令,所述程序控制单元对流控制指令的响应是访问所述程序存储器中由所述流控制指令标识的单元处的一个后继指令;所述程序控制单元根据流控制指令中对访问所述后继指令时所采用的处理器方式的指示,将所述程序控制单元置于与所述流控制指令所标识的方式一致的所述第一或所述第二方式。
5.权利要求4的数字信号处理器,其中,所述程序控制单元包含要被响应的指令的流水线,所述程序控制单元清空所述指令流水线来响应流控制指令。
6.权利要求4的数字信号处理器,其中,所述程序控制单元还包含一个堆栈存储器,所述程序控制单元还响应CALL流控制指令,将所述CALL流控制指令之后的所述程序存储器单元存储在所述堆栈存储器中,并将表示所述程序控制单元在执行所述CALL流控制指令之前是处于所述第一还是第二方式的标志存储在所述堆栈存储器中;所述程序控制单元还响应RETURN流控制指令,从所述堆栈存储器检索上次存储的程序存储器单元和处理器方式,将所述程序控制单元置于与所述存储的处理器方式一致的所述第一或所述第二方式,然后访问位于所述上次存储的单元的指令。
7.一种操作数字信号处理器的方法,其中所述数字信号处理器有一个数字数据总线,一个与所述数字数据总线相连的、存储数字数据的寄存器组,一个与所述寄存器组相连的、响应命令信号寻址所述寄存器组中数字数据的地址生成器,一个与所述寄存器组相连的、响应命令信号对所述寄存器组中数据进行数字数据处理的逻辑单元,该方法包含存储构成所述数字数据处理器的程序的指令,所述指令包括具有第一数目的数字信号的短指令和具有大于所述第一数目的第二数目的数字信号的长指令;检索所述指令;响应所述指令,向所述地址生成器生成命令信号来经所述数字数据总线从所述寄存器组检索数据或向所述寄存器组存储数据,或者向所述逻辑单元生成命令信号来对所述寄存器组中的数据进行数字数据处理。
8.权利要求7的方法,其中,所述指令在包含第一段和第二段的程序存储器中存储,所述长指令在所述第一段和第二段的两项中存储,每个所述短指令在所述第一段或第二段的单一项中存储。
9.权利要求8的方法,其中,所述数字信号处理器还包含一个对控制信号起反应的,具有一个与所述程序存储器的所述第一段相连的第一输入端、一个与所述程序存储器的所述第二段相连的第二输入端和一个输出端的多路转换器;检索短指令包含通过所述多路转换器从所述存储器的所述第一或第二段之一中发送短指令;以及检索长指令包含通过所述多路转换器从所述第一和第二段中发送短指令。
10.权利要求7的方法,其中,检索指令包含检索顺序存储的指令,直到遇到流控制指令,然后响应流控制指令,从流控制指令所标识的单元检索后继指令;
11.权利要求10的方法,其中,响应流控制指令还包含响应流控制指令中对访问所述后继指令时要采用的方式的指示,以及在第一种方式中,检索后继指令包含通过所述多路转换器从所述第一或第二段之一中检索短指令,或者在第二种方式中,检索后继指令包含通过所述多路转换器从所述第一和第二段中检索长指令。
12.权利要求10的方法,其中,所述数字信号处理器包含已经检索的、要被响应的指令的流水线,以及对流控制指令的响应还包含清空所述指令的流水线。
13.权利要求11的方法,其中,所述数字信号处理器还包含一个堆栈存储器,对CALL流控制指令的响应还包含,将所述CALL流控制指令的后继指令的单元存储在所述堆栈存储器中,并将表示在响应所述CALL流控制指令之前是以所述第一还是第二方式检索指令的标志存储在所述堆栈存储器中;以及对RETURN流控制指令的响应还包含,从所述堆栈存储器检索上次存储的指令单元和方式,并按照上次存储的方式检索位于上次所标识的单元的后继指令。
14.一种将源代码行程序汇编成用于操作数字信号处理器的目标指令程序的方法,该方法包含将所述源程序的所述代码行分组成至少第一组和第二组;通过扫描所述第一组中的每个代码行并从中生成具有第一数目的数字信号的所述第一种模块的短指令,汇编所述程序的第一种短指令模块;通过扫描所述第二组中的每个代码行并从中生成具有大于所述第一数目的第二数目的数字信号的所述第二种模块的长指令,汇编所述程序的第二种长指令模块;将所述第一种和第二种指令模块连接在一起形成所述目标程序。
15.权利要求14的方法,其中所述第二数字信号的数目是所述第一数字信号数目的两倍。
16.权利要求14的方法,其中,汇编所述第一种短指令模块包含扫描所述第一组代码行,以定位一个表示所述第一组要被汇编成短指令的代码行。
17.权利要求14的方法,其中,汇编所述第二种长指令模块包含扫描所述第二组代码行,以定位一个表示所述第二组要被汇编成长指令的代码行。
18.权利要求14的方法,其中所述代码行包括流控制代码行。
19.权利要求18的方法,其中,所述流控制代码行包括CALL、JUMP和RETURN流控制代码行。
20.权利要求14的方法,其中的将一组代码行汇编成一个指令模块,包含标识所述组中定义代码行标号的代码行,及对于每个这种代码行,在存储器的一个条目中至少存储标号和由定义该标号的代码行导出的在指令模块内的相对位置。
21.权利要求20的方法,其中的将一组代码行汇编成一个指令模块,包含标识所述组中将程序流转向某个被引用标号的流控制代码行,及对于每个这种流控制代码行,生成一条具有包括一个指向该流控制代码行所引用标号在存储器中的相应条目的指针的数字信号的部分流控制指令。
22.权利要求21的方法,其中,汇编一个流控制代码行还包含,判定被引用标号是在生成短指令的所述第一组代码行还是在生成长指令的所述第二组代码行中定义的,及生成标识所引用标号是在生成长指令还是短指令的代码行中的部分流控制指令。
23.权利要求21的方法,其中的将指令模块连接在一起,包含扫描所述模块中的每条指令,来定位部分流控制指令,及对于每条这种部分流控制指令,根据所述部分流控制指令中的指针找到存储器中指示该部分流控制指令的目标地址的条目,及将所述目标地址存储在所述目标程序中的完整流控制指令中。
全文摘要
本发明的数字数据处理器(10)支持包括16位指令和32位指令的指令集,使得可以将只要求16位指令的部分程序以16位的方式编码,由此减少了存储这些部分所需的程序存储器空间。数字数据处理器仅根据诸如JUMP、CALL或RETURN指令的流控制指令在16位或32位方式之间切换。对JUMP和CALL指令的编码,指出JUMP或CALL指令去往的指令所适用的处理器方式,使得处理器在执行JUMP或CALL指令时可以按需改变方式。执行CALL时,要将当前处理器方式存储到处理器的堆栈上,这样,处理器在响应RETURN指令时通过从堆栈检索所存储的方式就能返回到这个方式。
文档编号G06F9/30GK1278932SQ9881121
公开日2001年1月3日 申请日期1998年9月14日 优先权日1997年9月17日
发明者Y·K·谭, S·梅达 申请人:索尼电子有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1