Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Asm: Общие вопросы > Ошибка асма в паскале |
Автор: TP@MB@Y 6.5.2005, 16:50 | ||
Пишу прогу в паскале, где основной код должен быть на асме. Вот столкнулся с проблемкой... (в чистом асме такой код работал)
|
Автор: oleg1973 6.5.2005, 17:15 |
и че пишет? |
Автор: De Gray 6.5.2005, 18:37 |
и че пишет? Access violation -- ты из стека лезешь куда-то далеко в стек, что еще может писать. |
Автор: oleg1973 6.5.2005, 18:53 |
где там стек блин? |
Автор: De Gray 6.5.2005, 19:00 |
name_for_pack по-твоему где? |
Автор: TP@MB@Y 6.5.2005, 19:42 |
Пишет: ошибка синтаксиса, а если вместо "#0" поставить "0", то пишет "invalid register combination" |
Автор: oleg1973 7.5.2005, 10:19 | ||
De Gray лучше промолчи если не компетентен в вопросе TP@MB@Y 1)а зачем делать mov bx,ax ? 2) попробуй так
|
Автор: Chingachguk 8.5.2005, 00:15 | ||
Если переменная с именем файла в стеке, то лучше так и писать - ss: mov ah,3fh mov bx,0 mov cx,80 lea dx,name_for_pack { ~ [bp+XXXX]} int 21h mov bx,ax mov byte ptr ss:[name_for_pack+bx],0h { здесь выдает ошибку } Вообще-то раз прокатила такая запись: mov dx,offset name_for_pack то скорее всего не в стеке, а сегменте данных. PS А вообще-то этот код содержит скрытую ошибку. При возврате следует проверять флаг CF командами jc/jnc, а в регистре ax вернется код ошибки, а не длина:
|
Автор: TP@MB@Y 8.5.2005, 14:14 |
oleg1973 Ваш вапиант не прошел Chingachguk Ваш вариант тоже не прошел Кстати, у меня этот асемблеровский код в процедуре и переменная там же описана. Пробовал писать этот код в "пустой" программе - работает. В чем проблема? |
Автор: Chingachguk 8.5.2005, 14:27 | ||||||
Какой вариант не прошел ??????? Если вот этот не прошел:
То ты вообще не пытался понять, что я там писал. А вот если такой вариант не прошел:
То это странно по меньшей мере. |
Автор: TP@MB@Y 8.5.2005, 15:08 | ||||||||
Извините, но я только один увидел...
В каком смысле? Ну я понимаю что ss - это сегмент, [name_for_pack+bx] - содержимое по такомуто смещению, byte ptr - приводит указатель на слово к указателю на байт, чтобы можно было слову присвоить байтик. Что еще нужно было понять? =) Сам непойму в чем дело, но все заработало. Аномалия какая то! Chingachguk'у большое спасибо! и oleg1973 тоже =) |
Автор: Chingachguk 8.5.2005, 20:16 | ||
Ну ты же взял пример написания асм-кода откуда-то, верно ? Дело в том, что существет несколько форм записи команд со сложной адресацией - когда используется одновременно регистр и смещение: mov word ptr es:[bx+di+My_Variable],0ABCDh или: mov word ptr es:My_Variable[bx+di],0ABCDh Разницы никакой, но, видимо, паскаль кушает только второй вариант. Плюс конкретизация "word ptr" в некоторых ассемблерах обязательна, а вот fasm к примеру пытается сам догадаться, в чем дело. А про "подумать" я имел в виду "проявить упорство". |
Автор: TP@MB@Y 8.5.2005, 20:30 |
Chingachguk Все понял ![]() |
Автор: TP@MB@Y 11.5.2005, 17:51 | ||
Столкнулся с еще однорй проблемкой ![]()
Как правильно указывать смещение констант? |
Автор: Chingachguk 12.5.2005, 09:40 |
Это ты сделал не константу, а определение. Так и пиши: const MyString: string[16]='test.txt'+#0; ... |
Автор: TP@MB@Y 12.5.2005, 17:07 | ||
Chingachguk Спасибо! Теперь работает. Мне уже неловко спрашивать, но я попытаюсь ![]() Я из области DTA копирую имя файла в переменную:
Пробовал различные комбинации, все равно ругается. Что опять не так? |
Автор: Chingachguk 12.5.2005, 19:14 |
эээ, нельзя память-память, только если строчные операции movs. Используй al: mov al,es:[bx+si] mov name[si],al inc si loop xxx |
Автор: TP@MB@Y 13.5.2005, 01:12 |
Chingachguk В который раз СПАСИБО! ![]() Дописал прогу - компилиться без ошибок. Завтро тестить буду а щас спать =)) |
Автор: TP@MB@Y 15.5.2005, 14:48 | ||
Что то с файлами какая то ерунда получается... Написал для теста прогу, которая копирует один файл в другой - не пашет
Выдает четвертую ошибку. Почему? Файл существует и открыт на запись. Проверял ax = 6, т.е. "ошибочный логический номер файла". Но как так? почему тогда не выдалась ERR2? PS токо что с ужасом осознал что у меня хард в NTFS и это может быть причиной... Или нет? |