C++の構造体やクラスのようなものが必要です
たとえば、配列と2つの属性(sizeとlen)を持つクラスと、appendやremoveなどの関数が必要です。
マクロとプロシージャを使用してアセンブリでこれを実装するにはどうすればよいですか?
Tasmは例えばをサポートします。
struc String // note: without 't' at the end
size dw 100
len dw 10
data db 0 dup(100)
ends String
Gnuアセンブラにも.struct
ディレクティブがあります。
MASMの構文は次 のとおりです。
String STRUCT
size dw 100
len dw 10
String ENDS
同じMASMマニュアルからの再使用:
ASSUME eax:PTR String
mov ecx, [eax].size,
mov edx, [eax].len
ASSUME eax:nothing
.. or ..
mov ecx, (String PTR [eax]).size // One can 'cast' to struct pointer
ローカル変数に直接アクセスすることもできます
mov eax, myStruct.len
これが私が書いたHIDインターフェースルーチンからのサンプルMASM構造体です:
SP_DEVICE_INTERFACE_DATA struct
CbSize DWORD ?
ClassGuid GUID <>
Flags DWORD ?
Reserved ULONG ?
SP_DEVICE_INTERFACE_DATA ends
8086MASMの構造
構文
struct_name STRUC
var_name type ?
...
struct_name ENDS
ルール
1)初期化できません(初期化するとガベージ値になる場合)
2)「直接アドレッシングモード」を使用してアクセスする必要があります(「即時アドレッシングモード」にならない場合)
2つの数字を追加するプログラム
DATA SEGMENT
FOO STRUC
A DB ?
B DB ?
SUM DW ?
FOO ENDS
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
XOR AX,AX
MOV DS:[FOO.A],0FFH
MOV DS:[FOO.B],0FFH
MOV AL,DS:[FOO.A] ;al=ff
ADD AL,DS:[FOO.B] ;al=al+ff
ADC AH,00H ;ah=ah+carry_flag(1/0)+00
MOV DS:[FOO.SUM],AX ;sum=ax
HLT ;stop
CODE ENDS
END START