Простенькая программка( помогите найти ошибку )

Тема в разделе "WASM.BEGINNERS", создана пользователем GLebaTi, 8 май 2010.

  1. GLebaTi

    GLebaTi New Member

    Публикаций:
    0
    Регистрация:
    8 май 2010
    Сообщения:
    10
    Код (Text):
    1. org 0x100
    2. SEGMENT .CODE
    3.     mov ah,0x9
    4.     mov dx, Msg1
    5.     int 0x21
    6.    
    7.     ;string input
    8.     mov ah,0xA
    9.     mov dx,buff
    10.     int 0x21
    11.  
    12.     mov ax,0
    13.     mov al,[buff+1]; длина
    14.    
    15.     ;string UPPERCASE  
    16.     mov cl, al ; кол-во повторений
    17.     mov si, buff
    18.     cld
    19. loop1:
    20.     lodsb;
    21.     cmp al, 'a' ;если находим маленькую букву, то jnb upper (поиск идет по символу ansii)
    22.     jnb upper
    23.  
    24. loop loop1
    25.  
    26. ;вывод результатов
    27. mov ah,0x9
    28. mov dx, buff
    29. int 0x21
    30.    
    31. exit:
    32.     mov ah, 0x8
    33.     int 0x21
    34.     int 0x20
    35.  
    36. upper:
    37.     sub al,32 ;изменяем код символа (+32 - т.е. через 32 позиции, находится буква в верхнем регистре. Можете посмотреть таблицу символов)
    38.     jmp loop1
    39.  
    40. SEGMENT .DATA
    41. Msg1 db 'Press string: $'
    42. buff db 254,0
    написал под nasm, но криво работает(точнее не правильно работает).
    Я думаю проблема в jnb upper.
    Программа переделывает маленькие буквы в строке к верхнему регистру.
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    1-ая ошибка. после 'z' тоже есть символы.
    2-ая ошибка. по upper стоит тоже поставить loop loop1/jmp exit_loop1 (иначе собьется cx)
     
  3. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    3-ья ошибка. буфер бы хорошо бы явно зарезервировать
    4-ая ошибка. строка начнется через 2 байт после начала buff
    5-ая ошибка. старшая часть cx может быть не равна 0
     
  4. GLebaTi

    GLebaTi New Member

    Публикаций:
    0
    Регистрация:
    8 май 2010
    Сообщения:
    10
    Спасибо!
    В общем нашел кучу ошибок, но главная - то, что когда вводится строка с клавиатуры и нажимается ентер, то не ставится символ конца строки.
    Только не могу понять, почему у меня выводится полученная строка в начале:
    http://s45.radikal.ru/i109/1005/51/be91a8f77a0c.jpg
     
  5. GLebaTi

    GLebaTi New Member

    Публикаций:
    0
    Регистрация:
    8 май 2010
    Сообщения:
    10
    вот что получилось:
    Код (Text):
    1. cseg segment
    2. org 100h
    3. start:
    4.  
    5.     mov ah,9h
    6.     mov dx, offset Msg1
    7.     int 21h
    8.    
    9.     ;string input
    10.     mov ah,0Ah
    11.     mov dx,offset buff
    12.     int 21h
    13.  
    14.     mov ax,0
    15.     mov al,buff+1; длина
    16.     mov di, dx
    17.     add di,ax
    18.     mov es:[di+2],'$';добавим символ конца
    19.    
    20.     ;string UPPERCASE
    21.     mov cx,0
    22.     mov cl, al ; кол-во повторений
    23.     mov si, offset buff+2
    24.     cld
    25. loop1:
    26.     lodsb;
    27.     cmp al, 'a'
    28.     jnb upper
    29.  
    30. loop loop1
    31.  
    32. mov ah,9h
    33. mov dx, offset buff+2
    34. int 21h
    35. jmp exit
    36.  
    37. upper:
    38.     cmp al, '{'
    39.     jnb loop1
    40.     sub al,32
    41.     mov es:[si-1],al
    42.     jmp loop1
    43.  
    44. exit:
    45.     ;"Press any key..."
    46.     mov ah, 8h
    47.     int 21h
    48.     int 20h ;exit
    49.  
    50. Msg1 db 'Press string: $'
    51. buff db 254,0
    52.  
    53. cseg ends
    54. end start
    3-ья ошибка. буфер бы хорошо бы явно зарезервировать - это как ?
     
  6. GLebaTi

    GLebaTi New Member

    Публикаций:
    0
    Регистрация:
    8 май 2010
    Сообщения:
    10
    Всё, сделал. Надо было перевести коретку.
    Остался только вопрос с
    "3-ья ошибка. буфер бы хорошо бы явно зарезервировать - это как ?"
     
  7. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    buff db 254,0
    явно объявляет 2 байта, а надо 256
    buff db 254,0,dup (?)
     
  8. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    верните редактирование!!!
    buff db 254,0,254 dup (?)
     
  9. GLebaTi

    GLebaTi New Member

    Публикаций:
    0
    Регистрация:
    8 май 2010
    Сообщения:
    10
    Большое спасибо за помощь! Курсач доделал )