Проблемы с компоновкой
С написанием самой программы пролемы не возникло - компилируется в объектник без ошибок. А вот с компоновкой проблема - после компоновки создаётся пустой .exe файл - т.е. размер 0 байт - и никак
не могу врубиться в чём причина.... всё время получаю ошибку:
Fatal: General error in module mpulse.asm
Линковшику вообще не пофиг чё там в .asm файле? - ему же из объектного загрузочный модуль надо создать...
(вроде всё как всегда за исключением того, что раньше использовал tasm4.0, а сейчас использую пакет tasm5plus)
компилирую так:
Код:
.\TASM5Pluse\BIN\tasm32.exe mpulse.asm ,,, /l /zi >out1.txt
компоновать пытаюсь так:
Код:
.\TASM5Plus\BIN\tlink32.exe mpulse.obj /v >out.txt
Сам исходник вот:
Код:
.586
stk segment stack
db 100h dup (0)
stk ends
common_data segment para common "data"
hfile dw 0 ; дескриптор файла
fname db 'rezult.dat',0
pname dd fname
lcnt dd 0 ; младшая часть счётчика
hcnt dd 0 ; старшая часть счётчика
mpulse dd 12288 dup (0)
common_data ends
code segment
assume cs: code, ds: common_data
start proc
mov edi,0 ; индекс текущего измерения
; проверка доступности TSC
mov eax,1
cpuid
test edx,8h
jz @@notsc
mov ecx,6144 ; число измерений
@@main_cycl: ; основной цикл
push ecx
rdtsc ; считывание начального занчения счётчика
; тактов
push eax ; младшая часть счётчика
push edx ; старшая
cli ; отключить прерывания
@@measuring:
mov dx,378h
in ax,dx
cmp ax,0
jne @@measuring
sti ; разрешить прерывания
rdtsc ; считывание прошедшего времени
; сохранить значение счётчика
mov ebx, offset lcnt
mov [ebx], eax
mov ebx, offset hcnt
mov [ebx], edx
; проверка переполнения младшей части TSC
pop ebx ; edx (до измерения) -> ebx
cmp edx,ebx
jne @@replet ; если было переаолнение
jmp @@noreplet
@@replet:
pop ebx ; eax (до измерения) -> ebx
mov edx,0ffffffffh
sub edx,ebx
add edx,eax ; прошедшее число тактов за время измерения ebx
xchg edx,ebx
jmp @@save_mpulse
@@noreplet:
pop ebx
sub eax,ebx
xchg ebx,eax ; число тактов за время измерения в ebx
@@save_mpulse:
; Запись результата в память:
mov edx, offset mpulse
mov [edx+edi],ebx
; Цикл измерения 0:
cli
@@measuring_zero:
mov dx,378h
in ax,dx
cmp ax,0
je @@measuring_zero
sti
rdtsc ; считывание тактов после измерения 0
mov ebx,offset hcnt
cmp [ebx],edx
jne @@replet_zero
jmp @@noreplet_zero
@@replet_zero:
mov ebx,offset lcnt
mov edx,0ffffffffh
sub edx,[ebx]
add edx,eax
xchg ebx,edx
jmp @@save_mpulse_zero
@@noreplet_zero:
mov ebx,offset lcnt
sub eax,[ebx]
xchg eax,ebx
@@save_mpulse_zero:
mov edx,offset mpulse
mov [edx+edi+4],ebx
add edi,4
pop ecx
dec ecx
jnz @@main_cycl
; Запись измерений в файл:
; ...
mov al,02h ; разрешить чтение/запись
lds dx,pname
mov ah,3dh
int 21h
jc @@file_not_open
mov bx, ax ; получить дескриптор файла
mov cx, 49152
xor edx,edx
mov edx, offset mpulse
mov ah, 40h
int 21h
mov ah,3eh ; (Примечение: дескриптор уже записан в bx)
int 21h
@@exit:
jmp @@endprog
@@file_not_open:
; сообщить о невозможности открытия файла для записи результата
jmp @@endprog
@@notsc:
; выдать информацию об ошибке не доступности TSC
@@endprog:
; выдать информацию о завершении работы
start endp
code ends
end start
stk segment stack
db 100h dup (0)
stk ends
common_data segment para common "data"
hfile dw 0 ; дескриптор файла
fname db 'rezult.dat',0
pname dd fname
lcnt dd 0 ; младшая часть счётчика
hcnt dd 0 ; старшая часть счётчика
mpulse dd 12288 dup (0)
common_data ends
code segment
assume cs: code, ds: common_data
start proc
mov edi,0 ; индекс текущего измерения
; проверка доступности TSC
mov eax,1
cpuid
test edx,8h
jz @@notsc
mov ecx,6144 ; число измерений
@@main_cycl: ; основной цикл
push ecx
rdtsc ; считывание начального занчения счётчика
; тактов
push eax ; младшая часть счётчика
push edx ; старшая
cli ; отключить прерывания
@@measuring:
mov dx,378h
in ax,dx
cmp ax,0
jne @@measuring
sti ; разрешить прерывания
rdtsc ; считывание прошедшего времени
; сохранить значение счётчика
mov ebx, offset lcnt
mov [ebx], eax
mov ebx, offset hcnt
mov [ebx], edx
; проверка переполнения младшей части TSC
pop ebx ; edx (до измерения) -> ebx
cmp edx,ebx
jne @@replet ; если было переаолнение
jmp @@noreplet
@@replet:
pop ebx ; eax (до измерения) -> ebx
mov edx,0ffffffffh
sub edx,ebx
add edx,eax ; прошедшее число тактов за время измерения ebx
xchg edx,ebx
jmp @@save_mpulse
@@noreplet:
pop ebx
sub eax,ebx
xchg ebx,eax ; число тактов за время измерения в ebx
@@save_mpulse:
; Запись результата в память:
mov edx, offset mpulse
mov [edx+edi],ebx
; Цикл измерения 0:
cli
@@measuring_zero:
mov dx,378h
in ax,dx
cmp ax,0
je @@measuring_zero
sti
rdtsc ; считывание тактов после измерения 0
mov ebx,offset hcnt
cmp [ebx],edx
jne @@replet_zero
jmp @@noreplet_zero
@@replet_zero:
mov ebx,offset lcnt
mov edx,0ffffffffh
sub edx,[ebx]
add edx,eax
xchg ebx,edx
jmp @@save_mpulse_zero
@@noreplet_zero:
mov ebx,offset lcnt
sub eax,[ebx]
xchg eax,ebx
@@save_mpulse_zero:
mov edx,offset mpulse
mov [edx+edi+4],ebx
add edi,4
pop ecx
dec ecx
jnz @@main_cycl
; Запись измерений в файл:
; ...
mov al,02h ; разрешить чтение/запись
lds dx,pname
mov ah,3dh
int 21h
jc @@file_not_open
mov bx, ax ; получить дескриптор файла
mov cx, 49152
xor edx,edx
mov edx, offset mpulse
mov ah, 40h
int 21h
mov ah,3eh ; (Примечение: дескриптор уже записан в bx)
int 21h
@@exit:
jmp @@endprog
@@file_not_open:
; сообщить о невозможности открытия файла для записи результата
jmp @@endprog
@@notsc:
; выдать информацию об ошибке не доступности TSC
@@endprog:
; выдать информацию о завершении работы
start endp
code ends
end start
--------------------------------------------
Что мне кажется, что проблема на поверхности, но не вижу где...
может кто подскажет.
RDTSC надо заменить её машкодом 0fh,31h - Она появилась у пней, когда TASM уже перестали поддерживать.
ЗЫ используй TASM и TLINK.
И что странно. Я просто убрал ключь - /v (включения отладочной информации) и так сразу всё отлично откомпоновалось - ошибок компановки не стало...
---------------------
Без отладочной информации проблема, тогда возникает с отладкой...