Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как вывести содержимое переменной на экран 
:(
    Опции темы
vngrdserg
Дата 17.9.2005, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если например у нас есть какая-то символьная строка :
Код

 .data                                   
  msg:
         .ascii  "My message!\n"       
         len = . - msg              

то для вывода ее на экран нужно :
1 В edx записать длину строки
2 В ecx записать адрес строки
3 В ebx записать 1
4 В eax записать 4
И дернуть int $ox80
Пусть у нас имеются 4 переменных
.data
.equ var1, 1
.equ var2, 2
.equ var3, 3
.equ var4, 4
Мы делаем какие-то телодвижения с ними .
Как в произвольный момент вывести на экран содержимое этой переменной ?


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


asm fanat
****


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

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



я так понимаю это под линюх
а что мешает использоваеть в данном случае printf ? слинковав с libc ?


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


Новичок



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

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



Цитата(oleg1973 @ 17.9.2005, 16:37)
я так понимаю это под линюх
а что мешает использоваеть в данном случае printf ? слинковав с libc ?

Вас понял
Создал файл printf_message.s :
Код

.data
msg:
 .ascii "%d\0"     

.text
   .global _start
 
 _start:
     pushl $100              /* функция printf должна распечатать число 100 */
     pushl $msg            
     call printf
     ret

Собираю его :
Код

 as printf_message.s -o printf_message.o
 ld -dynamic-linker /lib/ld-linux.so.2 -o printf_message printf_message.o -lc


Запускаю - и тут валится segmentation fault ...

PM MAIL   Вверх
adejneka
Дата 18.9.2005, 07:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Выходить из _start надо системным вызовом exit.
После вызова любой сишной функции надо удалить аргументы из стека.
Функция printf выполняет построчную буферизацию вывода. Поэтому надо либо сбросить буфер вызовом C-функции fflush, либо добавить в конец строки \n.

Код

.data
msg:
 .ascii "<%d>\0"
.text
   .global _start

_start:
        pushl   $101
        pushl   $msg
        call    printf
        addl    $8,%esp

        pushl   stdout
        call    fflush
        addl    $4,%esp

        movl    $0,%ebx
        movl    $1,%eax
        int     $0x80

PM MAIL   Вверх
vngrdserg
Дата 18.9.2005, 11:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(adejneka @ 18.9.2005, 07:29)
Выходить из _start надо системным вызовом exit.
После вызова любой сишной функции надо удалить аргументы из стека.
Функция printf выполняет построчную буферизацию вывода. Поэтому надо либо сбросить буфер вызовом C-функции fflush, либо добавить в конец строки \n.

Спасибо , заработало
Правда , я не совсем понял , зачем после каждого calll вызывать addl
Без этой команды тоже все работает
PM MAIL   Вверх
adejneka
Дата 18.9.2005, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(vngrdserg @ 18.9.2005, 11:05)
Правда , я не совсем понял , зачем после каждого calll вызывать addl

Функции в языке C могут принимать переменное число параметров, при этом нет встроенного способа узнать их число. В компиляторе GCC принято, что аргументы из стека удаляет вызывающая функция. Если у Вас вся программа помещается в одну функцию и не имеет циклов, стек можно и не очищать. Если Ваша функция вызывает сишную и пытается сделать RET - без чистки стека она вернется "в космос". Если сишная функция вызвается в цикле, стек без очистки может переполниться.
PM MAIL   Вверх
zaytsewa
Дата 23.12.2009, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



я ассемблера почти не знаю, но вот надо написать ассемблерную вставку...

вот решила попробовать простенький пример, чтобы разобраться...

Код

__asm__("push %esi");
__asm__("lea %0,%bx":"=r"(output):"b"(Buf)); //ВХ -> array
__asm__("xor %si,%si"); //SI=0
__asm__("movl %0,%cx":"=r"(output):"c"(Size)); //Счетчик повторений
__asm__("out %al,%0":"=r"(output):"c"(Size)); // вывести размер массива на печать
__asm("lea %bx,%0":"=b"(Buf)); //ВХ -> array
__asm__ ("popl %esi");


у меня в дебагере при пошаговом выполнении почему-то не выполняются почти все строчки, за исключением первой и последней))
и ещё команда out по идее должна вывести мне в стандартный вывод хоть что-нибудь... но она ничего не выводит
я понимаю, что всё в корне неправильно, наверное, но если кто-нибудь будет так любезен сделать разбор ошибок - буду очень признательна)
PM MAIL   Вверх
airyashov
Дата 23.12.2009, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



выполнится еще наверное
Код

__asm__("xor %si,%si"); //SI=0

потому что с т.з. ассемблера остальное чушь какая-то


--------------------
icq:3(один)7748666
mail:airyashov( а )inbox.ru
PM MAIL   Вверх
1IMMORTAL
  Дата 21.1.2010, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(zaytsewa @  23.12.2009,  14:21 Найти цитируемый пост)
 команда out по идее должна вывести мне в стандартный вывод хоть что-нибудь... но она ничего не выводит

Эта команда НЕ ДОЛЖНА ничего выводить на стандартный вывод.
Пожалуйста, не портите себе нервы и не ломайте мозг - почитайте справочники, учебники. Я Вам по этому вопросу уже ответил на другом сайте   smile 

Либо закажите кому-нибудь эту задачу за деньги...

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

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

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


 




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


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

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