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


Автор: TP@MB@Y 6.5.2005, 16:50
Пишу прогу в паскале, где основной код должен быть на асме. Вот столкнулся с проблемкой... (в чистом асме такой код работал)

Код

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   //здесь выдает ошибку

Автор: 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) попробуй так
Код

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


Автор: 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 вернется код ошибки, а не длина:

Цитата
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)

Автор: TP@MB@Y 8.5.2005, 14:14
oleg1973
Ваш вапиант не прошел


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


Кстати, у меня этот асемблеровский код в процедуре и переменная там же описана.
Пробовал писать этот код в "пустой" программе - работает. В чем проблема?

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


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

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

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


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

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

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


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




Автор: TP@MB@Y 8.5.2005, 15:08
Цитата(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 тоже =)

Автор: 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
Все понял smile Если будут еще проблемы с асмом в паскале - напишу в этой теме.

Автор: TP@MB@Y 11.5.2005, 17:51
Столкнулся с еще однорй проблемкой smile

Код

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

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


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


Автор: Chingachguk 12.5.2005, 09:40
Это ты сделал не константу, а определение. Так и пиши:

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

Автор: TP@MB@Y 12.5.2005, 17:07
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


Пробовал различные комбинации, все равно ругается. Что опять не так?

Автор: 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 В который раз СПАСИБО! smile

Дописал прогу - компилиться без ошибок. Завтро тестить буду а щас спать =))

Автор: TP@MB@Y 15.5.2005, 14:48
Что то с файлами какая то ерунда получается... Написал для теста прогу, которая копирует один файл в другой - не пашет

Код

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 и это может быть причиной... Или нет?

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