Вызов С-шной Printf Из Ассемблерной Программы (tasm). Не Работает

  • Автор темы Guest
  • Дата начала
G

Guest

#1
Сори за тройное создание темы. Что-то глюкнуло, удалить не могу уже

Здравствуйте. Проблема такая.

Вызываю функции стандартной библиотеки C (printf и system) из asm-программы, вроде бы подключаю нужные lib- и obj-файлы с помощью директивы INCLUDELIB. Линковщик при сборке не ругается, всё нормально. Но функции почему-то не работают.

Компилятор - tasm для DOS.
Библиотеки - из пакета TurboC 2.0 тоже для DOS.

Причём, сам asm-файл не писаный вручную, а генерированный тем же TurboC. Нужные файлы библиотек я определил так: пробовал компилировать напрямую C-файл в exe-файл, удаляя при этом один за другим файлы lib и obj (их там не очень много).

Вот такой hello world на C:
C++:
#include "stdio.h"

int main(void)
{
printf("Hello world\n");
system("pause");
return 0;
}
Генерируется на ассемблере (INCLUDELIB дописал вручную):
INCLUDELIB C:\Prog\ASM\tasm\CS.LIB
INCLUDELIB C:\Prog\ASM\tasm\EMU.LIB
INCLUDELIB C:\Prog\ASM\tasm\MATHS.LIB
INCLUDELIB C:\Prog\ASM\tasm\C0S.OBJ

ifndef ??version
?debug macro
endm
endif
?debug S "c:\prog\asm\memdump\memdmp.c"
_TEXT segment byte public 'CODE'
DGROUP group _DATA,_BSS
assume cs:_TEXT,ds:DGROUP,ss:DGROUP
_TEXT ends
_DATA segment word public 'DATA'
d@ label byte
d@w label word
_DATA ends
_BSS segment word public 'BSS'
b@ label byte
b@w label word
?debug C E909AD623F1C633A5C70726F675C61736D5C6D656D64756D705C6D+
?debug C 656D646D702E63
?debug C E900101D1107737464696F2E68
?debug C E900101D11087374646172672E68
_BSS ends
_TEXT segment byte public 'CODE'
; ?debug L 3


_main proc near
; ?debug L 5
mov ax,offset DGROUP:s@
push ax
call near ptr _printf
pop cx
; ?debug L 6
mov ax,offset DGROUP:s@+13
push ax
call near ptr _system
pop cx
; ?debug L 7
xor ax,ax
jmp short @1
@1:
; ?debug L 8
ret
_main endp


_TEXT ends
?debug C E9
_DATA segment word public 'DATA'
s@ label byte
db 72
db 101
db 108
db 108
db 111
db 32
db 119
db 111
db 114
db 108
db 100
db 10
db 0
db 112
db 97
db 117
db 115
db 101
db 0
_DATA ends
_TEXT segment byte public 'CODE'
extrn _system:near
extrn _printf:near

_TEXT ends
public _main
end

Причём сама по себе asm-программа работает: пробовал ставить в main строчку lp: jmp lp, и программа зависала, т.е. выполнение кода идёт. Выходит, именно функции не вызываются. Может быть я что-то упустил?