Assembly 在TASM中使用两个数据段

Assembly 在TASM中使用两个数据段,assembly,tasm,Assembly,Tasm,我想在我的TASM程序中使用两个数据段。我知道,这很糟糕,但我必须有两个相当大的阵列,每个阵列的大小都是FFFFh(我希望我能有更大的阵列) 我假设段如下:假设cs:code,ds:data,ds:dat2,ss:stac。在任何数据段中每次使用变量之前,我写道: mov ax, data (or dat2) mov ds, ax 现在,当我尝试编译时,对于使用变量的每一行,我都会得到以下错误: **Error** source.ASM(232) Can't address with curr

我想在我的TASM程序中使用两个数据段。我知道,这很糟糕,但我必须有两个相当大的阵列,每个阵列的大小都是FFFFh(我希望我能有更大的阵列)

我假设段如下:
假设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
我没有得到错误

有办法解决这个问题吗?或者,更好的是,不使用两个数据段


谢谢

假设
只是汇编程序的一个信息,它既不生成也不更改任何代码。如果汇编器抱怨,您必须插入它,例如。G“无法从当前段访问CS”。您可以在源代码的每个位置重新定义一个
假设,它对以下行有效

例如:

.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

我不确定您是否可以同时为同一段寄存器假定多个段。您是否考虑过在第二个数据段中使用
es
?我想您现在知道我们为什么要使用32位和64位程序了。