· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.ASSEMBLER —› BC 3.1 + ASM

Посл.отвђт Сообщенiе


Дата: Мар 4, 2003 09:57:40 · Поправил: Anshik maniak

Вчера мучил си с асмом, этот паршивый ЯВУ... Часть получилось (писал сортировку сначала на АСМе) Пытался сделать вставку в си на асме. Си сказал, что мол метки не правильно заданы, или не определены. Пробовал задать "$-число". Подскажите, как эти метки с jmp реализовать?


Дата: Мар 4, 2003 10:00:45

надо задавать стандартными сишными методами, т.е. вне асмовской секции :{


Дата: Мар 4, 2003 13:34:09

Может просто нужно было начинать метки с подчёркивания. Я сомневаюсь, что компилятор не позволяет использовать метки в ассемблерной вставке.


Дата: Мар 4, 2003 16:56:09

Попробуй начинать их с собаки (@) или с двойной собаки (@@). По крайней мере, насколько я помню, в Турбо Паскале это делалось как-то так. Не исключено, что Борланд использовал похожий метод и для своих Сей.


Дата: Мар 4, 2003 18:26:39

Не используй {} для блоков ассемблерного кода. Каждую инструкцию надо пометить ключем _asm. Работает прекрасно. Пример:
// -------------------------------------------------
int CountChars (char* pstr, int chAscii)
{
int ret_code;

_asm xor dx, dx
_asm mov cx, chAscii
_asm cld
_asm lds si, pstr

NEXT:
_asm lodsb
_asm test al, al
_asm jz DONE

_asm cmp al, cl
_asm jne NEXT

_asm inc dx
_asm jmp NEXT

DONE:
_asm mov ret_code, dx

return ret_code;
}


Дата: Мар 5, 2003 09:48:21

Можно и без подчёркивания: asm inc dx


Дата: Мар 6, 2003 00:32:43

В своё время тоже намучились, благо в БГУИРе умов хватает. Вот как будет работать:

p1:
asm {
......
je p1
}

p2:
asm {
....
jmp p2
}
т.е. сами метки должны быть вынесены за вставки.
И ещё - между 'asm' и '{' вроде обязательно должен ОДИН пробел либо вообще не должно быть - уже не помню - покрути так и сяк.
Кстати, если сильно нада асм-вставки в си код - юзай консольное приложение в Visual - там блок так выглядит:
__asm {
.....
}
Никаких траблав с метками нету.


Дата: Мар 6, 2003 09:23:05

собственно что и рекомендовалось мной с самого начала.
для Borland C++ - метки вне асмовской вставки
для Borland Pascal,Delphi - метки где угодно, но они должны быть определены с помощью label
для MS VC++ - метки где угодно в коде.


Дата: Мар 6, 2003 10:01:02

Спасибо, разобрался. Всё там через пятую точку сделано, интересно при такой организации асм вообще лучше использовать?
int i,buffer_size;
char buffer[]="acadsfsjhgfiuytkjdfg";
void main()
{
buffer_size=strlen (buffer);
clrscr();
asm {
mov dx, buffer_size
lea di, buffer;
pusha;
cld;
cmp dx, 1;
jbe sort_exit;
dec dx;
}
a1:
asm{
mov cx, dx;
xor bx, bx;
mov si, di;
}
a2:
asm{
lodsb;
cmp al, byte ptr [si];
jbe no_swap;
xchg al, byte ptr [si];
mov byte ptr [si-1], al;
inc bx;
}
no_swap:
asm{
loop a2;
cmp bx, 0;
jne a1;
}

Это же изврат!


Дата: Мар 6, 2003 17:56:17

А где же POPA?
Я имею ввиду инструкцию, конечно...


Дата: Мар 7, 2003 10:05:55

Забыл наверное, но и так работает :)


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.068