Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Замена строчных букв на прописные, nasm 
:(
    Опции темы
Enchance
Дата 22.2.2011, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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

global _start
 
 _start:
 
 mov eax, 3            ;Вызов #3 (read)
 mov ebx, 2            ;Дескриптор stdin
 mov ecx, buffer        ;Адрес буфера для хранения введенных данных
 mov edx, 10            ;Максимальная длина ввода
 int 0x80            ;Прерывание - системный вызов
 
 mov eax, 4            ;Вызов #4 (write)
 mov ebx, 1            ;Дескриптор stdout
 
                ;Системный вызов не изменил содержимое регистров ECX и EDX
                ; поэтому следующие две строчки не нужны
                ;mov ecx, buffer;Адрес строки для вывода
                ;mov edx, 10    ;Длина выводимых данных
 
 int 0x80            ;Системный вызов
 
 xor eax, eax            ;Обнуление регистра EAX
 inc eax            ;Инкремент - увеличение на единицу
 int 0x80            ;Системный вызов
 
 section .data            ;Начало сегмента данных
 buffer: resb 10


Нужно модифицировать ее так, чтобы все прописные буквы преобразовывались в строчные. Насколько я понял, нужно проверить каждый вводимый символ, является ли он строчным, и если да, то от его кода нужно отнять 20h. 
Скажите пожалуйста, как это реализовать? Я пока знаю только основы основ.
PM MAIL   Вверх
Enchance
Дата 22.2.2011, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



И еще, вдогонку.
В даной программе я использовал такие вещи, как:

mov eax, 3            ;Вызов #3 (read)
(...)
mov eax, 4            ;Вызов #4 (write)
(...)

А где можно почитать о всех системных вызовах Linux? В гугле искал, не нашел.
PM MAIL   Вверх
500mhz
Дата 22.2.2011, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

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



а если там будет вместо букофки цыферка и ты от нее 0x20 отнимеш то чо будет? )

а по теме 2 варианта вижу
1) проверять буфер ввода  buffer: resb 10 на предмет не "букавок" и уже потом отнимать 0x20
2) подключить libc )))


--------------------

PM MAIL ICQ   Вверх
Enchance
Дата 22.2.2011, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ну по таблице ASCII маленькие буковки начинаются с 61h, и заканчиваются 7Ah.
То есть проверить, вписывается ли код символа в даные границы, и если да - то отнимаем от кода символа 20h.

Но вот как создать программу на асме - я хз. Причем подключать дополнительные библиотеки запрещено.
PM MAIL   Вверх
500mhz
  Дата 22.2.2011, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

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




после вызова read , eax возвратит колво принятых в буфер сиволов

значит со строки 10 было бы не плоха написать
test eax,eax
jz строка 5
mov esi,buffer
mov ecx,eax
.xlp:
cmp [esi],byte 0x61
jge .blabla
.nax:
inc esi
loop .xlp
jmp .gogogo
.blabla:
cmp [esi],byte 0x7a
jg .nax
sub [esi],byte 0x20
jmp .nax

.gogogo:
ну и тут остаток кода с выводом на экран


--------------------

PM MAIL ICQ   Вверх
Enchance
Дата 22.2.2011, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Компилится норм.

Компоновщик ругается:
Код

ld: warning: cannot find entry symbol _start; not setting start address


Исполняемый файл создается, но не запускается.
Код

bash: /home/snow/asm/pr2: не удалось выполнить бинарный файл


Как узнать, в чем проблема?

Это сообщение отредактировал(а) Enchance - 22.2.2011, 18:16
PM MAIL   Вверх
500mhz
Дата 22.2.2011, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

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



ты в свой исходник вставь то что я написал

Добавлено через 7 минут и 57 секунд
Код

format ELF executable 3
entry start

segment readable executable
start:

        mov eax, 3
        mov ebx, 2
        mov ecx, buffer
        mov edx, 10
        int 0x80
        test eax,eax
        jz start
        mov esi,buffer
        mov ecx,eax
.xlp:
        cmp [esi],byte 0x61
        jge .blabla
.nax:
        inc esi
        loop .xlp
        jmp .gogogo
.blabla:
        cmp [esi],byte 0x7a
        jg .nax
        sub [esi],byte 0x20
        jmp .nax
.gogogo:
        mov eax, 4
        mov ebx, 1
        mov ecx, buffer
        mov edx, 10
        int 0x80
        xor eax, eax
        inc eax
        int 0x80

segment readable writeable
buffer:
        times 10 db ?



все компилиться , попробуй fasm
а запустить мне негде, нет линюха под рукой

Добавлено через 9 минут и 57 секунд
скомпиленый бинарник

Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  as 0,19 Kb


--------------------

PM MAIL ICQ   Вверх
Enchance
Дата 22.2.2011, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



fasm не вариант, нужен именно nasm.

Сорри, я не совсем то компилировал. Итак, я вставил кусок кода от 500mhz, заменил только "jz строка 5" на "jz _start" в строке 12. Компилю:

Код

snow@snowmachine:~/asm$ nasm -felf pr2.asm -o pr2.o
pr2.asm:46: warning: uninitialized space declared in non-BSS section `.data': zeroing

snow@snowmachine:~/asm$ ld pr2.o -o pr2
ld: warning: cannot find entry symbol _start; defaulting to 0000000008048080

snow@snowmachine:~/asm$ /home/snow/asm/pr2
hhhHHhhHHhh


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

Вот совмещенный асм-код:
Код

global _start
 
 _start:
 
 mov eax, 3            ;Вызов #3 (read)
 mov ebx, 2            ;Дескриптор stdin
 mov ecx, buffer        ;Адрес буфера для хранения введенных данных
 mov edx, 10            ;Максимальная длина ввода
 int 0x80            ;Прерывание - системный вызов
 
test eax,eax
jz _start
mov esi,buffer
mov ecx,eax
.xlp:
cmp [esi],byte 0x61
jge .blabla
.nax:
inc esi
loop .xlp
jmp .gogogo
.blabla:
cmp [esi],byte 0x7a
jg .nax
sub [esi],byte 0x20
jmp .nax

.gogogo:

 mov eax, 4            ;Вызов #4 (write)
 mov ebx, 1            ;Дескриптор stdout
 
                ;Системный вызов не изменил содержимое регистров ECX и EDX
                ; поэтому следующие две строчки не нужны
                ;mov ecx, buffer;Адрес строки для вывода
                ;mov edx, 10    ;Длина выводимых данных
 
 int 0x80            ;Системный вызов
 
 xor eax, eax            ;Обнуление регистра EAX
 inc eax            ;Инкремент - увеличение на единицу
                ;mov ebx, 1
 int 0x80            ;Системный вызов
 
 section .data            ;Начало сегмента данных
 buffer: resb 10

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


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

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



я не знаю как и что вы там запускаете, вот что у меня (в линюхе естественно)

Цитата

[oleg@hexdump Downloads]$ ./as
aaaAAA
AAAAAA



наблюдаем перевод букавок из lowercase  в UPPERCASE


--------------------

PM MAIL ICQ   Вверх
Enchance
Дата 23.2.2011, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Это уже становится несмешно...

Скачал скомпилированый бинарник - результат тот же! Ввожу буквы из клавиатуры, вижу их в консоли, но НИЧЕГО НЕ ПРЕОБРАЗОВЫВАЕТСЯ! 
PM MAIL   Вверх
500mhz
Дата 23.2.2011, 01:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

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



немнога оффтоп )))

пробую с nasm , но так как к меня 64bit linux то ld ругаеться на 32bit obj , какие у ld параметры чтоб он понял что имеем дело с 32?


--------------------

PM MAIL ICQ   Вверх
Enchance
Дата 24.2.2011, 03:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Какие команды я писал, и какие ошибки выдавались - я уже описал на пару сообщений выше. Если есть еще какие-то параметры - то как их узнать?
PM MAIL   Вверх
500mhz
Дата 24.2.2011, 03:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

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





--------------------

PM MAIL ICQ   Вверх
maxlee
Дата 17.3.2011, 03:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот код  проги провереной  на  NASM

Ошибка была в  11 строке. ты писал  jz _start а  надо было  jz .blabla 
Код

global _start
 
 _start:
 
 mov eax, 3            ;Вызов #3 (read)
 mov ebx, 2            ;Дескриптор stdin
 mov ecx, buffer        ;Адрес буфера для хранения введенных данных
 mov edx, 10            ;Максимальная длина ввода
 int 0x80            ;Прерывание - системный вызов
 test eax,eax
jz .blabla 
mov esi,buffer
mov ecx,eax
.xlp:
cmp [esi],byte 0x61
jge .blabla
.nax:
inc esi
loop .xlp
jmp .gogogo
.blabla:
cmp [esi],byte 0x7a
jg .nax
sub [esi],byte 0x20
jmp .nax

.gogogo:
 mov eax, 4            ;Вызов #4 (write)
 mov ebx, 1            ;Дескриптор stdout
 mov ecx, buffer
 mov edx, 10
 
                ;Системный вызов не изменил содержимое регистров ECX и EDX
                ; поэтому следующие две строчки не нужны
                ;mov ecx, buffer;Адрес строки для вывода
                ;mov edx, 10    ;Длина выводимых данных
 
 int 0x80            ;Системный вызов
 
 xor eax, eax            ;Обнуление регистра EAX
 inc eax            ;Инкремент - увеличение на единицу
 int 0x80            ;Системный вызов
 
 section .data            ;Начало сегмента данных
 buffer: resb 10

PM MAIL   Вверх
maxlee
Дата 17.3.2011, 03:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



напишите плиз каменты к этим строкам , а то я полный НОЛЬ в  ассемлере

Код

test eax,eax
jz .blablabla
mov esi,buffer
mov ecx,eax
.xlp:
cmp [esi],byte 0x61
jge .blabla
.nax:
inc esi
loop .xlp
jmp .gogogo
.blabla:
cmp [esi],byte 0x7a
jg .nax
sub [esi],byte 0x20
jmp .nax

.gogogo:

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

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

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


 




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


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

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