Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для Linux/Unix > Как вывести содержимое переменной на экран


Автор: vngrdserg 17.9.2005, 11:28
Если например у нас есть какая-то символьная строка :
Код

 .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
Мы делаем какие-то телодвижения с ними .
Как в произвольный момент вывести на экран содержимое этой переменной ?


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

Автор: vngrdserg 17.9.2005, 19:43
Цитата(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 ...

Автор: adejneka 18.9.2005, 07:29
Выходить из _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

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

Спасибо , заработало
Правда , я не совсем понял , зачем после каждого calll вызывать addl
Без этой команды тоже все работает

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

Функции в языке C могут принимать переменное число параметров, при этом нет встроенного способа узнать их число. В компиляторе GCC принято, что аргументы из стека удаляет вызывающая функция. Если у Вас вся программа помещается в одну функцию и не имеет циклов, стек можно и не очищать. Если Ваша функция вызывает сишную и пытается сделать RET - без чистки стека она вернется "в космос". Если сишная функция вызвается в цикле, стек без очистки может переполниться.

Автор: zaytsewa 23.12.2009, 14:21
я ассемблера почти не знаю, но вот надо написать ассемблерную вставку...

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

Код

__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 по идее должна вывести мне в стандартный вывод хоть что-нибудь... но она ничего не выводит
я понимаю, что всё в корне неправильно, наверное, но если кто-нибудь будет так любезен сделать разбор ошибок - буду очень признательна)

Автор: airyashov 23.12.2009, 20:33
выполнится еще наверное
Код

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

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

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

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

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

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