Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: Linux
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/28: Рейтинг темы: голосов - 28, средняя оценка - 4.82
esnalver
0 / 0 / 0
Регистрация: 04.11.2011
Сообщений: 2
1

[NASM] Вывод на экран

08.11.2011, 02:04. Просмотров 5395. Ответов 4
Метки нет (Все метки)

здравствуйте читающие эту тему.
Решил приступить к изучению Ассемблера, документации нашел кучу, но не вся она хороша в плане учебной, и тем более совсем уж узко сведена к DOS и Windows использованию. Этап Hello world был пройден, благо по нему найти код не составит труда на любом языке даже машинном, но вот дальше возникли уже проблемы. Следующим этапом стала задача вывода числа (или просто любого другого символа, строки) на экран. ДА есть примеры, но в них трудно разобраться что к чему, да и писаны все в основном под DOS, а у меня Linux и NASM. долгими мучениями пришел к такому варианту, но не работающему...

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
_start:;Начало программы
    add eax,'p' ; положили символ (его бинарный код) в регистр
    push eax ;  записали в стек, для того что бы потом передать ссылку на стек в функцию
 
    mov eax,4 ;вызов функции ssize_t write(int fd, const void *buf, size_t count)
    mov ebx,1 ;int fd - стандартный поток вывода
    mov edx,esp;const void *buf - ссылка на строку
    mov edx,1;size_t count - сколько символов в строке
 
    int 0x80; прерывание и ниже вызов функции завершения программы
    mov eax,1
    xor ebx,ebx
    int 0x80
программа конечно ничего не выводит, только мне не понятно почему... вроде бы ESP это ссылка на стек, в котором хранится значение (проверил дебагером оно изменилось когда в него положил EAX) и должно было вывести, но не тут то было.

Хочу узнать почему ничего не выводится? (может в синтаксисе что то не дописал)

Как все же в ассемблере работать с данными (числами хотя бы), для них нужно объявлять стороннюю переменную?

желательно расписать подробно.

П.С. к сожалению знакомых знающих или хотя бы изучающих ассемблер нет, и где сейчас живу нет даже высшего учебного заведения, так что уровень знаний здешних людей не велик...
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2011, 02:04
Ответы с готовыми решениями:

[nasm] Вывод на экран числа с вершины стека FPU в научном формате
Написать программу, которая берет число с плавающей запятой с вершины стека...

[NASM] Ввод символа с клавиатуры, вывод на экран символа и его кода в десятичной записи
Доброе время суток. Нужно написать программу на ассемблере, которая...

[NASM] Вывод значения регистра
GNU nano 2.2.6 Файл: asmlab_1_4.asm ...

[NASM] Ввод 2-х чисел, их сложение, умножение и их вывод
Сразу говорю гуглил- не нашел. Нужна прога (пример для меня) Ввод 2-х чисел,...

[NASM] Вывод звука при помощи escape последовательности
Доброго времени суток! Пишу проигрыватель для азбуки морзе на ассемблере (nasm...

4
vital792
2002 / 1274 / 60
Регистрация: 05.06.2010
Сообщений: 2,213
08.11.2011, 09:50 2
Первая программа
1
esnalver
0 / 0 / 0
Регистрация: 04.11.2011
Сообщений: 2
09.11.2011, 05:00 3
все, поковырялся в коде и понял как это должно было быть.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
section .text
global _start
_start:                         ;Начало программы
    mov edi,_str        ; определяем EDI массивом данных типа _str (EDI _str[])
    mov eax,'w'         ; символ который мы хотим вывести
    
    push edi             ; записываем массив в стек
        stosb                  ; записываем в массив EDI который находится в стеке значение EAX и сдвигаем курсор(EDI[i]=EAX , i++) 
    mov al,0xa         ;'0' ,код конца строки (в С известен как '\n')
    stosb                  ; записываем в массив EDI который находится в стеке значение EAX и сдвигаем курсор(EDI[i]=EAX , i++) 
    pop edi               ;возвращаем в EDI наш массив
    
    xor edx, edx       ; обнуляем edx
    add edx,2           ;увеличиваем его на 2 так как у нас в EDI 2 символа 'w' и символ конца строки '0'
    
    
    mov eax,4
    mov ebx,1
    mov ecx,edi
    int 0x80
 
    mov eax,1
    xor ebx,ebx
    int 0x80
 
section .data
_str db 0
вот такая простая программа получилась в итоге, надеюсь кому то она пригодится.
0
r36
236 / 233 / 42
Регистрация: 16.03.2011
Сообщений: 750
09.11.2011, 10:26 4
Вот книгу загрузил там по nasm, с тебя плюс))
Кстати прекрасно понимаю тебя я тоже с села, книг не реально купить, только в интернете заказать.
2
Вложения
Тип файла: pdf assembler_na_primeraxbazovyy_kurs_rudolf_marek.pdf (1.88 Мб, 626 просмотров)
Mikl___
Автор FAQ
11987 / 6254 / 596
Регистрация: 11.11.2010
Сообщений: 11,316
09.11.2011, 11:02 5
esnalver, по поводу ассемблера в Linux/UNIX
1. номера системных вызовов для прерывания int 80h для LINUX http://int80h.org/ - FreeBSD Assembly Language Tutorial
2. Примеры в архиве unixwasmfaq.zip
3. Очень полезный линк по теме http://asm.sourceforge.net//resources.html
4. Программирование на ассемблере под Unix и родственные системы -- ссылка на форум WASM.RU раздел UNIX
5. ссылка на форум vingrad.ru раздел Asm для Linux/Unix
PS для модераторов прямой ссылки нет -- нарушения тоже нет
1
Вложения
Тип файла: zip unixwasmfaq.zip (4.2 Кб, 91 просмотров)
09.11.2011, 11:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2011, 11:02

Nasm и gdb
Помогите с проблемкой. Вот простая программа: global _start section .text...

[Nasm] Вызов printf
Добрый вечер. extern printf ; the C function, to be called ...

Многопоточное приложение на Nasm
Необходимо создать серверное приложение, которое время от времени придется...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru