3

C++の構造体やクラスのようなものが必要です

たとえば、配列と2つの属性(sizeとlen)を持つクラスと、appendやremoveなどの関数が必要です。

マクロとプロシージャを使用してアセンブリでこれを実装するにはどうすればよいですか?

4

3 に答える 3

6

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
于 2012-11-19T09:59:02.327 に答える
3

これが私が書いたHIDインターフェースルーチンからのサンプルMASM構造体です:

SP_DEVICE_INTERFACE_DATA struct
    CbSize      DWORD   ?
    ClassGuid   GUID    <>
    Flags       DWORD   ?
    Reserved    ULONG   ?
SP_DEVICE_INTERFACE_DATA ends
于 2012-11-19T15:01:09.190 に答える
1

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
于 2019-11-13T13:12:39.507 に答える