Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.11.2011, 20:12   #1
Зойберг
Пользователь
 
Регистрация: 26.02.2007
Сообщений: 24
По умолчанию Вызов C-шной printf из ASM-программы (tasm). Не работает.

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

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

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

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

Вот такой hello world на 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 E909AD623F1C633A5C70726F675C61736D5 C6D656D64756D705C6D+
?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, и программа зависала, т.е. выполнение кода идёт. Выходит, именно функции не вызываются. Может быть я что-то упустил?

Последний раз редактировалось Зойберг; 03.11.2011 в 23:57.
Зойберг вне форума Ответить с цитированием
Старый 03.11.2011, 20:58   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
push ax
call near ptr _printf
А сколько ты параметров передаешь ей? Неужели только один?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.11.2011, 23:47   #3
Зойберг
Пользователь
 
Регистрация: 26.02.2007
Сообщений: 24
По умолчанию

Да. Указатель на строку-константу в памяти "Hello world" (offset DGROUP:s@).
Зойберг вне форума Ответить с цитированием
Старый 04.11.2011, 09:25   #4
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Почитайте это: http://bookz.ru/authors/avtor-neizve...9-bcppl31.html
Оказывается, при линковке важен также порядок указания объектов и библиотек!

В личку кинул ссылку с другого форума с похожей проблемой, здесь все равно удалят
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как компилировать программы в TASM? Roof Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 22.12.2011 10:33
Вызов внешней программы Macmeprag C# (си шарп) 1 14.05.2011 16:19
Программа работает, нужны коменты tASM edik12 Помощь студентам 0 14.04.2011 11:40
Вызов метода в asm вставке. Mixasik Общие вопросы Delphi 3 20.02.2010 10:42
Вызов программы с параметрами bgmd.win Общие вопросы Delphi 2 05.01.2010 14:40