Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Простенькая программка( помогите найти ошибку ) 
V
    Опции темы
GLeBaTi
Дата 8.5.2010, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 1.2.2008
Где: г.Чебоксары

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



Код

org 0x100
SEGMENT .CODE
    mov ah,0x9
    mov dx, Msg1
    int 0x21
    
    ;string input
    mov ah,0xA
    mov dx,buff
    int 0x21

    mov ax,0
    mov al,[buff+1]; длина
    
    ;string UPPERCASE    
    mov cl, al ; кол-во повторений
    mov si, buff
    cld
loop1:
    lodsb;
    cmp al, 'a' ;если находим маленькую букву, то jnb upper (поиск идет по символу ansii)
    jnb upper

loop loop1

;вывод результатов
mov ah,0x9
mov dx, buff
int 0x21
    
exit:
    mov ah, 0x8
    int 0x21
    int 0x20

upper:
    sub al,32 ;изменяем код символа (+32 - т.е. через 32 позиции, находится буква в верхнем регистре. Можете посмотреть таблицу символов)
    jmp loop1

SEGMENT .DATA
Msg1 db 'Press string: $'
buff db 254,0


написал под nasm, но криво работает(точнее не правильно работает).
Я думаю проблема в jnb upper.
Программа переделывает маленькие буквы в строке к верхнему регистру.
PM MAIL   Вверх
iff
Дата 9.5.2010, 12:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


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

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



Код

SEGMENT .CODE
mov ax, @data ;* Инициализация регистра, необходима для программы типа exe
mov ds, ax ;*

    mov ah,0x9
    lea dx, Msg1 ;*
    int 0x21
    
    ;string input
    mov ah,0xA
    lea dx,buff ;*
    int 0x21
    mov cl,[buff+1]; длина
    
    ;string UPPERCASE    
    lea di, buff+2 ;*
loop1:
    cmp byte ptr [di], 'a' ;*
    jb cont1 ;*
    cmp byte ptr [di], 'z' ;*
    ja cont1 ;*
    and byte ptr [di], 11011111b ;*
cont1: inc di ;*
loop loop1

inc di ;*
mov word ptr [di], 0x240a ;* Для функции 09h прерывания int 21h: перевод строки, символ $

;вывод результатов
mov word ptr buff, 0x0a0d ;* перевод строки
mov ah,0x9
lea dx, buff ;*
int 0x21
    
exit:
    mov ah, 0x8
    int 0x21
mov ax, 0x4c00 ;* В программе типа exe регистр cs не указывет на psp, поэтому прерывание 0x20 использовать проблематично
int 0x21 ;*

SEGMENT .DATA
Msg1 db 'Press string: $'
buff db 254, ? ;*

Около тех строк, что я изменил я поставил примечание со знаком *. НО!!! Я ещё никогда не писал под nasm, только под tasm, поэтому могут быть ошибки

Это сообщение отредактировал(а) iff - 9.5.2010, 16:19


--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
iff
Дата 9.5.2010, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


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

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



Кстате, получается некоторая неувязочка:
1) ты начинаешь программу с директивы org 0x100, как будто это программа типа COM, но в тоже время программа имеет 2 сегмента (код и данные), что возможно только в программе типа EXE.
2)Если это программа типа EXE, то тогда надо бы ещё определить сегмент стека, ведь его (стек) используют прерывания.
3) В программе типа EXE нужно инициализировать сегментные регистры и т.к. регистр cs не указывет на psp, то использовать прерывание 0x20 проблематично
4) При выводе сообщений должен быть перевод строк (был вывод 0x0D0A). а то они накладываются друг на друга

Я вод для tasm написал вполне рабочую программу:
Код

.model small
.stack 64
.data
Msg1 db 'Press string: $'
buff db 254, ?
.code
main proc far
mov ax, @data
mov ds, ax
mov es, ax
mov ah,9h
lea dx, Msg1
int 21h
mov ah,0Ah
lea dx,buff
int 21h
mov cl,[buff+1]
lea di, buff+2
loop1:
cmp byte ptr [di], 'a'
jb cont1
cmp byte ptr [di], 'z'
ja cont1
and byte ptr [di], 11011111b
cont1: inc di
loop loop1
inc di
mov word ptr [di], 240ah
mov word ptr buff, 0a0dh
mov ah,9h
lea dx, buff
int 21h
mov ah, 8
int 21h
mov ax, 4c00h
int 21h
main endp
end main


Это сообщение отредактировал(а) iff - 9.5.2010, 16:21


--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
GLeBaTi
Дата 10.5.2010, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 1.2.2008
Где: г.Чебоксары

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



В общем нашел кучу ошибок, но главная - то, что когда вводится строка с клавиатуры и нажимается ентер, то не ставится символ конца строки.
Только не могу понять, почему у меня выводится полученная строка в начале:
http://s45.radikal.ru/i109/1005/51/be91a8f77a0c.jpg
PM MAIL   Вверх
GLeBaTi
Дата 10.5.2010, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 1.2.2008
Где: г.Чебоксары

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



Всё. Надо было добавить символ переноса коретки.
PM MAIL   Вверх
iff
Дата 10.5.2010, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


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

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



GLeBaTi, А ты вообще ответы мои читал?

Цитата(iff @  9.5.2010,  15:00 Найти цитируемый пост)
4) При выводе сообщений должен быть перевод строк (был вывод 0x0D0A). а то они накладываются друг на друга


Добавлено через 3 минуты и 29 секунд
И ещё, посмотри не коверкает ли твоя программа символы, отличные от латинских букв
Например, введи abcABC[{]}!
нв экран соответсятвенно должно выводится: ABCABC[{]}!

Мой пример работет правильно.

Добавлено через 7 минут и 19 секунд
Цитата(GLeBaTi @  10.5.2010,  08:57 Найти цитируемый пост)
В общем нашел кучу ошибок, но главная - то, что когда вводится строка с клавиатуры и нажимается ентер, то не ставится символ конца строки.


Ставится символ 0x0D, т.е. код клавиши enter


--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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