sdasのマクロアセンブラ機能について

※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

マクロアセンブラ機能


sdccに付属するZ80のアセンブラにはマクロ機能が追加されている。
このマクロ機能はマイクロソフトのM80/MACRO80と同等である。一般にマクロアセンブラは
単純な機械語命令変換のみのアセンブラと違って幾つかの機能を持っている。
このマクロ機能には通常のCPU命令である機械語と、擬似命令と呼ぶアセンブラ処理系に対する
機能が追加されている。擬似命令はCPU命令ではなくアセンブラが読み取り処理する特殊な識別子
といえる。
アセンブラに対する擬似命令はさまざまな種類の命令と機能を持っているが、このなかに
マクロ機能と呼ぶものがある。

マクロ機能は単に幾つかの文字列を指定された文字列に変換する機能である。これらの実際の動作は
単純で、
"DCBA"という文字列がアセンブラのソース中に見つかった場合に、指定される文字列(例えば"****")
などに置き換えるという機能を単に実現しているに過ぎない。

このような考え方は初期のマイクロソフトのマクロアセンブラM80等が有名で現在でもMASMなどで
よく利用されておりアセンブラではとても有効に機能する。
なぜならCPUの機械語は単純な処理でしかないため、読みやすいソースコードを記述したい場合には
関数やプロシージャといったような処理単位のまとまりでソースコードを管理する必要があるためだ。
また8bitのCPUは単純な8bit処理で16bitや24bitなどのようなより長いサイズの変数をソフトで処理
する必要があるため、処理単位をマクロで記述することが有効となる。

マクロには特定のCPU命令をリピート定義したり、関数やプロシージャのようにCPU命令を
コピペする機能が追加されている。以下にリピート命令を用いてマクロの概要を説明する。
リピート命令はマクロ機能のなかでも比較的単純で簡単な機能で、マイクロソフトの8080/Z80用
マクロアセンブラであるM80にも存在する機能だ。
sdccのアセンブラsdasz80ではこのリピート機能を以下のように記述する。


.rept	3
nop
.endm


マクロ構文はドット(.)で始まる。ここでは.reptがリピート機能を有するマクロであり、
.endmがマクロ構文の終了を示す。この間に記述されるCPU命令分がマクロアセンブラによって展開
されCPUの機械語に展開される。
ここでは.reptと.endmの間の命令を三回繰り返す事になる。この結果アセンブル後のオブジェクト
コードは以下のような命令列になる。

nop
nop
nop

リピートによりこの三つのNOP命令のオブジェクトコードが生成されることとなる。このリピート
マクロが有効な場面は複数の繰り返し命令が並ぶ際にソースコードの可読性を改善する場合だ。
例えば掛け算で頻繁に発生するシフト命令などはこの方法で比較的単純に記述することができる。

;sdas macro
;
	.rept 7
	sla	a
	.endm

この事例ではシフトを7回計算して二進数の掛け算をする。ソースコードが単純化できるため
繰り返しの命令の並びを気にしなくとも良い。

この構文はsdasz80のものであるがマイクロソフト本家M80のマクロアセンブラではREPT,ENDM
として記述する。

;M80 MACRO_REPEAT
;
	REPT 7
	sla a
	ENDM


これら以外にプロシージャや関数のようにマクロを記述可能である。これは特定の機能をマクロ
展開するものである。このようなマクロ展開が有効な場合はプロシージャ化しやすい命令機能を
何度も使用する場面だ。また引数を指定することも可能である。
CPU命令にはスタックへの退避などが頻繁に発生する。このような場合に常にコードを書く作業が
面倒となるため、マクロで記述することでソースコードの管理と記述の手間が省ける。

;sdas macro
;
	.macro	pushreg
	push	bc
	push	hl
	.endm

	.macro	pullreg
	pop		hl
	pop		bc
	.endm
	

	ld	a,#0x10

	pushreg
	call	sub1
	pullreg

	ld	b,#0x20


ここでは.macro .endmがマクロ定義である。.macroの後ろに書かれた文字列がマクロ名で、この名前で
ソースコードに記載することで定義内のアセンブラが展開される。
これは以下のようなアセンブラコードを記述したことと等しい。

	ld		a,#0x10
	push	bc
	push	hl
	call	sub1
	pop		hl
	pop		bc
	ld		b,#0x20

マクロ展開はソースの内容をコピペするだけなのでメモリ消費量の削減とはならないが
繰り返し再利用するコードを記述する場合はマクロ定義すればソースの管理が容易となる。
高級言語では単純な文字列のコピペ処理はあまり意味がなく、定数などの置き換え程度でしか意味がないが
CPUの機械命令では単純命令をコピペするだけでも驚異的な機能を発揮するのである。

以上のアセンブラをM80にて記述すると以下のようになる。
M80ではアセンブラのラベル記述と似た方法でマクロ名を定義する。

;M80 MACRO
;
pushreg		MACRO
			push	bc
			push	hl
			ENDM

pullreg		MACRO
			push	hl
			push	bc
			ENDM

	ld	a,10h
	pushreg
	call sub1
	pullreg
	ld	b,20h


このマクロ機能は比較的高度なアセンブラにしか備わっていない機能なので命令の翻訳のみの
単純なアセンブラではマクロ機能は利用できない。
マイクロソフトは8080/Z80用のアセンブラ製品で早い段階からこのマクロ機能を自社製品に組み込んでいた。
アセンブラにおけるマイクロソフトの成功の理由の一つはこのマクロ機能にあるといっても良いだろう。
DOSコールなどもマクロ化することができるので使いこなせば便利な機能で高度な処理も記述可能
となる。しかし他社で販売されていた一般的な単純機能のシンプルなアセンブラとのソースコードは同じ
ではないためアセンブラの互換性に問題が生じやすくなった。
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。