Программа инвертирования строки

Тема в разделе "WASM.BEGINNERS", создана пользователем taksos, 21 дек 2008.

  1. taksos

    taksos New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2008
    Сообщения:
    23
    Вот программа, написанная под NASM. Цель: инвертировать строку из 10 символов. Она работает, но когда вводим больше 10 символов, то первые 10 выводятся инвертированными, а оставшаяся часть выводится в командную строку и "нажимается" Enter. Что поменять, чтоб оставшиеся символы игнорировались?

     
  2. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    Cбрось то что находится в буфере перед выводом текста на экран.
     
  3. taksos

    taksos New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2008
    Сообщения:
    23
    И что это значит?
     
  4. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    В *NIX строковые операции всегда буферезируются. Для скорейшего последующего доступа.
    И ; System call #4 "write" выводит на экран то что находится в буфере (10 инвертированных символов + всё остальное).
    fflush(NULL) - сбросить все буферы. (это в СИ)
    Номер сис вызова в *NIX точно не знаю
     
  5. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    не ленимся..и читаем.
    UNIX Профессиональное программирование 416 стр.
    У. Ричард Стивенс
    Стивен А. Раго

    Номера системных вызовов в Mandriva у меня находятся в /usr/include/asm/unistd_32.h
     
  6. taksos

    taksos New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2008
    Сообщения:
    23
    134 sys_bdflush int long
    Вот нашел такой системный вызов, это он? Написано, что в ebx надо тип int, а в ecx - тип long. Только что туда помещать?
     
  7. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    в консоли введи
    man bdflush
     
  8. taksos

    taksos New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2008
    Сообщения:
    23
    Вы уж не серчайте. Просто я под Linux только вторую прогу пишу.
    В системных вызовах с "flush" есть только тот, который выше указал. А вот, что по нему нашел, http://www.opennet.ru/man.shtml?topic=bdflush&category=2&russian=2
    Ну из этого все равно не понял, что передавать в качестве параметров.
     
  9. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    Лень было разбираться с твоим кодом....
    и я решил, сделать, просто вот так..
    Код (Text):
    1. section .data
    2. path_file db 'test.ghex',0
    3.     msg1        db ' Input string: ', 0x0A
    4.     msg1_len     equ $ - msg1
    5.  
    6.  
    7.     msg2        db 'Запись в файл: ', 0x0A
    8.     msg2_len     equ $ - msg2
    9.  
    10.     empt        db 0Dh,0Ah
    11.     empt_l        equ $ - empt
    12. section .bss
    13. fd resd 1 ; резервируем 4 байт для возвращаемого дескриптора функции open
    14.     buf1         resb 10
    15.     buf1_l         equ $ - buf1
    16.    
    17.     buf2         resb 10
    18.     buf2_l        equ $ - buf2
    19. section .text
    20.  
    21.     global _start
    22. _start:
    23.  
    24.  
    25.  
    26. ; System call #4 "write"
    27.     mov eax,4
    28.     mov ebx,1
    29.     mov ecx,msg1
    30.     mov edx,msg1_len
    31.     int 80h
    32. ; System call #3 "read"
    33.     mov eax,3
    34.     mov ebx,0
    35.     mov ecx,buf1
    36.     mov edx,buf1_l
    37.     int 80h
    38. ; Копирование с конца buf1 и запись с начала buf2  
    39.     mov esi,buf1        ; В esi указатель на первую букву buf1
    40.     add esi,eax
    41.     dec esi
    42.     mov edi,buf2        ; В edi указатель на первую букву buf2
    43.     cmp eax,10        ; В eax возвращается реальная длина, если 10, то нет \n, в буфере только строка
    44.                 ; иначе - строка вместе со \n
    45.     jnz minus        ; Если значение в eax<10, то esi-1,      
    46.     jmp next        ; иначе - esi без изменений
    47. minus:
    48. ; Вычитание из esi 1
    49.     dec esi
    50. next:
    51.     mov ebx,buf1        ; В ebx указатель на первую букву buf1
    52.     dec ebx
    53. begin:
    54.     std  
    55.  
    56.     lodsb    
    57.  
    58.     cld      
    59.  
    60.     stosb    
    61.  
    62.     cmp esi,ebx
    63.  
    64.     jz stopp  
    65.  
    66.     jmp begin
    67. stopp:
    68. ; System call #4 "write"
    69.     mov eax,4
    70.     mov ebx,1
    71.     mov ecx,msg2
    72.     mov edx,msg2_len
    73.     int 80h
    74.  
    75. ; System call #4 "write"
    76.     mov eax,4
    77.     mov ebx,1
    78.     mov ecx,empt
    79.     mov edx,empt_l
    80.     int 80h
    81.  
    82. ;системный вызов open
    83. mov eax,5 ; syscall open
    84. mov ebx,path_file
    85. mov ecx,0001002
    86. mov edx,7666
    87. int 0x80
    88. mov [fd],eax ; записываем в fd номер возвращённого дескриптора функции open
    89.  
    90. ;системный вызов write
    91. ; System call #4 "write"
    92.     mov eax,4
    93.     mov ebx,[fd] ; сохраняем в дескриптор открытого файла
    94.     mov ecx,buf2
    95.     mov edx,buf2_l
    96.     int 80h
    97.  
    98. ;Тут можно просто всё содержимое файла вывести на экран )...вобщем сам сделаешь.......
    99.  
    100.  
    101.  
    102. ;системный вызов close
    103. mov eax,6
    104. mov ebx,[fd]
    105. int 0x80
    106.  
    107. incorrect:
    108. mov eax, 1 ; syscall exit
    109. xor ebx,ebx ; поместить 0 в ebx
    110. int 0x80 ; Обратится к ядру для возбуждения системного вызова
    Кстати, яб никогда б не стал такой код писать)...
    Уж проще было использовать push и pop....
     
  10. taksos

    taksos New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2008
    Сообщения:
    23
    Ок, спасибо, буду разбираться. Только последний вопрос, куда денется та часть, которая оказалась буферизованной?
     
  11. stellaco

    stellaco New Member

    Публикаций:
    0
    Регистрация:
    11 дек 2008
    Сообщения:
    193
    Точно не знаю )..
    но полагаю что тамже и останется (в буфере)
    Просто теперь, мы будем оперировать не с буфером данных(где может быть записано больше 10 символов) , а с данными в файле (в который мы записываем жостко ограниченное колличество байт).
     
  12. taksos

    taksos New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2008
    Сообщения:
    23
    Ок. Спасибо!