|
|
| Посл.отвђт | Сообщен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 |