Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > помогите разобраться с метками


Автор: viktorchik 26.3.2007, 11:01
Здравствуйте люди добрые! Помогите разобраться с небольшой проблеммкой и объяснить что я делаю не так  есть код на Borland Turbo C++ 3.0 со вставками ASMa, по замыслу эта программа должна  считать сумму цифр введеного пользователем числа, но при компилинге вылазиет ошибка " Undefined label 'met1'" и указатель прыгает на конец кода. Я не могу понять что ему нужно и как обозначить эту метку чтобы все работало. Всем заранее спасибо.

Код

#include <conio.h>
#include <stdio.h>
#include <iostream.h>

int x,y,z,a;

  main(){
     z=10;
     cout <<"Vvedite chislo"<<endl;
     cin >>x;

          asm {
          sub dx,dx
          mov ax,x
met1:
          div z
          mov y,ax
          cmp ax,0
          jne met1
          mov a,dx
          add a,dx
    }
  cout <<y<<"\n";
  cout <<a;
  cin>>x;
return 0;
}


Автор: Sartorius 26.3.2007, 13:02
 По моему у борланда все локальные метки с собаки должны были начинаться... Хотя не помню точно. попробуй

Автор: viktorchik 26.3.2007, 13:43
К сожелению такой вариант не подходит все равно на метку met1 ругается

Автор: sgi1981 26.3.2007, 20:59
Есть такая особенность - символы 1 и l иногда путают.

Автор: viktorchik 27.3.2007, 09:00
В том то и дело, что путаницы с символами нет! Именно возникает ошибка " Undefined label 'met1'" а не какой нить синтаксис эрор!

Автор: Kuvaldis 27.3.2007, 23:38
>> 004. BC не хочет понимать метки во встроенном ассемблере
> Q: BC не хочет понимать метки в ассемблерной вставке - компилятор сказал,
>    что не определена энта самая метка. Пришлось определить метку за
>    пределами ASM-блока. Может быть есть более корректное решение?

A: (Michael Yutsis) - 27.12.95

     Загляни в исходники RTL от BC++ 3.1 и yвидишь там нечто красивое,
например:

    #define I asm
    //........
    I   or si,si
    I   jz m1
    I   mov dx,1
    m1:
    I   int 21h

и т.д.

A: (Vadim Gaponov) - 06.01.96

     Есть - компилировать с ключом '-B' (via Tasm) aka '#pragma inline'.
Правда, при этом могут возникнуть другие проблемы: если присутствуют имена
read и _read (например), то компилятор в них запутается smile.

     BTW: Было замечено, что борланд (3.1, например) иногда генерит разный
код в зависимости от ключа -B. Как правило, при его наличии он становится
"осторожнее" - начинает понимать, что не он один использует регистры.

A: (Victor Pomortseff) - 23.02.96

     В документации по BC 3.1 я нашёл то место, где описано использование
меток в inline assembler.

Borland C++ version 3.1 Programmer's Guide.
Chapter 12. BASM and inline assembly,
Using jump instructions and labels, p.406.

You can use any of conditional and unconditional jump inctructions, plus
the loop instructions, in inline assembly. They are only valid inside a
function. Since no labels can be defined in the `asm` statements, jump
instruction must use C `goto` labels as the object of the jump. If the
label is too far away, the jump will be automatically converted to a
long-distance jump. Direct far jumps cannot be generated.

In the following code, the jump goes to the C `goto` label "a".

    int x(){
        a:      /* This is the goto label "a" */
        ...
        asm jmp a   /* Goes to label "a" */
        ...
    }

Indirect jumps are also allowed. To use an indirect jump, you can use a
register name as the operand of the jump instruction.

http://www.opennet.ru/base/faq/c_faq.txt.html

Соответственно, пример кода в сабже будет:
Код

#include <conio.h>    
#include <stdio.h>    
#include <iostream.h>

    
int x,y,z,a;    
  main(){    
     z=10;    
     cout <<"Vvedite chislo"<<endl;    
     cin >>x;
    
     _asm {
          sub dx,dx    
      mov ax,x
      }
met1:

       _asm{
      div z
          mov y,ax    
          cmp ax,0    
      jne met1
          mov a,dx    
          add a,dx    
    }    

  cout <<y<<"\n";    
  cout <<a;    
  cin>>x;    
return 0;    
}

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