· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› Переименование каталога [FreeBSD][at&t]

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


Дата: Май 27, 2004 11:58:27

Приветствую господа!
Извините за простой вопрос, asm я только начинаю изучать, а в доступной линтературе ответа на свой вопрос я не получил. Итак: задача переименовать каталог.

.globl _start
_start:
pushl $test
pushl $kewl
pushl $128
pushl %eax
int $0x80
xor %eax,%eax
push $1
push %eax
int $0x80
test:
.asciz "test"
kewl:
.asciz "kewl"

Вот, этот код работает, и все переименовывается. Но по некоторым причинам я не могу использовать секцию data.

попробовал написать следующим образом:

.globl _start
_start:
xor %eax,%eax
pushl $0x6c77656b #имя каталога
pushl $0x74736574 #имя каталога
pushl $128
pushl %eax
int $0x80
xor %eax,%eax
push $1
push %eax
int $0x80
Но этот вариант не работает.
Подскажите пожалуйста где моя ошибка.
p.s. ОС FreeBSD.

Заранее спасибо за ответы.


Дата: Май 27, 2004 13:13:16

Скажу сразу: я не знаток. Соответственно, могу что-либо сказать только из общих соображений. Вот:
1) Разве после syscall-а не нужно самому очищать стек? (Хотя вообще-то в этом примере это вроде бы неважно)
2) В первом примере (который работает) передается непоказанное значение в eax, во втором же примере в _первом_ вызове eax=0 (sys_exit). Типа ошибочка..
3) Во втором примере ты передаешь в стек сам текст (имена директорий), а нужно адрес текста.

Все это большое ИМХО.


Дата: Май 27, 2004 13:52:52

looser: а нахрен тебе ядро?
Вроде бы наличие libc в любой unix системе - обязательно. Следовательно можно юзать libc функции для этого. Нахрена в кернел лезть?


Дата: Май 27, 2004 14:51:40

rst
Ну дык, елы-палы :-) Парень не на Си ж делает. Значит, хочет все сам замутить, ab initio, так сказать ;-)


Дата: Май 31, 2004 10:34:52

2 rst - Это понятно что libc есть, но ведь хочется на _настоящем_ ассемблере писать.

2 Anonimka
1. Вообще нужно, но в такой маленькой програмке это не принципиально
2. В %eax оказывается именно 128 (!). а 0 это не syscall_exit. exit это 1 :)
3. А вот как передать адрес текста я не знаю :(

Господа, если есть у кого-нить какие нибудь предположения, подскажите пожайлуста.

Заранее спасибо.


Дата: Май 31, 2004 11:13:45

Можно построить строку в стеке:
.globl _start 
_start: 
xor %eax,%eax 
pushl $0 завершающий нуль
pushl $0x6c77656b #имя каталога 
movl %esp,%ecx # сохраняем адрес строки
pushl $0
pushl $0x74736574 #имя каталога 
movl %esp,%edx
pushl %edx
pushl %ecx
pushl $128 
pushl %eax 
int $0x80 
addl $16,%esp
xor %eax,%eax 
push $1 
push %eax 
int $0x80 


Дата: Май 31, 2004 11:36:58

looser
2. В %eax оказывается именно 128 (!).
pushl $test 
pushl $kewl 
pushl $128 
pushl %eax 
int $0x80

Объясни непонятливому, где здесь в %eax передается 128. И потом, кинься линком на список syscall-ов плиз.


Дата: Июн 1, 2004 09:51:50

2 Black_mirror - Огромное тебе спасибо! Твой пример работает.
2 Anonimka - в %eax 128 не передается, оно там просто оказывается ;)
Системные вызовы:
Для FreeBSD - ftp.ioffe.rssi.ru/pub/FreeBSD/FreeBSD-current/src/sys/sys/syscall.h
Для OpenBSD - ftp.chg.ru/.7/OpenBSD/src/sys/sys/syscall.h
Для NetBSD - ftp.chg.ru/.6/NetBSD/NetBSD-current/src/sys/sys/syscall.h

Еще раз спасибо за ответы.


Дата: Июн 1, 2004 12:11:39

looser
А тебе - за ссылочки! =)


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