3 <title>アセンブラ言語の仕様</title>
4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5 <meta name="description" content="アセンブラ言語の仕様">
6 <meta name="generator" content="makeinfo 4.13">
7 <link title="Top" rel="top" href="#Top">
8 <link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
10 Copyright (C) Information-technology Promotion Agency, Japan. All rights reserved 2012-->
11 <meta http-equiv="Content-Style-Type" content="text/css">
12 <style type="text/css"><!--
13 pre.display { font-family:inherit }
14 pre.format { font-family:inherit }
15 pre.smalldisplay { font-family:inherit; font-size:smaller }
16 pre.smallformat { font-family:inherit; font-size:smaller }
17 pre.smallexample { font-size:smaller }
18 pre.smalllisp { font-size:smaller }
19 span.sc { font-variant:small-caps }
20 span.roman { font-family:serif; font-weight:normal; }
21 span.sansserif { font-family:sans-serif; font-weight:normal; }
26 background-color: #EEE;
36 background-color: #DDF;
41 background-color: #DDF;
47 background-color: navy;
51 background-color: #DDF;
52 border: 4px double #000;
58 background-color: #DDF;
62 background-color: #DDF;
63 border: 4px double #000;
91 text-decoration: underline;
95 padding: 0.5em 1em 0.5em 1em;
102 text-decoration: none;
107 border: 1px solid #00F;
111 font-family: monospace;
120 border: 1px solid #CCC;
121 border-collapse: collapse; /* 枠線の表示方法 */
124 table.cartouche, table.cartouche th, table.cartouche td {
128 pre.example .command, pre.example .option, pre.example kbd {
130 font-family: monospace;
131 background-color: inherit;
139 border: 2px solid green;
151 <h1 class="settitle">アセンブラ言語の仕様</h1>
152 <h2 class="chapter"><a name="TOC0"></a>1 システム COMETIIの仕様</h2>
154 <h3 class="section"><a name="TOC1"></a>1.1 ハードウェアの仕様</h3>
157 <li>1語は16ビットで、そのビット構成は、次のとおりである。
159 <pre class="verbatim"> 上位8ビット 下位8ビット
160 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |(ビット番号)
165 <li>主記憶の容量は65536語で、そのアドレスは0~65535番地である。
167 <li>数値は、16ビットの2進数で表現する。負数は、2の補数で表現する。
169 <li>制御方式は逐次制御で、命令語は1語長又は2語長である。
171 <li>レジスタとして、<code>GR</code>(16ビット)、<code>SP</code>(16ビット)、<code>PR</code>(16ビット)、<code>FR</code>(3ビット)の 4 種類がある。
173 <p><code>GR</code>(汎用レジスタ、General Register)は、<code>GR0</code>~<code>GR7</code>の8個があり、
174 算術、論理、比較、シフトなどの演算に用いる。
175 このうち、<code>GR1</code>~<code>GR7</code>のレジスタは、指標レジスタ(index register)
178 <p><code>SP</code>(スタックポインタ、Stack Pointer)は、
179 スタックの最上段のアドレスを保持している。
181 <p><code>PR</code>(プログラムレジスタ、Program Register)は、
182 次に実行すべき命令語の先頭アドレスを保持している。
184 <p><code>FR</code>(フラグレジスタ、Flag Register)は、
185 <code>OF</code>(Overflow Flag)、<code>SF</code>(Sign Flag)、<code>ZF</code>(Zero Flag)と呼ぶ
186 3個のビットからなり、演算命令などの実行によって次の値が設定される。
187 これらの値は、条件付き分岐命令で参照される。
190 <dt><code>OF</code><dd>算術演算命令の場合は、演算結果が-32768~32767に収まらなくなったとき1になり、
192 論理演算命令の場合は、演算結果が0~65535に収まらなくなったとき1になり、
195 <br><dt><code>SF</code><dd>演算結果の符号が負(ビット番号15が1)のとき1、それ以外のとき0になる。
197 <br><dt><code>ZF</code><dd>演算結果が零(全部のビットが0)のとき1、それ以外のとき0になる。
200 <li>論理加算又は論理減算は、被演算データを符号のない数値とみなして、
204 <h3 class="section"><a name="TOC2"></a>1.2 命令</h3>
207 ここで、一つの命令コードに対し2種類のオペランドがある場合、
208 上段はレジスタ間の命令、下段はレジスタと主記憶間の命令を表す。
211 <li>ロード、ストア、ロードアドレス命令
212 <p><table summary=""><tr align="left"><th valign="top" width="25%">命令 </th><th valign="top" width="10%">書き方 <br> 命令コード </th><th valign="top" width="15%">書き方 <br> オペランド </th><th valign="top" width="30%">命令の説明 </th><th valign="top" width="20%">FRの設定
213 <br></th></tr><tr align="left"><td valign="top" width="25%">ロード <br> LoaD </td><td valign="top" width="10%"><code>LD</code> </td><td valign="top" width="15%"><code>r1,r2</code> <br> —— <br> <code>r,adr[,x]</code> </td><td valign="top" width="30%"><code>r1 ← (r2)</code> <br> —— <br> <code>r ← (実効アドレス)</code> </td><td valign="top" width="20%">○ <br> ただし、<code>OF</code>には<code>0</code>が設定される。
214 <br></td></tr><tr align="left"><td valign="top" width="25%">ストア <br> STore </td><td valign="top" width="10%"><code>ST</code> </td><td valign="top" width="15%"><code>r,adr[,x]</code> </td><td valign="top" width="30%"><code>実効アドレス ← (r)</code> </td><td valign="top" width="20%">–
215 <br></td></tr><tr align="left"><td valign="top" width="25%">ロードアドレス <br> Load ADdress </td><td valign="top" width="10%"><code>LAD</code> </td><td valign="top" width="15%"><code>r,adr[,x]</code> </td><td valign="top" width="30%"><code>r ← 実効アドレス</code> </td><td valign="top" width="20%">–
216 <br></td></tr></table>
219 <p><table summary=""><tr align="left"><th valign="top" width="25%">命令 </th><th valign="top" width="10%">書き方 <br> 命令コード </th><th valign="top" width="15%">書き方 <br> オペランド </th><th valign="top" width="30%">命令の説明 </th><th valign="top" width="20%">FRの設定
220 <br></th></tr><tr align="left"><td valign="top" width="25%">算術加算 <br> ADD Arithmetic </td><td valign="top" width="10%"><code>ADDA</code> </td><td valign="top" width="15%"><code>r1,r2</code> <br> —— <br> <code>r,adr[,x]</code> </td><td valign="top" width="30%"><code>r1 ← (r1) + (r2)</code> <br> —— <br> <code>r ← (r) + (実効アドレス)</code> </td><td valign="top" width="20%">○
221 <br></td></tr><tr align="left"><td valign="top" width="25%">論理加算 <br> ADD Logical </td><td valign="top" width="10%"><code>ADDL</code> </td><td valign="top" width="15%"><code>r1,r2</code> <br> —— <br> <code>r,adr[,x]</code> </td><td valign="top" width="30%"><code>r1 ← (r1) +L (r2)</code> <br> —— <br> <code>r ← (r) +L (実効アドレス)</code> </td><td valign="top" width="20%">○
222 <br></td></tr><tr align="left"><td valign="top" width="25%">算術減算 <br> SUBtract Arithmetic </td><td valign="top" width="10%"><code>SUBA</code> </td><td valign="top" width="15%"><code>r1,r2</code> <br> —— <br> <code>r,adr[,x]</code> </td><td valign="top" width="30%"><code>r1 ← (r1) - (r2)</code> <br> —— <br> <code>r ← (r) - (実効アドレス)</code> </td><td valign="top" width="20%">○
223 <br></td></tr><tr align="left"><td valign="top" width="25%">論理減算 <br> SUBtract Logical </td><td valign="top" width="10%"><code>SUBL</code> </td><td valign="top" width="15%"><code>r1,r2</code> <br> —— <br> <code>r,adr[,x]</code> </td><td valign="top" width="30%"><code>r1 ← (r1) - L(r2)</code> <br> —— <br> <code>r ← (r) - L(実効アドレス)</code> </td><td valign="top" width="20%">○
224 <br></td></tr><tr align="left"><td valign="top" width="25%">論理積 <br> AND </td><td valign="top" width="10%"><code>AND</code> </td><td valign="top" width="15%"><code>r1,r2</code> <br> —— <br> <code>r,adr[,x]</code> </td><td valign="top" width="30%"><code>r1 ← (r1) AND (r2)</code> <br> —— <br> <code>r ← (r) AND (実効アドレス)</code> </td><td valign="top" width="20%">○ <br> ただし、<code>OF</code>には<code>0</code>が設定される。
225 <br></td></tr><tr align="left"><td valign="top" width="25%">論理和 <br> OR </td><td valign="top" width="10%"><code>OR</code> </td><td valign="top" width="15%"><code>r1,r2</code> <br> —— <br> <code>r,adr[,x]</code> </td><td valign="top" width="30%"><code>r1 ← (r1) OR (r2)</code> <br> —— <br> <code>r ← (r) OR (実効アドレス)</code> </td><td valign="top" width="20%">○ <br> ただし、<code>OF</code>には<code>0</code>が設定される。
226 <br></td></tr><tr align="left"><td valign="top" width="25%">排他的論理和 <br> eXclusive OR </td><td valign="top" width="10%"><code>XOR</code> </td><td valign="top" width="15%"><code>r1,r2</code> <br> —— <br> <code>r,adr[,x]</code> </td><td valign="top" width="30%"><code>r1 ← (r1) XOR (r2)</code> <br> —— <br> <code>r ← (r) XOR (実効アドレス)</code> </td><td valign="top" width="20%">○ <br> ただし、<code>OF</code>には<code>0</code>が設定される。
227 <br></td></tr></table>
230 <p><table summary=""><tr align="left"><th valign="top" width="25%">命令 </th><th valign="top" width="10%">書き方 <br> 命令コード </th><th valign="top" width="15%">書き方 <br> オペランド </th><th valign="top" width="30%">命令の説明 </th><th valign="top" width="20%">FRの設定
231 <br></th></tr><tr align="left"><td valign="top" width="25%">算術比較 <br> ComPare Arithmetic </td><td valign="top" width="10%"><code>CPA</code></td><td valign="top" width="15%"><code>r1,r2</code> <br> —— <br> <code>r,adr[,x]</code> </td><td valign="top" width="30%"><code>(r1)</code>と<code>(r2)</code>、又は<code>(r)</code>と<code>(実効アドレス)</code>の算術比較を行い、比較結果によって、<code>FR</code>に次の値を設定する。
233 <dt><dfn>比較結果</dfn><dd>FRの値
234 <br><dt><code>(r1) > (r2)</code><dfn> 又は </dfn><code>(r) > (実効アドレス)</code><dd><code>SF:0, ZF:0</code>
235 <br><dt><code>(r1) = (r2)</code><dfn> 又は </dfn><code>(r) = (実効アドレス)</code><dd><code>SF:0, ZF:1</code>
236 <br><dt><code>(r1) < (r2)</code><dfn> 又は </dfn><code>(r) < (実効アドレス)</code><dd><code>SF:1, ZF:0</code>
238 </td><td valign="top" width="20%">○ <br> ただし、<code>OF</code>には<code>0</code>が設定される。
239 <br></td></tr><tr align="left"><td valign="top" width="25%">論理比較 <br> ComPare Logical </td><td valign="top" width="10%"><code>CPL</code> </td><td valign="top" width="15%"><code>r1,r2</code> <br> —— <br> <code>r,adr[,x]</code> </td><td valign="top" width="30%"><code>(r1)</code>と<code>(r2)</code>、又は<code>(r)</code>と<code>(実効アドレス)</code>の論理比較を行い、比較結果によって、<code>FR</code>に次の値を設定する。
241 <dt><dfn>比較結果</dfn><dd>FRの値
242 <br><dt><code>(r1) > (r2)</code><dfn> 又は </dfn><code>(r) > (実効アドレス)</code><dd><code>SF:0</code>, <code>ZF:0</code>
243 <br><dt><code>(r1) = (r2)</code><dfn> 又は </dfn><code>(r) = (実効アドレス)</code><dd><code>SF:0</code>, <code>ZF:1</code>
244 <br><dt><code>(r1) < (r2)</code><dfn> 又は </dfn><code>(r) < (実効アドレス)</code><dd><code>SF:1</code>, <code>ZF:0</code>
246 </td><td valign="top" width="20%">○ <br> ただし、<code>OF</code>には<code>0</code>が設定される。
247 <br></td></tr></table>
250 <p><table summary=""><tr align="left"><th valign="top" width="25%">命令 </th><th valign="top" width="10%">書き方 <br> 命令コード </th><th valign="top" width="15%">書き方 <br> オペランド </th><th valign="top" width="30%">命令の説明 </th><th valign="top" width="20%">FRの設定
251 <br></th></tr><tr align="left"><td valign="top" width="25%">算術左シフト <br> Shift Left Arithmetic </td><td valign="top" width="10%"><code>SLA</code> </td><td valign="top" width="15%"><code>r,adr[,x]</code> </td><td valign="top" width="30%">符号を除き<code>(r)</code>を実効アドレスで指定したビット数だけ左にシフトする。シフトの結果、空いたビット位置には、<code>0</code>が入る。 </td><td valign="top" width="20%">○ <br> ただし、<code>OF</code>にはレジスタから最後に送り出されたビットの値が設定される。
252 <br></td></tr><tr align="left"><td valign="top" width="25%">算術右シフト <br> Shift Right Arithmetic </td><td valign="top" width="10%"><code>SRA</code> </td><td valign="top" width="15%"><code>r,adr[,x]</code> </td><td valign="top" width="30%">符号を除き<code>(r)</code>を実効アドレスで指定したビット数だけ右にシフトする。シフトの結果、空いたビット位置には、符号と同じものが入る。 </td><td valign="top" width="20%">○ <br> ただし、<code>OF</code>にはレジスタから最後に送り出されたビットの値が設定される。
253 <br></td></tr><tr align="left"><td valign="top" width="25%">論理左シフト <br> Shift Left Logical </td><td valign="top" width="10%"><code>SLL</code> </td><td valign="top" width="15%"><code>r,adr[,x]</code> </td><td valign="top" width="30%">符号を含み<code>(r)</code>を実効アドレスで指定したビット数だけ左にシフトする。シフトの結果,空いたビット位置には<code>0</code>が入る。 </td><td valign="top" width="20%">○ <br> ただし、<code>OF</code>にはレジスタから最後に送り出されたビットの値が設定される。
254 <br></td></tr><tr align="left"><td valign="top" width="25%">論理右シフト <br> Shift Right Logical </td><td valign="top" width="10%"><code>SRL</code> </td><td valign="top" width="15%"><code>r,adr[,x]</code> </td><td valign="top" width="30%">符号を含み<code>(r)</code>を実効アドレスで指定したビット数だけ右にシフトする。シフトの結果、空いたビット位置には<code>0</code>が入る。 </td><td valign="top" width="20%">○ <br> ただし、<code>OF</code>にはレジスタから最後に送り出されたビットの値が設定される。
255 <br></td></tr></table>
258 <p><table summary=""><tr align="left"><th valign="top" width="25%">命令 </th><th valign="top" width="10%">書き方 <br> 命令コード </th><th valign="top" width="15%">書き方 <br> オペランド </th><th valign="top" width="30%">命令の説明 </th><th valign="top" width="20%">FRの設定
259 <br></th></tr><tr align="left"><td valign="top" width="25%">正分岐 <br> Jump on Plus </td><td valign="top" width="10%"><code>JPL</code> </td><td valign="top" width="15%"><code>adr[,x]</code> </td><td valign="top" width="30%"><code>FR</code>の値によって、実効アドレスに分岐する。分岐しないときは、次の命令に進む。
261 <dt><dfn>分岐するときの</dfn><code>FR</code><dfn>の値</dfn><dd><code>SF:0, ZF:0</code>
263 </td><td valign="top" width="20%">–
264 <br></td></tr><tr align="left"><td valign="top" width="25%">負分岐 <br> Jump on MINUS </td><td valign="top" width="10%"><code>JMI</code> </td><td valign="top" width="15%"><code>adr[,x]</code> </td><td valign="top" width="30%"><code>FR</code>の値によって、実効アドレスに分岐する。分岐しないときは、次の命令に進む。
266 <dt><dfn>分岐するときの</dfn><code>FR</code><dfn>の値</dfn><dd><code>SF:1</code>
268 </td><td valign="top" width="20%">–
269 <br></td></tr><tr align="left"><td valign="top" width="25%">非零分岐 <br> Jump on Non Zero </td><td valign="top" width="10%"><code>JNZ</code> </td><td valign="top" width="15%"><code>adr[,x]</code> </td><td valign="top" width="30%"><code>FR</code>の値によって、実効アドレスに分岐する。分岐しないときは、次の命令に進む。
271 <dt><dfn>分岐するときの</dfn><code>FR</code><dfn>の値</dfn><dd><code>ZF:0</code>
273 </td><td valign="top" width="20%">–
274 <br></td></tr><tr align="left"><td valign="top" width="25%">零分岐 <br> Jump on ZEro </td><td valign="top" width="10%"><code>JZE</code> </td><td valign="top" width="15%"><code>adr[,x]</code> </td><td valign="top" width="30%"><code>FR</code>の値によって、実効アドレスに分岐する。分岐しないときは、次の命令に進む。
276 <dt><dfn>分岐するときの</dfn><code>FR</code><dfn>の値</dfn><dd><code>ZF:1</code>
278 </td><td valign="top" width="20%">–
279 <br></td></tr><tr align="left"><td valign="top" width="25%">オーバーフロー分岐 <br> Jump on OVerflow </td><td valign="top" width="10%"><code>JOV</code> </td><td valign="top" width="15%"><code>adr[,x]</code> </td><td valign="top" width="30%"><code>FR</code>の値によって、実効アドレスに分岐する。分岐しないときは、次の命令に進む。
281 <dt><dfn>分岐するときの</dfn><code>FR</code><dfn>の値</dfn><dd><code>OF:1</code>
283 </td><td valign="top" width="20%">–
284 <br></td></tr><tr align="left"><td valign="top" width="25%">無条件分岐 <br> unconditional Jump </td><td valign="top" width="10%"><code>JUMP</code> </td><td valign="top" width="15%"><code>adr[,x]</code> </td><td valign="top" width="30%">無条件に実効アドレスに分岐する。 </td><td valign="top" width="20%">–
285 <br></td></tr></table>
288 <p><table summary=""><tr align="left"><th valign="top" width="25%">命令 </th><th valign="top" width="10%">書き方 <br> 命令コード </th><th valign="top" width="15%">書き方 <br> オペランド </th><th valign="top" width="30%">命令の説明 </th><th valign="top" width="20%">FRの設定
289 <br></th></tr><tr align="left"><td valign="top" width="25%">プッシュ <br> PUSH </td><td valign="top" width="10%"><code>PUSH</code> </td><td valign="top" width="15%"><code>adr[,x]</code> </td><td valign="top" width="30%"><code>SP ← (SP)-L1</code>, <br> <code>(SP)← (実効アドレス)</code> </td><td valign="top" width="20%">–
290 <br></td></tr><tr align="left"><td valign="top" width="25%">ポップ <br> POP </td><td valign="top" width="10%"><code>POP</code> </td><td valign="top" width="15%"><code>r</code> </td><td valign="top" width="30%"><code>r ← ( (SP) )</code>, <br> <code>SP ← (SP) +L 1</code> </td><td valign="top" width="20%">–
291 <br></td></tr></table>
294 <p><table summary=""><tr align="left"><th valign="top" width="25%">命令 </th><th valign="top" width="10%">書き方 <br> 命令コード </th><th valign="top" width="15%">書き方 <br> オペランド </th><th valign="top" width="30%">命令の説明 </th><th valign="top" width="20%">FRの設定
295 <br></th></tr><tr align="left"><td valign="top" width="25%">コール <br> CALL subroutine </td><td valign="top" width="10%"><code>CALL</code> </td><td valign="top" width="15%"><code>adr[,x]</code> </td><td valign="top" width="30%"><code>SP ← (SP)-L 1</code>, <br> <code>(SP) ← (PR)</code>, <br> <code>PR ← 実効アドレス</code> </td><td valign="top" width="20%">–
296 <br></td></tr><tr align="left"><td valign="top" width="25%">リターン <br> RETrun form subroutine </td><td valign="top" width="10%"><code>RET</code> </td><td valign="top" width="15%"></td><td valign="top" width="30%"><code>PR ← ( (SP) )</code>, <br> <code>SP ← (SP) +L 1</code> </td><td valign="top" width="20%">–
297 <br></td></tr></table>
300 <p><table summary=""><tr align="left"><th valign="top" width="25%">命令 </th><th valign="top" width="10%">書き方 <br> 命令コード </th><th valign="top" width="15%">書き方 <br> オペランド </th><th valign="top" width="30%">命令の説明 </th><th valign="top" width="20%">FRの設定
301 <br></th></tr><tr align="left"><td valign="top" width="25%">スーパーバイザコール <br> SuperVisor CALL </td><td valign="top" width="10%"><code>SVC</code> </td><td valign="top" width="15%"><code>adr[,x]</code> </td><td valign="top" width="30%">実効アドレスを引数として割出しを行う。実行後の<code>GR</code>と<code>FR</code>は不定となる。 </td><td valign="top" width="20%">–
302 <br></td></tr><tr align="left"><td valign="top" width="25%">ノーオペレーション <br> No operation </td><td valign="top" width="10%"><code>NOP</code> </td><td valign="top" width="15%"></td><td valign="top" width="30%">何もしない。 </td><td valign="top" width="20%">–
303 <br></td></tr></table>
309 <dt><code>r</code><dfn>, </dfn><code>r1</code><dfn>, </dfn><code>r2</code><dd>いずれも <code>GR</code>を示す。指定できる<code>GR</code>は<code>GR0</code>~<code>GR7</code>
311 <br><dt><code>adr</code><dd>アドレスを示す。指定できる値の範囲は<code>0</code>~<code>65535</code>
313 <br><dt><code>x</code><dd>指標レジスタとして用いる<code>GR</code>を示す。指定できる<code>GR</code>は<code>GR1</code>~<code>GR7</code>
315 <br><dt><code>[ ]</code><dd>[ ]内の指定は省略できることを示す。
317 <br><dt><code>( )</code><dd>( )内のレジスタ又はアドレスに格納されている内容を示す。
319 <br><dt><code>実効アドレス</code><dd><code>adr</code>と<code>x</code>の内容との論理加算値又はその値が示す番地
321 <br><dt><code>←</code><dd>演算結果を、左辺のレジスタ又はアドレスに格納することを示す。
323 <br><dt><code>+L</code><dfn>, </dfn><code>-L</code><dd>論理加算、論理減算を示す。
325 <br><dt><code>FR</code><dfn>の設定</dfn><dd>
328 <li>ー: 実行前の値が保持されることを示す。