汉语编程编译词讲解.docx
《汉语编程编译词讲解.docx》由会员分享,可在线阅读,更多相关《汉语编程编译词讲解.docx(11页珍藏版)》请在冰豆网上搜索。
![汉语编程编译词讲解.docx](https://file1.bdocx.com/fileroot1/2023-1/2/fccdc8fc-1b80-41f8-86d4-91f7a22eaaa7/fccdc8fc-1b80-41f8-86d4-91f7a22eaaa71.gif)
汉语编程编译词讲解
编译词
一、编译和解释
编译词是立即词,这意味着如果在一个编句定义中遇到它们时,将被立即执行而不是编译到列表段。
立即词在名词词段中有一个优先位。
汉编系统处于两个可能的状态之一:
编译或者解释。
在一个编句定义的编译期间它处于编译状态,就是说在词“编””执行之后和“。
”执行之前。
系统变量“编解态”有下列两个可能的值:
真--如果编译
假--如果解释
为了测试当前在什么状态,我们考虑下面两个定义:
编编解态测试一(--)
编解态读
就
显"编译"
否则
显"解释"
然后
回车
。
编编解态测试二(--)
编解态测试一
。
你把这个程序装入然后输入
编解态测试一
和
编解态测试二
执行结果如下:
编编解态测试一(--)
编解态读
就
显"编译"
否则
显"解释"
然后
回车
。
★
编编解态测试二(--)
编解态测试一
。
★
编解态测试二解释
★
编解态测试一解释
★
在每种情况下都是打印出"解释",为什么?
因为,当你打印编解态测试一和编解态测试二时你都是处于解释状态。
你怎么才能够打印出"编译"呢?
这就需要编解态测试一在编解态测试二编译时执行,也就是说我们必须把编解态测试一设计成一个立即词。
我们可以通过在。
句号之后加一个词立即词来实现这个目的。
让我们定义
编编解态测试三(--)
编解态读
就
显"编译"
否则
显"解释"
然后
回车。
立即词
\现在打入下面的定义
编编解态测试四
编解态测试三
。
执行结果如下:
注意当你打入这个定义的时候,只要你一按下<回车>,编译就会打印出来。
也就是说,编解态测试三被立即执行,并不等待你后面打入编解态测试四,现在打印
编解态测试四
执行结果如下图所示:
注意没有任何东西打印在屏幕上,这是因为编解态测试三没有被编译进词典,它只是立即执行。
立即词并不被编译进词典,除非你强制这样做。
你可以强制一个立即词被编译进词典而不再立即执行,这是通过词强编译实现的。
下面的词定义编解态测试五使词编解态测试三被编译而不是被执行:
强编译
编编解态测试五(--)
强编译编解态测试三
。
你觉得编解态测试五会打印什么?
试一试。
也可以在编句定义中使用词进解释[和]进编译来打开或者关闭编译。
进解释[的定义是:
编进解释[(--)
0编解态写。
立即词
词]进编译打开编译模式并进入编译循环,编译循环包括:
循环
从输入流中得到下一个词,如果这是一个立即词,执行这个词;否则编译它;如果这个词不在词典中,把它转为一个数字并编译它。
作为最后一个例子,输入
编编解态测试六进解释[编解态测试一]进编译。
注意当你按下<回车>后,"解释"被打印出来,为什么?
二、系统词编译和强编译
我们已经看到:
强编译将把后面的立即词编译到列表段中。
它的定义是:
编强编译(--)
找编译填数。
立即词
词"找"把下一个(立即)词的属性域放到数摞上,词编译填数编译数摞上的整数到列表词典的下一个可用地址。
注意强编译本身是一个立即词,在包含它的词编译期间可以被执行。
有时你希望在运行时编译一个词,汉编词“编译”将实现这个功能。
例如,句号“。
”的定义基本上是这样的:
CODEUNNEST(---)
movesi,0[ebp]
addebp,#4
NEXT,
END-CODE
编。
(--)\未测试通过
编译UNNEST
加入搜索词汇枝\使得这个编句定义词在词典中可以搜索到REVEAL
强编译进解释[\进入解释模式
。
立即词\立即执行
注意。
是一个立即词,在一个编句定义中遇到它时被执行。
它编译(编译)词UNNEST子程序的属性域到编句定义词的列表词典,并通过词REVEAL使得这个编句定义词在词典中可以搜索到,之后通过执行进解释[来切换在解释模式。
尽管进解释[是一个立即词,但它在句号。
定义中被强编译编译。
编译的定义如下,当包含编译的词执行时,它编译非立即词的属性域。
编编译(--)
暗摞双读
暗摞>单元+>暗摞
读
编译填数
。
三、常数
词(立即数)是一个CODE词,它的定义如下:
CODE(立即数)(--n)
moveax,12[esi]
push8[esi]
push4[esi]
push0[esi]
addesi,#16
movecx,0[eax][edi]
addecx,edi
jmpecx
next,
END-CODE
如果你在数摞上有一个数并希望把它作为一个常数编译到列表词典中,你可以使用立即数,定义如下:
编立即数(n--)
编译(立即数)
填值
。
立即词
汉编词“立即数”一个很有用的功能是你可以在定义中计算常数。
例如,有时我们写2+3比写5更直观,你可以这样定义5+:
编5+(n--n+5)
[32+]立即数+。
当然你要是这样写,最后的结果与一样:
编5+32++。
不过,[32+]立即数+有一个优点就是常数5是在编译期间计算出来的,运行的时候只是执行5+。
而32++却需要编译一个常数3和一个常数2到词典中,而在运行时也需要执行两个加法操作。
所以,使用[32+]立即数+产生的代码执行得更快、更有效。
四、条件编译词
跳转
0跳转
有两个条件编译词跳转和0跳转被用于定义汉编系统中各种条件分支指令。
词跳转是一个汇编词,它的定义如下:
CODE跳转(---)
ADDESI,[ESI]
NEXT,
END-CODE
词跳转被编译到列表段,它的后面是无条件分支目的地址的偏移量。
词0跳转在摞顶标志为假时分支到它后面的目的地址。
CODE0跳转
testebx,ebx
popebx
je?
BRANCH
addesi,#4
jmp694
addesi,[esi]
NEXT
END-CODE
环首...就继续...重复
作为一个环首...就继续...重复循环的例子,我们回忆一下词第4课中"求阶乘"的定义:
编求阶乘(n--n!
)
12∴(xin)
环首(xin)
双♂<=(xInf)
就继续(xIn)
∵↑↓∽(nixi)
*↑↓(nxi)
1+∴(xin)
重复(xIn)
双♀。
(x)
这个定义将以下列方式存于列表词典中:
变量:
循环层数\编译循环结构时,指明当前编译嵌套层数
编执行否?
编解态读就全复位"只能在解释中使用!
"。
编编译否?
编解态读0=就全复位"只能在编译中使用!
"。
编匹配否?
(n1n2--)异或就全复位"条件不匹配!
"。
编标记后转(--地址)可用地址0填数。
编填后转偏移量(地址--)可用地址∽-↑↓写。
编标记前转(--地址)可用地址。
编填前转偏移量(地址--)可用地址-填数。
编就编译否?
编译0跳转标记后转2。
立即词
编然后编译否?
2匹配否?
编译(然后)填后转偏移量。
立即词
编否则编译否?
2匹配否?
编译跳转标记后转↑↓填后转偏移量2。
立即词
编环首编译否?
编译(环首)标记前转1。
立即词
编就出来编译否?
1匹配否?
编译(就出来)填前转偏移量。
立即词
编回首编译否?
1匹配否?
编译(回首)填前转偏移量。
立即词
编就继续编译否?
编译(就继续)标记后转2双↑↓。
立即词
编重复编译否?
1匹配否?
编译(重复)填前转偏移量2匹配否?
填后转偏移量。
立即词
编循环编译否?
编译(循环)标记后转3循环层数增1。
立即词
编?
循环编译否?
编译(?
循环)标记后转3循环层数增1。
立即词
编回环编译否?
3匹配否?
编译(回环)♂单元+填前转偏移量填后转偏移量
循环层数减1。
立即词
编+回环编译否?
3匹配否?
编译(+回环)♂单元+填前转偏移量填后转偏移量
循环层数减1。
立即词
编如和编译否?
编译(如和)0。
立即词
编对应就编译否?
编译(对应就)标记后转4。
立即词
编而和编译否?
4匹配否?
编译(而和)标记后转↑↓填后转偏移量5。
立即词
编其余则编译否?
4匹配否?
编译(而和)标记后转↑↓填后转偏移量5。
立即词
编而后编译否?
♂4=就♀编译(而和)标记后转↑↓填后转偏移量5然后
编译(而后)
环首非0♂就继续5匹配否?
填后转偏移量重复。
立即词