在 TASM 中使用两个数据段
Working with two data segments in TASM
我想在我的 TASM 程序中使用两个数据段。我知道,这很糟糕,但我必须有两个相当大的数组,每个数组的大小都是 FFFFh(我希望我可以让它们更大)。
我假设了以下段:assume cs:code, ds:data, ds:dat2, ss:stac
。在任何数据段中每次使用变量之前,我写道:
mov ax, data (or dat2)
mov ds, ax
现在,当我尝试编译时,我在使用变量的每一行都收到以下错误:
**Error** source.ASM(232) Can't address with currently ASSUMEd segment registers
另外,我注意到只有当我直接引用变量时才会发生错误。当我写 mov ax, example
时出现错误,但是当我写 mov ax, offset example
时我没有收到错误。
有办法解决吗?或者,更好的是,不使用两个数据段?
谢谢!
ASSUME
只是给汇编程序的一个信息,它不产生也不改变任何代码。你必须插入它,如果汇编程序抱怨,e。 G。 "CS unreachable from current segment"。你可以在源码的每一处重新定义一个ASSUME
,它对以下几行有效。
示例:
.MODEL huge
_TEXT SEGMENT
ASSUME CS:_TEXT
start:
mov ax, _DATA
mov ds, ax
lea dx, [txt1]
mov ah, 09h
int 21h
mov ax, _DAT2
mov ds, ax
lea dx, [txt2]
mov ah, 09h
int 21h
jmp far ptr far_away
_TEXT ENDS
_TEXT2 SEGMENT
ASSUME CS:_TEXT2
far_away:
mov ax, _DAT3
mov ds, ax
ASSUME DS:_DAT3
mov dx, example
mov ah, 02h
int 21h
xchg dh, dl
int 21h
mov dl, 13
int 21h
mov dl, 10
int 21h
lea dx, [txt3]
mov ah, 09h
int 21h
mov ax, 4C00h
int 21h
_TEXT2 ENDS
_DATA SEGMENT
ORG 0FF00h
txt1 DB "TXT_1", 13, 10, '$'
_DATA ENDS
_DAT2 SEGMENT
ORG 0FF00h
txt2 DB "TXT_2", 13, 10, '$'
_DAT2 ENDS
_DAT3 SEGMENT
ORG 0FF00h
example DW 'ab'
txt3 DB "TXT_3", 13, 10, '$'
_DAT3 ENDS
_STACK SEGMENT STACK 'STACK'
DW 1000h dup(?)
_STACK ENDS
END start
我想在我的 TASM 程序中使用两个数据段。我知道,这很糟糕,但我必须有两个相当大的数组,每个数组的大小都是 FFFFh(我希望我可以让它们更大)。
我假设了以下段:assume cs:code, ds:data, ds:dat2, ss:stac
。在任何数据段中每次使用变量之前,我写道:
mov ax, data (or dat2)
mov ds, ax
现在,当我尝试编译时,我在使用变量的每一行都收到以下错误:
**Error** source.ASM(232) Can't address with currently ASSUMEd segment registers
另外,我注意到只有当我直接引用变量时才会发生错误。当我写 mov ax, example
时出现错误,但是当我写 mov ax, offset example
时我没有收到错误。
有办法解决吗?或者,更好的是,不使用两个数据段?
谢谢!
ASSUME
只是给汇编程序的一个信息,它不产生也不改变任何代码。你必须插入它,如果汇编程序抱怨,e。 G。 "CS unreachable from current segment"。你可以在源码的每一处重新定义一个ASSUME
,它对以下几行有效。
示例:
.MODEL huge
_TEXT SEGMENT
ASSUME CS:_TEXT
start:
mov ax, _DATA
mov ds, ax
lea dx, [txt1]
mov ah, 09h
int 21h
mov ax, _DAT2
mov ds, ax
lea dx, [txt2]
mov ah, 09h
int 21h
jmp far ptr far_away
_TEXT ENDS
_TEXT2 SEGMENT
ASSUME CS:_TEXT2
far_away:
mov ax, _DAT3
mov ds, ax
ASSUME DS:_DAT3
mov dx, example
mov ah, 02h
int 21h
xchg dh, dl
int 21h
mov dl, 13
int 21h
mov dl, 10
int 21h
lea dx, [txt3]
mov ah, 09h
int 21h
mov ax, 4C00h
int 21h
_TEXT2 ENDS
_DATA SEGMENT
ORG 0FF00h
txt1 DB "TXT_1", 13, 10, '$'
_DATA ENDS
_DAT2 SEGMENT
ORG 0FF00h
txt2 DB "TXT_2", 13, 10, '$'
_DAT2 ENDS
_DAT3 SEGMENT
ORG 0FF00h
example DW 'ab'
txt3 DB "TXT_3", 13, 10, '$'
_DAT3 ENDS
_STACK SEGMENT STACK 'STACK'
DW 1000h dup(?)
_STACK ENDS
END start