· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Линкуем модули в TASM32...

Посл.отвђт Сообщенiе


Дата: Янв 19, 2004 22:24:02 · Поправил: AsmGuru62

Привет всем!

Странная вещь... есть два модуля на TASM32:
--- MODULE1.ASM:
.model flat

code segment page public 'CODE'
     assume cs:code
...
code ends
end

--- MODULE2.ASM:
.model flat

code segment page public 'CODE'
     assume cs:code
...
code ends
end

Когда линкер (TLINK32) собирает эти модули - между ними (их началами) пространство в 4096 байт. Я, конечно, понимаю, что это следствие выравнивания на page.

В руководстве по линкеру сказано, что сегменты с одинаковыми атрибутами (даже если они в разных модулях) считаются одним сегментом. Так почему это не работает при выравнивании?


Дата: Янв 20, 2004 06:16:30

AsmGuru62
У тебя оба модуля в одном сегменте.
;--- MODULE0.ASM
.386
.model flat

extrn m1
extrn m2

.code
m0	proc
	call	m1
	call	m2
	ret
m0	endp
end m0


;--- MODULE1.ASM
.386
.model flat
public m1
code	segment page public 'CODE'
	assume cs:code
m1	proc
	mov eax,1
	ret
m1	endp
ends
end


;--- MODULE2.ASM
.386
.model flat
public m2
code	segment page public 'CODE'
	assume cs:code
m2	proc
	mov eax,2
	ret
m2	endp
ends
end

tasm32 *.asm;
tlink32 -m -s -M -Tpe module0 module1 module2
в результате в map-Файле
 Start         Length     Name  Class
 0001:00000000 000000010H _TEXT CODE
 0001:00001000 000001006H CODE  CODE    !!! обрати внимание – сегмент один


Detailed map of segments

 0001:00000000 0000000D C=CODE S=_TEXT G=(none) M=module0.asm ACBP=A9
 0001:00000010 00000000 C=CODE S=_TEXT G=(none) M=module1.asm ACBP=A9
 0001:00000010 00000000 C=CODE S=_TEXT G=(none) M=module2.asm ACBP=A9
 0001:00001000 00000006 C=CODE S=CODE  G=(none) M=module1.asm ACBP=89
 0001:00002000 00000006 C=CODE S=CODE  G=(none) M=module2.asm ACBP=89

  Address         Publics by Name

 0001:00001000       M1
 0001:00002000       M2

  Address         Publics by Value

 0001:00001000       M1
 0001:00002000       M2
При этом требование page заставляет tlink/tlink32 давать адреса m1 и m2 кратными 4096.

Если использовать ilink32
ilink32 -m -s -M -Tpe module0 module1 module2
то
 Start         Length     Name  Class
 0001:00401000 00000001EH _TEXT CODE
 0002:00402000 000000008H _DATA DATA
 0003:00402008 000000000H _BSS  BSS
 0004:00000000 000000000H _TLS  TLS


Detailed map of segments
 0001:00000000 0000000D C=CODE S=_TEXT G=(none) M=C:\2\MODULE0.OBJ ACBP=A9
 0001:00000010 00000006 C=CODE S=_TEXT G=(none) M=C:\2\MODULE1.OBJ ACBP=A9
 0001:00000018 00000006 C=CODE S=_TEXT G=(none) M=C:\2\MODULE2.OBJ ACBP=A9
 0002:00000008 00000008 C=DATA S=_DATA G=DGROUP M=C:\2\MODULE0.OBJ ACBP=A9

  Address         Publics by Name

 0001:00000000 @C1_0
 0001:00000010 @C2_0
 0001:00000018 @C3_0
 0001:00000010 M1
 0001:00000018 M2

  Address         Publics by Value

 0001:00000000 @C1_0
 0001:00000010 @C2_0
 0001:00000010 M1      !!! обрати внимание на адрес
 0001:00000018 M2      !!! обрати внимание на адрес 
 0001:00000018 @C3_0


Дата: Янв 20, 2004 23:10:27

Thanks!


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.061