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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.02.2010, 21:59   #1
ShlakBaum
Новичок
Джуниор
 
Регистрация: 01.02.2010
Сообщений: 2
По умолчанию Проблема при передаче через Com-порт

Пишу программу, которая стартует при загрузке BIOS (ROM), производит вычисления и выдает результат в com-порт. Основной код написан на c++. Его я присоединяю к коду на ассемблере:
Код:
CODESG SEGMENT PARA 'Code'
ASSUME CS:CODESG,DS:CODESG,SS:CODESG,ES:CODESG
org 100h

mybegin: 
db 055h, 0AAh ; Сигнатура
db 0ch ; размер блока в 200h байтовых секторах
; данный размер надо потом переправить
JMP start

extrn _main : near ; Эта процедура ноходиться в Си.

start PROC NEAR

call _main ; вызываем коод программы
ret ; возвращаем управление в биос

start endp ; конец процедуры
ends CODESG ; конец сегмента
end mybegin ; конец программы
Код С-программы:
Код:
// считывает байт из порта и возвращает его
{
unsigned char mych;
asm
{
mov ax,040h
mov es,ax
mov dx,es:[000h]


add dx,3
mov al,080h
out dx,al


sub dx,3
mov al,1
out dx,al


add dx,3
mov al,3
out dx,al


sub dx,2
mov al,3
out dx,al

mov dx,es:[000h]
add dx,5
t1:
in al,dx
test al,01h
jz t1
sub dx,5
in al,dx
mov mych,al
}
return mych;
}

void comout(unsigned char outkod)
// пишет байт outch в порт
{
asm
{
mov ax,040h
mov es,ax
mov dx,es:[000h]


add dx,3
mov al,080h
out dx,al


sub dx,3
mov al,1
out dx,al


add dx,3
mov al,3
out dx,al


sub dx,2
mov al,3
out dx,al

mov ah,41h
mov dx,es:[000h]
add dx,5

m1:
in al,dx
test al,040h
jz m1
mov dx,es:[000h]
mov al,outkod
out dx,al
}
return;
}

void mysendflash(unsigned long fd)
//отсылает команду 0х12, затем ждет квитанцию на нее.
//если пришла квитанция 0х31 шлем 4 байта имитозащиты
//начиная с младшего, при этом на каждый байт считывает
//квитанцию. Если вместо квитанции пришла команда 0х33
//шлет байты имитозащиты заново.
{
unsigned long fd_ch_sum=0L;
fd_ch_sum = fd;
unsigned char ret=0x0;
comout(0x12);
ret=comin();
if (ret==0x31)
while (ret!=0x0)
{
unsigned char *c;
c=(unsigned char*)&fd;
comout(*c);
ret=comin();
if (ret==0x31) {c++;comout(*c);ret=comin();}
if (ret==0x31) {c++;comout(*c);ret=comin();}
if (ret==0x31) {c++;comout(*c);ret=comin();}
if (ret==0x31) ret=0x0;
}
return;
}

void givekey(char *hkey)
//принимает 32 байта ключа.
//считывает байты ключа, и на каждый
//передает квитанцию. Если будет передан байт
//0х33 начинает принимать ключ заново с первого байта.
{
int sch=0;
while (sch<32)
{
hkey[sch]=0x0;
hkey[sch]=comin();
comout(0x31);
sch++;
if (hkey[sch-1]==0x33) sch=0;
}
return;
}

void main(void)
{
unsigned long flash_ctrl_sum=0L;

//режим
int myreg=0; 

char Key[32];

//comin(); // считывает байт из порта и возвращает его
//comout(outch); // пишет байт outch в порт

unsigned char inch=0x00;

//передаем команду готовности пока не примем квитанцию о принятии
while (inch!=0x31)
{
comout(0x11); // передаем команду готовности
inch=comin(); // ждем квитанцию
}

//бесконечный цикл
while (1==1)
{
inch=comin();

if (inch==0x22)
{myreg=1;comout(0x31);} //устанавливаем 1 режим и шлем квитанцию на команду

if (inch==0x23) 
{myreg=2;comout(0x31);} //устанавливаем 2 режим и шлем квитанцию на команду

if (inch==0x24)
{myreg=3;comout(0x31);} //устанавливаем 3 режим и шлем квитанцию на команду

if (inch==0x21) // приняли команду "Ключ"
{
comout(0x31); //передаем квитанцию на команду 0х21
givekey(Key); //принимаем 32 байта ключа

Gost(Key);

if (myreg==1)
{
getmemflash(0x0L,0x1FFFFFFL);
flash_ctrl_sum=GIZ(1);
//отсылаем
mysendflash(flash_ctrl_sum);
myreg=0;
}
}

}// while (1==1)
return ;
}// void main(void)
С ком-порта считываю другим компом. При передаче команда из данной программы (типа comout(0x31) все нормально иногда, иногда приходит хз что, типа 0ССh. А если после заполнения массива Key я пытаюсь посмотреть что получилось, вставляя код:
Код:
for (int i=0; i<32; i++)
comout(Key[i]);
то на другой стороне получаю нули, и в них еще парочку байт 0С0h. Где и что я сделал не так?
ShlakBaum вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Управление ШД через LPT - порт remz Общие вопросы Delphi 17 06.10.2010 22:39
Виснет машина при передаче файла через сокет SlashMan Работа с сетью в Delphi 2 19.07.2009 23:50
Проблема найти путь к винде при запуске программы через удаленный рабочий стол grenles Общие вопросы Delphi 4 12.04.2009 23:29
отделение строк при передаче в serversocket... prizrak1390 Общие вопросы Delphi 14 29.06.2008 21:13