【问题标题】:TASM 8086 (16-bit): How get sizeof array?TASM 8086(16 位):如何获取 sizeof 数组?
【发布时间】:2020-02-09 12:41:23
【问题描述】:

我尝试在 TASM 中使用 SIZE 运算符来获取数组的大小。不过这里有个小问题……

如果我使用 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

【问题讨论】:

  • 你可以把 0 放在最后,然后计数元素,直到索引处的元素为 0。
  • 我正在寻找一些组装时间方法...如果现有值之一变成 0 怎么办?

标签: arrays size x86-16 tasm


【解决方案1】:

我的建议:

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

【讨论】:

  • @PeterCordes :不,它没有,MASM 的早期版本也没有。 LENGTHOF 和 SIZEOF 最终被添加到 MASM。在 TASM 中,数组的概念对于 SIZE 运算符的意义是有限的。声明数组并让 SIZE 返回正确大小(以字节为单位)的唯一方法是使用 DUP。因此,如果您将其声明为ARR DW 5 DUP(0) SIZE 将返回 10。当涉及到 SIZE 时,第一个逗号之后的所有内容都将被忽略。 ARR DW 5 DUP(0), 4 DUP(0)ARR DW 5 DUP(0), 10h, 11h, 12h 一样仍会返回 10
  • 在 OP 的情况下,ARR DB ARRAY SIZE 只是返回第一个元素 (1) 的大小。第一个逗号之后的所有内容都不会应用于数组。如果是 ARR DW ARRAY SIZE 会返回 2 等。
  • @NephewofStackoverflow:这是我 30 年来第一次听到 TASM 贬值 :-)
  • @rkhb 他对问题进行了编辑,他以错误的方式使用您的想法。
  • @MichaelPetch:我不相信。我想我被拖了。
猜你喜欢
  • 1970-01-01
  • 2015-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多