Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Проблема с метками в ассембли


Автор: neutrino 8.1.2004, 00:01
Приветствую!

Давненько мне не приходилось писать на асме в cи. Но вот время настало и что-то он ругается на мои метки. Видимо я чего-то не дописываю. В книге ничего не нашел. sad.gif Вот код:

Код

char n1[10]={0,0,1,2,3,4,5,6,7,8};
char n2[10]={0,0,8,7,6,5,4,3,2,1};
char n3[10]={0};
char len=10;

void addition()
{
 asm {
     lea  si, n1+9;
     lea  di, n2+9;
     mov  cx, 10;
_add: lodsb;
     adc  al, [di];
     aaa;
     stosb;
     loop _add;
 }
}

void main()
{
 addition();
}

Автор: Tatarin 8.1.2004, 03:03
если собирать под VC++7 то тут случаются две ошибки:
1) _asm вместо asm
2) в строке
Код
adc  al, [di];

происходит ошибка
error C2432: illegal reference to 16-bit data in 'second operand'
это он ругается на di. Если поменять на edi (32-битный) то все собирается без проблем.

Автор: Custodian 8.1.2004, 09:39
Все дело в том, что по не понятным причинам, _asm{} не хочет работать с метками.
Можно немного модифицировать код, но не потерять его рабочести:

char n1[10]={0,0,1,2,3,4,5,6,7,8};
char n2[10]={0,0,8,7,6,5,4,3,2,1};
char n3[10]={0};
char len=10;

void addition()
{
_asm {
lea si, n1+9;
lea di, n2+9;
mov cx, 10;}
for(int i=10;i>0;i--)
_asm{lodsb;
adc al, [di];
aaa;
stosb;}
}

void main()
{
addition();
}

Иногда не работает int i=10; в for, можно вынести к заголовку подпрограммы.

Автор: neutrino 9.1.2004, 11:50
А чем отличается три оператора:
asm{}
_asm{}
__asm{}

? ? ?

А в вижуал с++ 6.0 есть отличия?

Автор: Guest 10.1.2004, 00:15
метки надо исключать из блоков асм т.е. писать их вне, разрывая блоки

Автор: Chingachguk 10.1.2004, 19:16
neutrino, си - это извращенный язык ;) Гораздо извращенне асма:

Цитата

void main( void )
{
  asm {
    jmp Label
  }
DataStr:
  asm {
    db 'Test','$'
  }
Label:
  asm {
  db 0xE8,0x00,0x00 // call $+3
  pop  dx // dx=offset pop dx command
  sub  dx,3+5 // sizeof(call $+3) + sizeof(DataStr)
  // against mov  dx,offset DataStr !!!
  push ds
  push cs
  pop  ds
  mov  ah,0x09
  int  0x21
  pop  ds
  }
}


Автор: neutrino 10.1.2004, 19:48
Да, блин. Вот [censored 6] фигня. Я тут запутался, глянь код. Что я не так делаю:

Код

void BigInt::Add(char *N1, char *N2, int Len)
{
_asm {
 pusha
 mov  eax, [N1]
 lea  esi, eax
 mov  eax, [N2]
 lea  edi, eax
 mov  ecx, [Len]
 clc
 cld
_add: lodsb
 adc  al, [edi]
 aaa
 stosb
 loop _add
 popa
}
}

Я хотел сложить два числа в двух строках, а он что-то не то делает. Даже не знаю что.

Автор: Chingachguk 10.1.2004, 20:23
1. Судя по всему, ты пишешь на VC. Там очень легко сделать асм-дамп (в режиме дизассемблера). Сдампь то, что делает в результате компиллятор. У меня сильное подозрение, что надо писать не mov eax,[N1] а mov eax,N1 (получить указатель из стека). Приведи его тута ;)

2. Я точно не понимаю, что за числа ты складываешь. Приведи пример аргументов и ожидаемого тобой результата ;)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)