Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перевод кода с Delphi на АСМ 
:(
    Опции темы
kostik_16
  Дата 8.1.2004, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Помогите перевести строки на АСМ:
Цитата

    assignFile(f,FileName);
    rewrite(f);
    writeln(f,':1');
    writeln(f,format('Erase "%s"',[paramstr(0)]));
    writeln(f,format('If exist "%s" Goto 1',[paramstr(0)]));
    writeln(f,format('Erase "%s"',[FileName]));
    closefile(f);

PM MAIL   Вверх
December
Дата 8.1.2004, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


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

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



kostik_16 Дык скомпилируй и отдизассембль!



--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
Guest
Дата 8.1.2004, 01:11 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Hy... для начала там наверное опечатачка появилась, что-то типа "1:" должно быть...
как понимаю - создание bat файла для удаления программы smile.gif))

Ну а на асме все будет примерно так...

.data
filename db 'Тут путь файла для записи',0
fileexe db 'А суда можно запихнуть имя этого файла'
line1 db '1:'
line2 db 'Erase '
line3 db 'If exist '
line4 db 'Goto 1'
line5 db 0dh,0ah
.code
mov ax,@data
mov ds,ax
xor ax,ax

mov ah,5bh
mov cx,0 ;Тут атрибуты файла можно указать
mov dx,offset filename
int 21h
;тут надо проверку на CF если 1 то ошибка, если 0 то в AX спецификатор файла для простоты и понятности кода опускаю
mov bx,ax
mov ah,40h
mov cx,line2
sub cx,line1
mov dx,offset line1
int 21h ;1:

mov ah,40h
mov cx,line3
sub cx,line2
mov dx,offset line2
int 21h ;Erase

mov ah,40h
mov cx,line1
sub cx,fileexe
mov dx,offset fileexe
int 21h ;paramstr(0) -> %s

mov ah,40h
mov cx,line4
sub cx,line3
mov dx,offset line3
int 21h ;if exist

mov ah,40h
mov cx,line1
sub cx,fileexe
mov dx,offset fileexe
int 21h ;paramstr(0) -> %s

mov ah,40h
mov cx,line5
sub cx,line4
mov dx,offset line4
int 21h ;Goto 1

mov ah,40h
mov cx,line3
sub cx,line2
mov dx,offset line2
int 21h ;Erase

mov ah,40h
mov cx,fileexe
sub cx,filename
sub cx,1 ;Вычесть 0 символ
mov dx,offset filename
int 21h ;[filepath] -> %s

mov ah,3eh
int 21h ;closefile();

;Конечно лучше после каждого прерывания сделать проверку на CF если там 1 значит произошла ошибка.
;И ещё, тут в одной версии доса, после записи в файл он переносит курсор на слудующую строку, а в некоторых нет. Если переносить не будет, то нужно после каждой записи вставить следующее:

mov ah,40h
mov cx,2
mov dx,offset line5
int 21h

Не говорю, что это оптимальный вариант, можно даже сказать, что это решение в лоб. Но работать должно!
  Вверх
kostik_16
Дата 8.1.2004, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Даааа...

Может как-то попробывать через API?confused.gif??
PM MAIL   Вверх
Custodian
Дата 8.1.2004, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Товаришъ Unregistered в принципе прав, номогу предложить некоторое улудшение программы для более изящного чтения...

model small
.stack 100h
.data
filename db 'e:\start.bat',0
fileexe db 'e:\start.exe'
line1 db '1:'
line2 db 'Erase '
line3 db 'If exist '
line4 db ' Goto 1'
line5 db 0dh,0ah
.code
jmp start

nextline proc
mov ah,40h
mov cx,2
mov dx,offset line5
int 21h
ret
nextline endp

filewrite macro reg1,reg2
mov ah,40h
mov cx,offset reg2
sub cx,offset reg1
mov dx,offset reg1
int 21h
endm
start:
mov ax,@data
mov ds,ax
xor ax,ax

mov ah,5bh
mov cx,0 ;Тут атрибуты файла можно указать
mov dx,offset filename
int 21h

mov bx,ax
filewrite line1,line2 ;1:
call nextline
filewrite line2,line3 ;Erase
filewrite fileexe,line1 ;paramstr(0) -> %s
call nextline
filewrite line3,line4 ;if exist
filewrite fileexe,line1 ;paramstr(0) -> %s
filewrite line4,line5 ;Goto 1
call nextline
filewrite line2,line3 ;Erase

mov ah,40h
mov cx,offset fileexe
sub cx,offset filename
sub cx,1 ;Вычесть 0 символ
mov dx,offset filename
int 21h ;[filepath] -> %s

mov ah,3eh
int 21h ;closefile();

mov ax,4c00h
int 21h
end start

Это готовый пример для простой записи в файл Ж)
PM MAIL WWW   Вверх
kostik_16
  Дата 8.1.2004, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Чет тут неправильно:

mov ax, @_delta ; -> [Error] Kvalifa.pas(2138): Operand size mismatch
mov ds,ax
xor ax,ax

mov ah,5bh
mov cx,0
mov dx, offset [ebp + @filename] ; -> [Error] Kvalifa.pas(2144): Operand size mismatch
int 21h

Я просто вставляю этот код в Delphi.

Что надо изменить, что-бы оно работало?
PM MAIL   Вверх
kostik_16
Дата 8.1.2004, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я попробывал сделать так:

Цитата

  mov ax, word ptr @_delta
  mov ds,ax
  xor ax,ax

  mov ah,5bh
  mov cx,0
  mov dx, word ptr offset [ebp + @filename]
  int 21h


оно ошибок не выдает, только не работаетconfused.gif
PM MAIL   Вверх
Chingachguk
Дата 8.1.2004, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Ха. Все примеры на асме относятся к дос. А под винд все это рухнет. Хотя ты пишешь, что "не работает"... Надо апи звать - сам же написал...


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


Бывалый
*


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

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



Че без API не разабраться?
PM MAIL   Вверх
Chingachguk
Дата 8.1.2004, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Типа того. Это так же халявно, как и под дос. int 21h, 40h -> WriteFile, etc


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


Бывалый
*


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

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



Какие функции мне потребуються для:

Цитата

  assignFile(f,FileName);
    rewrite(f);
    writeln(f,'Мой текст');
  closefile(f);

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


Эксперт
***


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

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



CreateFile, WriteFile, CloseHandle.


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


Шустрый
*


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

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



kostik_16
Накатал на скорую руку, код получился жутко неоптимизированный, но должен работать wink.gif
Код

     .386
     .model flat, stdcall
     option casemap :none

     include \masm32\include\windows.inc
     include \masm32\include\user32.inc
     include \masm32\include\kernel32.inc

     includelib \masm32\lib\user32.lib
     includelib \masm32\lib\kernel32.lib

.data
buff db 1000 dup(0)
temp db 300 dup(0)
param0 db 260 dup(0)
szFileName db "somefile.txt",0
sz1 db ":1",0
sz2 db "Erase ",22h,"%s",22h,0
sz3 db "If exist ",22h,"%s",22h,0
szEnter db 0Dh,0Ah,0

.data?
hFile HANDLE ?
wb DWORD ?

.code
start:
; create file
invoke CreateFile,OFFSET szFileName,GENERIC_WRITE,\
FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL
cmp eax,-1
je @@exitnow
mov hFile,eax

; get paramstr(0)
invoke GetModuleFileName,NULL,OFFSET param0,260

; writeln(f,':1');
invoke lstrcat,OFFSET buff,OFFSET sz1
invoke lstrcat,OFFSET buff,OFFSET szEnter

; writeln(f,format('Erase "%s"',[paramstr(0)]));
invoke wsprintf,OFFSET temp,OFFSET sz2,OFFSET param0
invoke lstrcat,OFFSET buff,OFFSET temp
invoke lstrcat,OFFSET buff,OFFSET szEnter

; writeln(f,format('If exist "%s" Goto 1',[paramstr(0)]));
invoke wsprintf,OFFSET temp,OFFSET sz3,OFFSET param0
invoke lstrcat,OFFSET buff,OFFSET temp
invoke lstrcat,OFFSET buff,OFFSET szEnter

; writeln(f,format('Erase "%s"',[FileName]));
invoke wsprintf,OFFSET temp,OFFSET sz2,OFFSET szFileName
invoke lstrcat,OFFSET buff,OFFSET temp
invoke lstrcat,OFFSET buff,OFFSET szEnter

; write file
invoke lstrlen,OFFSET buff
invoke WriteFile,hFile,OFFSET buff,eax,OFFSET wb,NULL
invoke CloseHandle,hFile

@@exitnow:
invoke ExitProcess,0
end start


Это сообщение отредактировал(а) Gloomy - 9.1.2004, 00:11
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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