(Оффтоп)
Зачем вам знать, как работает tasm, tlink в формат используемых там объектных файлов (с точки зрения изучения ассемблера)?
А разве это не нужно знать чтобы понимать что происходит?
Смотреть нужно .LST, .MAP, не .OBJ. Для этого должна быть включена соответствующая опция компилятора.
Вот .LST и теперь действительно видно, каким образом появляется строится объектный файл, в первом приближении
Код:
Turbo Assembler Version 4.1 06/11/13 15:26:26 Page 1
hello.ASM
1 0000 .model small
2 0000 .data
3 0000 48 65 6C 6C 6F 20 24 msg db 'Hello $'
4 0007 .code
5 org 100h
6 0100 start:
7 0100 B4 09 mov ah,09h
8 0102 BA 0000r mov dx, offset msg
9 0105 CD 21 int 21h
10 0107 C3 ret
11 end start
Turbo Assembler Version 4.1 06/11/13 15:26:26 Page 2
Symbol Table
Symbol Name Type Value
??DATE Text "06/11/13"
??FILENAME Text "hello "
??TIME Text "15:26:26"
??VERSION Number 040A
@32BIT Text 0
@CODE Text _TEXT
@CODESIZE Text 0
@CPU Text 0101H
@CURSEG Text _TEXT
@DATA Text DGROUP
@DATASIZE Text 0
@FILENAME Text HELLO
@INTERFACE Text 000H
@MODEL Text 2
@STACK Text DGROUP
@WORDSIZE Text 2
MSG Byte DGROUP:0000
START Near _TEXT:0100
Groups & Segments Bit Size Align Combine Class
DGROUP Group
_DATA 16 0007 Word Public DATA
_TEXT 16 0108 Word Public CODE
и вот .lst если указать .model tiny
Код:
Turbo Assembler Version 4.1 06/11/13 15:56:57 Page 1
hello.ASM
1 0000 .model tiny
2 0000 .data
3 0000 48 65 6C 6C 6F 20 24 msg db 'Hello $'
4 0007 .code
5 org 100h
6 0100 start:
7 0100 B4 09 mov ah,09h
8 0102 BA 0000r mov dx, offset msg
9 0105 CD 21 int 21h
10 0107 C3 ret
11 end start
Turbo Assembler Version 4.1 06/11/13 15:56:57 Page 2
Symbol Table
Symbol Name Type Value
??DATE Text "06/11/13"
??FILENAME Text "hello "
??TIME Text "15:56:57"
??VERSION Number 040A
@32BIT Text 0
@CODE Text DGROUP
@CODESIZE Text 0
@CPU Text 0101H
@CURSEG Text _TEXT
@DATA Text DGROUP
@DATASIZE Text 0
@FILENAME Text HELLO
@INTERFACE Text 000H
@MODEL Text 1
@STACK Text DGROUP
@WORDSIZE Text 2
MSG Byte DGROUP:0000
START Near DGROUP:0100
Groups & Segments Bit Size Align Combine Class
DGROUP Group
_DATA 16 0007 Word Public DATA
_TEXT 16 0108 Word Public CODE
Я уже указала, что надо сделать, чтобы исправить ошибку. Причина ошибки в том, что компилятор хотел сделать DATA отдельным сегментом (что ему диктовала модель small), а линкер -- склеил его с CODE (ибо он делал COM).
Да, это я уже проделывал и все нормально работает.
Когда в исходном коде есть, скажем, "offset" или ссылка на какие-либо символы, то ассемблер не всегда знает, какими адресами их заменять.
Но тем не менее, ассемблер все равно проставил msg смещение 0:
Код:
MSG Byte DGROUP:0000
. Значит линкер это смещение скорректирует.
Конкретные адреса в конечном исполняемом файле (точнее, в памяти, куда система его загрузит) будут известны лишь линкеру.
В данном случае, жто смещение msg, а значения DGROUP и _TEXT уже будет проставлено загрузчиком после запуска программы, верно?
либо линкуйте в exe
линкую в .EXE результат почти тотже
тут msg уехала на смещение 0108, хотя инструкция по смещению 0003 запишет в dx 0008A.
Если не уберать org 100h то msg уехжает на смещение 0208