TASM 8086 (16 бит): как получить размер массива? - PullRequest
1 голос
/ 09 февраля 2020

Я попытался использовать оператор SIZE в TASM, чтобы получить размер массива. Но здесь есть небольшая проблема ...

Если я использую директиву EQU для задания данных массива,

ASSUME CS:CODE,DS:DATA

ARRAY EQU 10H,20H,30H,40H

CODE SEGMENT
;[...Initialize data segment...]
MOV AX,SIZE ARR
;[...Rest of the code(if any)...]
CODE ENDS

DATA SEGMENT
ARR DB ARRAY
DATA ENDS
END

Это дает размер 1.

Наиболее вероятным для этого является способ, которым TASM вычисляет размер

SYMBOL_NAME DB(=1) (*) ARRAY[1+NUMBER OF COMMAS] 

. Есть ли способ преодолеть это? Может быть, с помощью какой-либо другой директивы или путем условного расширения макросов перед сборкой ..

Вывод после использования упомянутого решения. (DOSBox 0.74)

Turbo Assembler  Version 3.0  Copyright (c) 1988, 1991 Borland International

Assembling file:   exp14b.ASM
ADD DI,$-ARR
**Error** exp14b.ASM(12) Can't subtract dissimilar relative quantities
Error messages:    1
Warning messages:  None
Passes:            1
Remaining memory:  476k

1 Ответ

4 голосов
/ 09 февраля 2020

Мое предложение:

...
MOV AX,ARR_SIZE
...
ARR DB ARRAY
ARR_SIZE EQU $-ARR
ARR_LENGTH EQU (ARR_SIZE / TYPE ARR)    ; not necessary but useful
...
...