Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.10.2012, 05:36   #1
Leshkin
 
Регистрация: 22.10.2012
Сообщений: 5
Сообщение В последней строке символы, следующие за заданиым символом, переписать в обратном порядке

В последней строке символы, следующие за заданным символом, переписать в обратном порядке.
собственно записать всю строку в обратном порядке понял как,а как с определенного символа переписать в обратном порядке?
например 123456789
и с 5 переписать 12345 9876
мои наработки:
Код:
.386
    .model flat, stdcall
    option casemap :none
    include \masm32\include\windows.inc
    include \masm32\include\user32.inc 
    include \masm32\include\masm32.inc
    include \masm32\include\kernel32.inc
    include \masm32\macros\macros.asm
    includelib \masm32\lib\user32.lib 
    includelib \masm32\lib\masm32.lib
    includelib \masm32\lib\kernel32.lib
 
 
Asize equ 60            ;equ присваивает метке значение
.data       ;резервируем память под данные и сразу же объявляем их
     msg1 db "‚ўҐ¤ЁвҐ бва®Єг:   ",0dh,0ah               ;0dh,0ah перевод на новую строку
     msg2 db "‚ўҐ¤ЁвҐ б Є*Є®Ј® бЁ¬ў®«* §*ЇЁб*вм ў ®Ўа*в*®¬ Ї®ап¤ЄҐ:     ",0dh,0ah               
     msg3 db "---’*Є®Ј® бЁ¬ў®«* *Ґ **©¤Ґ*®---" ,0dh,0ah,0dh,0ah,0dh,0ah 
     msg4 db "‚ ®Ўа*в*®¬ Ї®ап¤ЄҐ", 0dh,0ah
     msg5 db "„***л© бЁ¬ў®« *Ґ **©¤Ґ*,Їа®Ја*¬¬* §*ўҐаи*Ґв а*Ў®вг..", 0dh,0ah
     msg6 db "‘Ё¬ў®« **©¤Ґ*", 0dh,0ah
     str1 db 32 dup (' '),0 ;Введенные символы
     str2 db 32 dup (' '),0
     str3 db 32 dup (' '),0 ;Введенные символы
     error db "Числ-а(о)  (в строке 1),с которого идет несовпадение=%s",0
.data?      ;нельзя инициализировать переменные
     stdin dd ?         ;dd - 4 байта - 2 слова =8 символам                 
     stdout dd ?
     cRead dd ?                         
     cWritten dd ?
     res  dd ?
.code
start:              
    invoke GetStdHandle,STD_OUTPUT_HANDLE   ;Дескриптор стандартного устройства ввода данных. 
    mov stdout,eax                          ;копирует значение переменной stdin в регистр eax
    invoke GetStdHandle,STD_INPUT_HANDLE
    mov stdin,eax; 
    invoke WriteConsoleA,stdout,ADDR msg1,SIZEOF msg1,ADDR cWritten,NULL
        invoke ReadConsole,stdin,ADDR str1,Asize,ADDR cRead,NULL    ;считываем 1 строку с консоли
    ;invoke WriteConsoleA,stdout,ADDR msg2,SIZEOF msg2,ADDR cWritten,NULL
        ;invoke ReadConsole,stdin,ADDR str2,Asize,ADDR cRead,NULL   ;считываем 2 строку с консоли
        
            ;поиск символа после которого нужно инвентировать символы
;-----------------------------------процесс сравнения строк-----------------------------------
revers proc 
        MOV ECX,32              ;длина строки 32 байта
        LEA ESI,str1
    m1:
        mov al,[ESI]
        push ax
        inc ESI
        loop m1
 
        MOV ECX,32              ;длина строки 32 байта
        LEA ESI,str1
    m2:
        pop ax
        mov [esi],al
        inc esi
        loop m2
        invoke WriteConsoleA,stdout,ADDR msg4,SIZEOF msg4,ADDR cWritten,NULL
        invoke WriteConsoleA,stdout,ADDR str1,SIZEOF str1,ADDR cWritten,NULL
 
revers endp
    invoke Sleep,INFINITE       ;не закрываем консоль после выполнения
    invoke ExitProcess,0        ;выход 
end start
Leshkin вне форума Ответить с цитированием
Старый 02.11.2012, 20:29   #2
Leshkin
 
Регистрация: 22.10.2012
Сообщений: 5
По умолчанию

теперь проблема,как сделать это:
Написать вызывающую функцию на языке С++, осуществляющую ввод исходных данных и вывод результатов.
для этого же задания
можно какой нибудь простенький пример,а то гугл что то ничего хорошего не выдает..
то есть как я понимаю,ввод строки и символа+вывод строки,должны быть в С++,а остальное в asm?
как вообще это все выглядит и работает?
код на masm:
Код:
.386
    .model flat, stdcall
    option casemap :none
    include \masm32\include\windows.inc
    include \masm32\include\user32.inc 
    include \masm32\include\kernel32.inc
    include \masm32\include\masm32.inc
    include \masm32\include\msvcrt.inc          ;для сrt_printf\crt_scanf
    include \masm32\macros\macros.asm
    includelib \masm32\lib\masm32.lib
    includelib \masm32\lib\msvcrt.lib           ;для сrt_printf\crt_scanf
.data
            errmsg  db 0Dh, 0Ah, 'ЌҐў®§¬®¦*® **©вЁ в*Є®© бЁ¬ў®«!',0,0dh,0ah 
            string  db 'бва®Єг (Ѓ…‡ Їа®ЎҐ«*):   ',0,0dh,0ah 
            char    db 'бЁ¬ў®«: ',0,0dh,0ah 
            res     db 0Dh, 0Ah, 'ђҐ§г«мв*в: %s',0,0dh,0ah  
            tmplt   db '‚ўҐ¤ЁвҐ %s',0
            tpts    db '%s',0
            _chr    dd ?
            buf     db 256 dup(?)
.code    
_in proc near           ;процедура ввода строки
        invoke crt_printf,ADDR tmplt,ADDR string            ;просим ввести строку
        invoke crt_scanf,ADDR tpts,ADDR buf                 ;читаем из буфера
        invoke crt_printf,ADDR tmplt,ADDR char              ;просим ввести искомый символ
        call crt__getch                                     ;_getch берем искомый символ с консоли
        invoke crt_putchar,eax
        invoke crt_strchr,ADDR buf,eax                      ;получить адрес символа в строке   
    ret
_in endp
 
s_r proc near       ;процедура поиска заданного символа 
    ;strchr-ищет символ в строке
        test eax,eax                        ;ищем
        jz _err                             ;идем в error
        inc eax                             ;адрес слова,символа
        mov esi,eax         
        mov edi,esi
        xor ecx,ecx                         ;счётчик
next:   
        lodsb                               ;загружаем
        or al,al                            ;строка - ASCIZ, 0 - EOL
        jz @F                               ;alles
        push ax                             ;запихиваем в стек
        inc ecx                             ;увеличиваем счетчик
        jmp next                            ;сейчас EDI указывает на адрес,с которого начали
@@:
        pop ax                              ;записываем в обратном порядке
        stosb                               ;сохраняем
        loop @B                             ;ecx символов
    ret
    s_r endp
main:   
    call _in    ;вызываем процедуру ввода
    call s_r    ;вызываем процедуру поиска и записи в обратном порядке
 
    invoke crt_printf,ADDR res,ADDR buf         ;выводим строку,уже с  символами в обратном порядке
_exit:
        call crt__getch                     ;выход
        invoke Sleep,INFINITE               ;не закрываем консоль после выполнения
        invoke ExitProcess,0                ;выход 
_err:
    invoke  crt_puts,ADDR errmsg            ;выводит ошибку
    jmp _exit                               ;прыгаем на выход
 
end main
Leshkin вне форума Ответить с цитированием
Старый 02.11.2012, 21:47   #3
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Цитата:
Написать вызывающую функцию на языке С++, осуществляющую ввод исходных данных и вывод результатов.
для этого же задания
Leshkin,
1) Код не Вами написан. Ссылаться на источник сейчас не учат?
2) Здесь раздел ассемблера, а не це++.
vadimych вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
переписать строку s так, чтобы символы в ней были записаны в обратном порядке edikesh Помощь студентам 7 05.12.2011 23:16
в целочисленной прямоугольной матрице вывести элементы последней строки в обратном порядке fanofinter Паскаль, Turbo Pascal, PascalABC.NET 3 07.11.2011 11:14
переписать массив в обратном порядке Настя22 Паскаль, Turbo Pascal, PascalABC.NET 1 25.02.2011 11:01
В обратном порядке mari.ha Общие вопросы C/C++ 7 25.12.2008 21:36
Во вводимом тексте переписать все слова в обратном порядке. menlo Помощь студентам 5 17.11.2007 10:18