Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка асма в паскале, ругается паскаль на асм =) 
:(
    Опции темы
TP@MB@Y
Дата 6.5.2005, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: 2
Всего: 4



Пишу прогу в паскале, где основной код должен быть на асме. Вот столкнулся с проблемкой... (в чистом асме такой код работал)

Код

var name_for_pack:string;
....
    {Input file name to pack}
    mov ah,3fh
    mov bx,0
    mov cx,80
    mov dx,offset name_for_pack
    int 21h
    mov bx,ax
    mov [name_for_pack+bx],#0   //здесь выдает ошибку

PM   Вверх
oleg1973
Дата 6.5.2005, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 7
Всего: 34



и че пишет?


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
De Gray
Дата 6.5.2005, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 18.2.2005
Где: Регистрация?

Репутация: нет
Всего: 4



и че пишет?
Access violation -- ты из стека лезешь куда-то далеко в стек, что еще может писать.
--------------------
Извяните, шо мы к вас за поможите обращаимси.
PM MAIL   Вверх
oleg1973
Дата 6.5.2005, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 7
Всего: 34



где там стек блин?


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
De Gray
Дата 6.5.2005, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 18.2.2005
Где: Регистрация?

Репутация: нет
Всего: 4



name_for_pack по-твоему где?
--------------------
Извяните, шо мы к вас за поможите обращаимси.
PM MAIL   Вверх
TP@MB@Y
Дата 6.5.2005, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: 2
Всего: 4



Пишет: ошибка синтаксиса, а если вместо "#0" поставить "0", то пишет "invalid register combination"
PM   Вверх
oleg1973
Дата 7.5.2005, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 7
Всего: 34



De Gray
лучше промолчи если не компетентен в вопросе

TP@MB@Y
1)а зачем делать mov bx,ax ?
2) попробуй так
Код

xor bx,bx
mov si,offset name_for_pack
mov [si+ax],bl




--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Chingachguk
Дата 8.5.2005, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Если переменная с именем файла в стеке, то лучше так и писать - 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 вернется код ошибки, а не длина:

Цитата
INT 21 - DOS 2+ - "READ" - READ FROM FILE OR DEVICE
AH = 3Fh
BX = file handle
CX = number of bytes to read
DS:DX -> buffer for data
Return: CF clear if successful
    AX = number of bytes actually read (0 if at EOF before call)
CF set on error
    AX = error code (05h,06h) (see #1020 at AH=59h/BX=0000h)


Это сообщение отредактировал(а) Chingachguk - 8.5.2005, 00:20


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
TP@MB@Y
Дата 8.5.2005, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: 2
Всего: 4



oleg1973
Ваш вапиант не прошел


Chingachguk
Ваш вариант тоже не прошел


Кстати, у меня этот асемблеровский код в процедуре и переменная там же описана.
Пробовал писать этот код в "пустой" программе - работает. В чем проблема?
PM   Вверх
Chingachguk
Дата 8.5.2005, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Цитата
Chingachguk
Ваш вариант тоже не прошел


Какой вариант не прошел ???????

Если вот этот не прошел:

Цитата
mov byte ptr ss:[name_for_pack+bx],0h { здесь выдает ошибку }


То ты вообще не пытался понять, что я там писал.

А вот если такой вариант не прошел:

Цитата
mov byte ptr ds:name_for_pack[bx],0h { здесь выдает ошибку }


То это странно по меньшей мере.






--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
TP@MB@Y
Дата 8.5.2005, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: 2
Всего: 4



Цитата(Chingachguk @ 8.5.2005, 14:27)
Цитата
Chingachguk
Ваш вариант тоже не прошел


Какой вариант не прошел ???????

Извините, но я только один увидел...

Цитата
Цитата
Chingachguk
mov byte ptr ss:[name_for_pack+bx],0h { здесь выдает ошибку }


То ты вообще не пытался понять, что я там писал.


В каком смысле? Ну я понимаю что ss - это сегмент, [name_for_pack+bx] - содержимое по такомуто смещению, byte ptr - приводит указатель на слово к указателю на байт, чтобы можно было слову присвоить байтик. Что еще нужно было понять?


=)
Сам непойму в чем дело, но все заработало. Аномалия какая то!

Chingachguk'у большое спасибо! и oleg1973 тоже =)

Это сообщение отредактировал(а) TP@MB@Y - 8.5.2005, 15:16
PM   Вверх
Chingachguk
Дата 8.5.2005, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Цитата
Сам непойму в чем дело, но все заработало


Ну ты же взял пример написания асм-кода откуда-то, верно ?
Дело в том, что существет несколько форм записи команд со сложной адресацией - когда используется одновременно регистр и смещение:

mov word ptr es:[bx+di+My_Variable],0ABCDh

или:

mov word ptr es:My_Variable[bx+di],0ABCDh

Разницы никакой, но, видимо, паскаль кушает только второй вариант. Плюс конкретизация "word ptr" в некоторых ассемблерах обязательна, а вот fasm к примеру пытается сам догадаться, в чем дело.

А про "подумать" я имел в виду "проявить упорство".


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
TP@MB@Y
Дата 8.5.2005, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: 2
Всего: 4



Chingachguk
Все понял smile Если будут еще проблемы с асмом в паскале - напишу в этой теме.
PM   Вверх
TP@MB@Y
Дата 11.5.2005, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: 2
Всего: 4



Столкнулся с еще однорй проблемкой smile

Код

const name = 'd:\111.txt'+#0;

begin
 asm
  mov ah,3ch
  lea dx,name     //ERROR: Invalid symbol reference
  xor cx,cx
  int 21h
......


Как правильно указывать смещение констант?


PM   Вверх
Chingachguk
Дата 12.5.2005, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Это ты сделал не константу, а определение. Так и пиши:

const
MyString: string[16]='test.txt'+#0;
...


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
TP@MB@Y
Дата 12.5.2005, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: 2
Всего: 4



Chingachguk Спасибо! Теперь работает.

Мне уже неловко спрашивать, но я попытаюсь smile

Я из области DTA копирую имя файла в переменную:
Код

    mov ah,2fh
    int 21h
    mov cx,13
    mov si,0
    add bx,1eh
    @NAME: mov byte ptr [name_for_pack+si],es[bx+si]    //Invalid register combination
                  inc si
                  loop @NAME


Пробовал различные комбинации, все равно ругается. Что опять не так?
PM   Вверх
Chingachguk
Дата 12.5.2005, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



эээ, нельзя память-память, только если строчные операции movs.

Используй al:

mov al,es:[bx+si]
mov name[si],al
inc si
loop xxx


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
TP@MB@Y
Дата 13.5.2005, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: 2
Всего: 4



Chingachguk В который раз СПАСИБО! smile

Дописал прогу - компилиться без ошибок. Завтро тестить буду а щас спать =))
PM   Вверх
TP@MB@Y
Дата 15.5.2005, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 18.12.2004
Где: Москва

Репутация: 2
Всего: 4



Что то с файлами какая то ерунда получается... Написал для теста прогу, которая копирует один файл в другой - не пашет

Код

const name:string[9] = 'D:\1.txt'+#0;
      pack:string[9] = 'D:\p.txt'+#0;
var f_in,f_out:word;
    c:byte;
label ERR1,ERR2,ERR3,ERR4,AA;
begin
writeln('!!!!!!!!!');
asm
 mov dx,offset name
 mov ah,3dh
 mov al,0
 jc ERR1
 mov f_in,ax

 mov ah,3dh
 mov dx,offset pack
 mov al,1
 jc ERR2
 mov f_out,ax

 @L: mov bx,f_in
     mov cx,1
     mov dx,offset c
     mov ah,3fh
     int 21h
     cmp ax,0
     je @END
     jc ERR3

     mov bx,f_out
     mov cx,1
     mov dx,offset c
     mov ah,40h
     int 21h
     jc ERR4
     jmp @L

 @END: mov bx,f_in
       mov ah,3eh
       int 21h
       mov bx,f_out
       mov ah,3eh
       int 21h
end;
goto AA;
ERR1: writeln('Error1');
ERR2: writeln('Error2');
ERR3: writeln('Error3');
ERR4: writeln('Error4');
AA:
end.



Выдает четвертую ошибку. Почему? Файл существует и открыт на запись. Проверял ax = 6, т.е. "ошибочный логический номер файла". Но как так? почему тогда не выдалась ERR2?

PS токо что с ужасом осознал что у меня хард в NTFS и это может быть причиной... Или нет?

Это сообщение отредактировал(а) TP@MB@Y - 15.5.2005, 16:02
PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0913 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.