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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.02.2009, 17:13   #1
Olen'
 
Регистрация: 18.02.2009
Сообщений: 3
По умолчанию C и ассемблер, не могу скомпилировать

есть два файла:
lab3.cpp:


Цитата:
#include "stdio.h"
#include "string.h"

extern "C" void asmproc(char*, char, int, char*);

void main()
{int kol;
char strin[256], strout[256], sim;

printf("Vvedite stroku:");
gets(strin);
kol=strlen(strin);
printf("Vvedite simvol:");
scanf("%c", &sim);

asmproc(strin, sim, kol, strout);

printf("Sosedi simvola:%s\n", strout);
}
и asmproc.asm:

Цитата:
MASM
MODEL SMALL
STACK 256

PUBLIC _asmproc

.CODE
_asmproc proc near

PUSH BP
MOV BP, SP
PUSH AX
PUSH BX
PUSH CX
PUSH SI
PUSH DI

;инициализируем счетчик цикла CX
MOV CX, [BP+8] ;(сколько символов в входной строке)
MOV BX, CX
DEC BX ;BX-необходим в процессе обработки

MOV SI, [BP+4] ;инициализация индексных регистров
MOV DI, [BP+10];

MOV AX, [BP+6];считали символ

CMP AL, [SI]
JNE ENDIF1 ;если первый символ совпадает,
CALL FIRST ;то обрабатываем
ENDIF1: INC SI
DEC CX ;обработали первый эл-т
DEC CX ;чтобы обработать последний эл-т ВНЕ цикла

CMP CX, 0 ;смотрим, если в строке было ДВА эл-та
JE TwoSymbols ;то обрабатываем только первый и последний эл-ты

A10: CMP AL, [SI];
JNE ENDIF2 ;счетчик обработки
CALL MID ;средней части
ENDIF2: INC SI ;входной строки
LOOP A10 ;

TwoSymbols:CMP AL, [SI]
JNE ENDIF3 ;если последний эл-т совпадает,
CALL LAST ;то обрабатываем
ENDIF3:
MOV [DI], '\0'

POP DI
POP SI
POP CX
POP BX
POP AX
POP BP
RET
_asmproc ENDP
;----------------------------------------------------------
FIRST PROC NEAR ;процедура обработки 1-ого эл-та
ADD SI, BX
MOV AH, [SI] ;записали последний
MOV [DI], AH ;эл-т строки
INC DI
MOV SI, [BP+4]
INC SI
MOV AH, [SI] ;записали второй
MOV [DI], AH ;эл-т строки
DEC SI ;по-прежнему указывает на 1-ый эл-т
INC DI
RET
FIRST ENDP
;----------------------------------------------------------
MID PROC NEAR ;процедура обработки средней части строки
DEC SI
MOV AH, [SI] ;записали предыдущий
MOV [DI], AH ;эл-т
INC DI
ADD SI, 2
MOV AH, [SI] ;записали последующий
MOV [DI], AH ;эл-т
DEC SI ;восстановили значение SI
INC DI
RET
MID ENDP
;----------------------------------------------------------
LAST PROC NEAR ;процедура обработки последнего эл-та
DEC SI
MOV AH, [SI] ;записали предыдущий
MOV [DI], AH ;эл-т
INC DI
INC SI
SUB SI, BX
MOV AH, [SI] ;записали первый
MOV [DI], AH ;эл-т
INC DI
RET
;SI указывает на 1-ый эл-т; DI-на ячейку за последним
LAST ENDP
;-----------------------------------------------------------
END
Программа должна находить всех соседей заданного символа в исходной строке. Первый и последний элемент считаются соседями.

Я не могу скомпилировать эту программу
сначала компилю asmproc.asm (tasm.exe) и получаю asmproc.obj

потом через turboC lab3.cpp (через командную строку: cpp.exe, не получается выдает много ошибок по поводу библиотечных файлов)

прога компилится без ошибок, но при запуске выдает:
Linker Error: undefinded symbol _asmproc in modul lab3.cpp
Olen' вне форума Ответить с цитированием
Старый 18.02.2009, 17:18   #2
Olen'
 
Регистрация: 18.02.2009
Сообщений: 3
По умолчанию

если в командной строке:
bcc lab3.cpp asmproc.asm
то выдает:
Borland C++ Version 3.1 Copyright (c) 1992 Borland International
lab3.cpp:
Error lab3.cpp 1: Unable to open include file 'stdio.h'
Error lab3.cpp 2: Unable to open include file 'string.h'
Error lab3.cpp 10: Function 'printf' should have a prototype in function main()
Error lab3.cpp 11: Function 'gets' should have a prototype in function main()
Error lab3.cpp 12: Function 'strlen' should have a prototype in function main()
Error lab3.cpp 14: Function 'scanf' should have a prototype in function main()
*** 6 errors in Compile ***
asmproc.asm:
Error: Unable to execute command 'tasm.exe'
Olen' вне форума Ответить с цитированием
Старый 18.02.2009, 17:44   #3
DEADHUNT
Пользователь
 
Регистрация: 23.10.2008
Сообщений: 48
По умолчанию

Код:
#include "stdio.h"
#include "string.h"
замени на
Код:
#include <stdio.h>
#include <string.h>
на несколько ошибок будет меньше
DEADHUNT вне форума Ответить с цитированием
Старый 18.02.2009, 18:21   #4
Olen'
 
Регистрация: 18.02.2009
Сообщений: 3
По умолчанию

я нашел причну, нужно было в файлах turboc.cfg и tlink.cfg изменить адреса библиотек..
программа запустилась но есть проблема:

Цитата:
Vvedite stroku:1233
Vvedite simvol:2
Sosedi simvola:130\;;0\л"°Ґл°oл°aл°ќл° `л°њл
°Їл°Йл°«ўuивHuц^pt
Љuи8ОйҐHйzй™H°Іл°ґл°µўuи№Huиц ^ptдисJЉuиОйyH° л
°8л°0л°(ўuиЏHuѕц^ptєиЗJЉuиІМ йOH°јл°ЅўuиmHuњц^pt˜иҐJЉuикМй-H°ѕл°¶ўuиKHu6ц^pt2иѓJЉuишМйH° ¤л°¬ўuи)Huц^ptињJЉuиНйй123 3
то есть она правильно работает соседи у символа 2 - 13, но после выводит какую-то чушь..
Olen' вне форума Ответить с цитированием
Старый 19.02.2009, 19:57   #5
Ivan_32
somewhere else
Участник клуба
 
Аватар для Ivan_32
 
Регистрация: 17.07.2008
Сообщений: 1,409
По умолчанию

А про 00 -байт в конце строки часом не забыли ?
string db "hello world",0

char szStr[]="Hello world \0";
Судя по всему вы как раз забыли добавить этот символ "\0".
"Тяжело в учении, легко в бою" - А.В. Суворов
Ivan_32 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите скомпилировать ASM regfre Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 19 08.02.2009 19:26
Скомпилировать исходник Jimm'a Dr.Badnezz Свободное общение 1 23.01.2009 18:02
Невозможно скомпилировать The_Immortal Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 09.10.2008 19:03
скомпилировать проект Killbrum Общие вопросы C/C++ 5 02.09.2008 09:26
Q-схемы, помогите скомпилировать. NiganInterCOM Общие вопросы Delphi 2 04.02.2008 20:08