使用TASM

时间:2015-10-07 09:06:23

标签: assembly 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时,我没有收到错误。

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

谢谢!

1 个答案:

答案 0 :(得分:4)

ASSUME只是汇编程序的信息,它既不会生成也不会更改任何代码。如果汇编程序抱怨,你必须插入它,e。 G。 " CS无法从当前段"到达。您可以在源代码的每个位置重新定义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