Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/22: Рейтинг темы: голосов - 22, средняя оценка - 4.91
6 / 6 / 1
Регистрация: 22.10.2012
Сообщений: 36
1

В последней строке символы, следующие за заданиым символом, переписать в обратном порядке

27.10.2012, 05:32. Показов 4620. Ответов 28
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В последней строке символы, следующие за заданным символом, переписать в обратном порядке.
собственно записать всю строку в обратном порядке понял как,а как с определенного символа переписать в обратном порядке?
например 123456789
и с 5 переписать 12345 9876
мои наработки:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
.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
1
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.10.2012, 05:32
Ответы с готовыми решениями:

Исходный текст переписать в обратном порядке и перед каждым символом вставить символ “б”.
Исходный текст переписать в обратном порядке и перед каждым символом вставить символ “б”. Например:...

Переписать все символы строки в обратном порядке
Ps сделать нужно именно в codeBlocks

Ввести строку и переписать её символы в обратном порядке
Помогите, пожалуйста, составить программу, которая вводит строку текста с клавиатуры и отображает...

Переписать символы строки с номером N на экране в обратном порядке
Помогите решить задачу. Переписать символы строки с номером N на экране в обратном порядке....

28
Клюг
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
27.10.2012, 19:55 2
Дык, вотЪ(FASM, msvcrt.dll):
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
format PE console 4.0
 
include 'win32a.inc'
    cinvoke crt_printf, tmplt, ents
    cinvoke crt_scanf, tpts, buf
    cinvoke crt_printf, tmplt, entc
    invoke  crt_getch
    invoke  crt_putchar, eax
    invoke  crt_strchr, buf, eax
    test    eax, eax
    jz  _err
    inc eax
    mov esi, eax
    mov edi, esi
    xor ecx, ecx
next:   lodsb
    or  al,al
    jz  @F
    push    ax
    inc ecx
    jmp next
@@: pop ax
    stosb
    loop    @B
    cinvoke  crt_printf, res, buf
exit:   invoke  crt_getch
        invoke  ExitProcess,0
_err:   invoke  crt_puts, errmsg
    jmp exit
errmsg  db  'Can"t find char.',0
ents    db      'string:',0
entc    db      'char:',0
res db  0Dh, 0Ah, 'result: %s',0
tmplt   db  'Enter %s',0
tpts    db  '%s',0
_chr    dd  ?
buf     db      256 dup(?)
; import data in the same section
 data import
 
 library kernel32,'KERNEL32.DLL',\
     msvcrt,'MSVCRT.DLL'
 
 import kernel32,\
        ExitProcess,'ExitProcess' 
 
 import msvcrt,\
    crt_puts,'puts',\
    crt_scanf,'scanf',\
    crt_printf,'printf',\
        crt_strchr,'strchr',\ 
    crt_getch, '_getch',\
    crt_putchar, 'putchar'
end data
0
6 / 6 / 1
Регистрация: 22.10.2012
Сообщений: 36
29.10.2012, 16:53  [ТС] 3
хотелось бы на masme,и поподробнее
1
Клюг
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
29.10.2012, 18:39 4
Leshkin, можно и на масме. Поставил таки это УГ. Как вы на нём пишете?
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
.486
    .model flat, stdcall
    option casemap :none
    include \masm32\include\windows.inc
    include \masm32\include\masm32.inc
    include \masm32\include\msvcrt.inc
    include \masm32\macros\macros.asm
    includelib \masm32\lib\masm32.lib
    includelib \masm32\lib\msvcrt.lib
.data
errmsg  db  'Can"t find char.',0
ents    db      'string:',0
entc    db      'char:',0
res db  0Dh, 0Ah, 'result: %s',0
tmplt   db  'Enter %s',0
tpts    db  '%s',0
_chr    dd  ?
buf     db      256 dup(?)
.code    
start:  invoke  crt_printf, ADDR tmplt, ADDR ents
    invoke  crt_scanf, ADDR tpts, ADDR buf
    invoke  crt_printf, ADDR tmplt, ADDR entc
    call    crt__getch
    invoke  crt_putchar, eax
    invoke  crt_strchr,  ADDR buf, eax  ; получить адрес символа в строке
    test    eax, eax            ; есть?
    jz  _err                            ; gtfo
    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 символов
    invoke  crt_printf, ADDR res, ADDR buf
_exit:  call    crt__getch
        invoke  crt_exit,0
_err:   invoke  crt_puts, ADDR errmsg
    jmp _exit
 
    end start
И да, хелп по ф-циям из msvcrt гуглится, отбрасывая приставку crt_, т.е. для crt_printf запрос будет: printf MSDN
Или ищите описание ф-ций clib от любого Си-компилятора.
1
6 / 6 / 1
Регистрация: 22.10.2012
Сообщений: 36
29.10.2012, 19:58  [ТС] 5
спасибо,сейчас буду разбираться что и как

Добавлено через 2 минуты
на нем даже как-то удобнее

Добавлено через 33 минуты
Charles Kludge, Спасибо огромное
0
Troll_Face
29.10.2012, 19:58
  #6

Не по теме:

Цитата Сообщение от Charles Kludge Посмотреть сообщение
Как вы на нём пишете?
а чем он тебе не нравится? :) сейчас заделали среды для разработки типа WinAsm и MASMBuilder и вполне нормально на нем кодить

0
Клюг
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
29.10.2012, 20:40 7
Цитата Сообщение от Leshkin
на нем даже как-то удобнее
Цитата Сообщение от Fatal Error
сейчас заделали среды для разработки типа
Сидят как-то Диггер, командир Нортон и т. Комманд Ком, а
мимо идет отец Вындоуз. "Сидите, - говорит. - Ну, ну. Скоро все
подо мной сидеть будете". Никто ему так ничего и не ответил.
Один т. Комманд Ком сплюнул и грязно выругался. "Проходи,
проходи, - сказал, - оболочка дешевая".
Отсюда.
Я предпочитаю консоль и командную строку, потому как начинал с терминалов, а отец Вындоуз в ту пору был таким УГ, что его считали даже вредоносной надстройкой над Досей.
Ну и, само собой бесит, что я должен писать ADDR, рАвно как и offset или word ptr в тасме, если очевидно, что addr - это адрес, а [addr] - значение. И какого хрена сегмент .data должен быть первым? Масму лень лишний проход сделать или адреса резолвить в конце первого прохода, а не по ходу?
0
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
29.10.2012, 20:53 8
Цитата Сообщение от Charles Kludge Посмотреть сообщение
И какого хрена сегмент .data должен быть первым?
хз, я всегда дату первым делаю...
Цитата Сообщение от Charles Kludge Посмотреть сообщение
бесит, что я должен писать ADDR, рАвно как и offset или word ptr в тасме, если очевидно, что addr - это адрес, а [addr] - значение.
это да... согласен
0
6 / 6 / 1
Регистрация: 22.10.2012
Сообщений: 36
02.11.2012, 20:23  [ТС] 9
теперь проблема,как сделать это:
Написать вызывающую функцию на языке С++, осуществляющую ввод исходных данных и вывод результатов.
для этого же задания
можно какой нибудь простенький пример,а то гугл что то ничего хорошего не выдает..
то есть как я понимаю,ввод строки и символа+вывод строки,должны быть в С++,а остальное в asm?
как вообще это все выглядит и работает?
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
.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
1
Клюг
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
02.11.2012, 21:43 10
Цитата Сообщение от Leshkin
Написать вызывающую функцию на языке С++
На каком из? В OpenWatcom C/C++ есть (штатно) замечательная ф-ция char *strrev( char *s1 ); , которая зеркалирует строку.
ASM здесь вообще ни при делах, или препод упёрт в VC++?
Leshkin, вы же понимаете, что то, что я привёл на АСМе, преобразуется в ANSI C за пять секунд. В чём великий смысл?
1
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,045
02.11.2012, 22:05 11
Цитата Сообщение от Charles Kludge Посмотреть сообщение
Leshkin, вы же понимаете

Не по теме:

Charles Kludge, да ты оптимист.

0
6 / 6 / 1
Регистрация: 22.10.2012
Сообщений: 36
03.11.2012, 07:01  [ТС] 12
Charles Kludge, чисто на С++
допустим написали ввод строки на си:
C++ (Qt)
1
2
    char string[255];
    gets(string);
как передать введенную строку на asm?
то есть не использовать этот код:
Assembler
1
2
3
4
5
6
7
8
_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
а юзать сишный
0
Клюг
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
04.11.2012, 10:33 13
Цитата Сообщение от Leshkin
как передать введенную строку на asm?
Что мешает заюзать
invoke crt_scanf, ADDR itpt, ADDR buf
;...
itpt db '%s',0
или
invoke crt_gets, ADDR buf
?

Не по теме:

Цитата Сообщение от Vadimych Посмотреть сообщение
Charles Kludge, да ты оптимист.
Я был пьян.

2
6 / 6 / 1
Регистрация: 22.10.2012
Сообщений: 36
12.11.2012, 17:16  [ТС] 14
Charles Kludge,
не работают некоторые строки,в чем ошибка?
как в buf записать str1?или вообще нужно не так делать?приведи пример пожалуйста чего-нибудь подобного)

вот что получилось:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <locale.h>
using namespace std;
 
int main()
{
    setlocale(0,"RUS");
    char str1[10];
    char str2[2];
    char buf[20];
    cout<<"\n\aВведите строку\n\n";
    fflush(stdin);
    gets(str1);
    cout<<"\n\aВведите искомый символ\n\n";
    fflush(stdin);
    gets(str2);
    _asm
    {
        //как в buf записать str1?
        //здесь код на asm
        invoke crt_putchar,eax                              //не работает
        invoke crt_strchr,ADDR buf,eax                      //не работает
        test eax,eax                        
        jz _err                             
        inc eax                             
        mov esi,eax         
        mov edi,esi
        xor ecx,ecx                         ;счётчик
next:   
        lodsb                               ;загружаем
        or al,al                            ;or:Если хотя бы один из сравниваемых битов равен  1,то  результат
                                            ;равен 1,если сравниваемые биты равны 0,то результат - 0.
        jz @F                               //не работает                   
        push ax                             
        inc ecx                             
        jmp next                            ;сейчас EDI указывает на адрес,с которого начали
@@:
        pop ax                              
        stosb                           //не работает 
        loop @B                             ;ecx с
 
        invoke crt_printf,ADDR res,ADDR buf             //не работает
    }
    
    cout<<"\nРезультат:\n";
    cout<<str1;
    system("pause");
    return 0;
}

Цитата Сообщение от Charles Kludge Посмотреть сообщение
Что мешает заюзать
invoke crt_scanf, ADDR itpt, ADDR buf
;...
itpt db '%s',0
или
invoke crt_gets, ADDR buf
?
если делать так,то как ipt в Си объявить и задать?
1
Клюг
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
12.11.2012, 18:25 15
Лучший ответ Сообщение было отмечено как решение

Решение

Всё просто:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
 
void main()
{
    int c;
    char *sptr;
    char buf[20];
    setlocale(0,"RUS");
    printf("%s","Введите строку:");
    gets(&buf);
    printf("%s","Введите искомый символ:");
    c = getc(stdin);    
    sptr = strchr(&buf,c);
    if (sptr)
    {
    sptr++;
    _asm
    {
        mov esi,sptr         
        mov edi,esi
        xor ecx,ecx                         //счётчик
next:   
        lodsb                               //загружаем
        or al,al                            //or:Если хотя бы один из сравниваемых битов равен  1,то  результат
                                            //равен 1,если сравниваемые биты равны 0,то результат - 0.
        jz done
        push ax                             
        inc ecx                             
        jmp next                            //сейчас EDI указывает на адрес,с которого начали
done:
        pop ax                              
        stosb                               //работает   
        loop done                             //ecx с
 
    }
    
    printf("\nРезультат:[%s]",&buf);
    } else puts("Symbol not found.");
    getc(stdin);
}
Кстати, нашел онлайн справочник по Сюшным ф-циям: http://npora.ru/

И зачем вам С++? Я его лет ~20 изучаю и иногда пишу, но и то не могу сказать, что я его знаю. Знает его, кмк, только СтраусТруп.
3
6 / 6 / 1
Регистрация: 22.10.2012
Сообщений: 36
13.11.2012, 10:05  [ТС] 16
Charles Kludge, спасибо огроменное за помощь

Добавлено через 14 часов 8 минут
Charles Kludge, объясни пожалуйста как эти строки работают:
Assembler
1
lodsb
Assembler
1
or al,al
Assembler
1
stosb
что делают данные команды?
0
Клюг
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
13.11.2012, 10:18 17
http://www.kolasc.net.ru/cdo/p... /lods.html
http://www.kolasc.net.ru/cdo/p... er/or.html
В данном случае - быстрая проверка al на ноль: or al,al = cmp al,0
http://www.kolasc.net.ru/cdo/p... /stos.html
1
6 / 6 / 1
Регистрация: 22.10.2012
Сообщений: 36
13.11.2012, 11:02  [ТС] 18
Charles Kludge, а как перенести заданный элемент строки в конец этой же строки?на asm
положить всё до и после искомого символа в один регистр,искомый символ в другой?
или как проще и лучше сделать?
0
Клюг
7675 / 3190 / 382
Регистрация: 03.05.2011
Сообщений: 8,380
13.11.2012, 11:16 19
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
 
void main()
{
    int c;
    char *sptr;
    char buf[20];
    setlocale(0,"RUS");
    printf("%s","Введите строку:");
    gets(&buf);
    printf("%s","Введите искомый символ:");
    c = getc(stdin);    
    sptr = strchr(&buf,c);
    if (sptr)
    {
    _asm
    {
        mov esi,sptr         
        mov edi,esi
        lodsb                               //загружаем
        push ax                             
 
next:   
        lodsb                               //загружаем
        or al,al                            //or:Если хотя бы один из сравниваемых битов равен  1,то  результат
                                            //равен 1,если сравниваемые биты равны 0,то результат - 0.
        jz done
        stosb
        jmp next                            //сейчас EDI указывает на адрес,с которого начали
done:
        pop ax                              
        stosb                               //работает   
 
    }
    
    printf("\nРезультат:[%s]",&buf);
    } else puts("Symbol not found.");
    getc(stdin);
}
0
6 / 6 / 1
Регистрация: 22.10.2012
Сообщений: 36
13.11.2012, 17:54  [ТС] 20
вообщем чисто на масме:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
.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   
main: 
        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                      ;получить адрес символа в строке, strchr-ищет символ в строке
 
        lea esi,buf                     
        mov edi,esi
        lodsb                               ;загружаем
        push ax           
 
next:   
        lodsb                              
        or al,al                            
        jz done
        stosb
        jmp next                            
done:
        pop ax                              
        stosb                        
 
    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
почему он только 1 символ строки в конец перемещает?в чем ошибка?
1
13.11.2012, 17:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.11.2012, 17:54
Помогаю со студенческими работами здесь

Дан файл, компонентами которого являются символы. Переписать все символы в новый файл в обратном порядке.
Работа с текстовыми файлами. Дан файл, компонентами которого являются символы. Переписать все...

Ввести строку и переписать её символы в обратном порядке (упростить код)
Как упростить код .model small .stack .data crlf db 0Dh, 0Ah, '$' a db 9 dup(0), '$' b db...

В текстовом файле переписать символы каждой строки в обратном порядке
Имеется текстовый файл. Переписать его строки в обратном порядке (справа налево) в другой файл....

В Каждом слове текста переписать все символы в обратном порядке
Здравствуйте, помогите, пожалуйста, решить задачу. Пытался разными способами, но никак не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru