С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
vivatverum
0 / 0 / 2
Регистрация: 05.11.2016
Сообщений: 51
1

Вставить подстроку в строку - Ошибка в коде

01.11.2017, 22:33. Просмотров 807. Ответов 8

Доброй ночи, господа. "В заданной строке с нулевым завершителем вставить заданную подстроку, начиная с заданной позиции" - тема моей программы. Код написала, но мне кажется, что он делает не совсем то, что нужно... В OllyDbg выдает такое, но я не понимаю, что там(
Прошу помочь разобраться в чем соль. Буду очень признательна!
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
       .486
    .model flat, stdcall
    option casemap :none   
 
    include \masm32\include\windows.inc
    include \masm32\include\masm32.inc
    include \masm32\include\kernel32.inc
    include \masm32\macros\macros.asm
    includelib \masm32\lib\masm32.lib
    includelib \masm32\lib\kernel32.lib
 
.data
    text1 db 'AAAAAA',0
    text2 db 'BBB', 0
    text3 db 9 dup (0)
    position = 3
.code
 
start:
 
cld
lea si, [text1] ;цепочка источник
lea di, [text3] ;цепочка приёмник
mov cx, position    ;количество элементов для обработки
rep     movsb
 
cld
lea si, [text2] ;цепочка источник
lea di, [text3] ;цепочка приёмник
mov cx, position    ;количество элементов для обработки
rep     movsb
 
cld
lea si, [text1 + position]  ;цепочка источник
lea di, [text3] ;цепочка приёмник
mov cx, 3   ;количество элементов для обработки
rep     movsb
 
mov ah, 09   
lea dx, [text3]  
int 21h ;выводим строку-приёмник на экран
mov ax, 4c00h    
int 21h
 
end start
0
Миниатюры
Вставить подстроку в строку - Ошибка в коде  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.11.2017, 22:33
Ответы с готовыми решениями:

В заданной строке с нулевым завершителем вставить заданную подстроку, начиная с заданной позиции
Вот мое задание: В заданной строке с нулевым завершителем вставить заданную...

Вставить в строку другую строку
Написать в tasm: Вставить в строку, другую строку с определенной координаты....

Вписать строку строки и её с уже имеющейся в коде
Нужно вписать строку в сравнить с имеющейся в коде CPU 386 BITS 16 org...

Ошибка в коде
Резидент, перехватывает нажатие клавиши, анализирует полученный код,...

Ошибка в коде
Всем доброго времени суток. НЕ пойму почему программа ругается на 65 строку....

8
ФедосеевПавел
Модератор
3860 / 2180 / 895
Регистрация: 01.02.2015
Сообщений: 7,263
01.11.2017, 23:12 2
Самая главная ошибка - смешение кода для 16-разрядного процессора и 32-разрядного процессора.

Примите, что для продолжения продаж, фирма intel в процессорах Pentium скрывает несколько процессоров, из которых может работать только один - 16-разрядный, 32-разрядный, 64-разрядный. Два других - мёртвым грузом присутствуют на кристалле. Это грубая аналогия, но похожая на действительность.
Это я рассказал для того, чтобы вы поняли, почему команды одного процессора не выполняются на другом.

Программы для DOS и Windows пишутся для разных процессоров, хотя и с одинаковой мнемоникой. Вам какая ОС нужна?
0
vivatverum
0 / 0 / 2
Регистрация: 05.11.2016
Сообщений: 51
01.11.2017, 23:30  [ТС] 3
Нужна Windows
0
ФедосеевПавел
Модератор
3860 / 2180 / 895
Регистрация: 01.02.2015
Сообщений: 7,263
01.11.2017, 23:43 4
Лучший ответ Сообщение было отмечено vivatverum как решение

Решение

Тогда
1 индексные регистры esi, edi, ebx вместо si, di, bx.
2 цикл loop и цепочечные команды по регистру ecx вместо cx
3. завершение программы
Assembler
 invoke ExitProcess, 0
4. вывод на экран несколько другой.
1
vivatverum
0 / 0 / 2
Регистрация: 05.11.2016
Сообщений: 51
01.11.2017, 23:47  [ТС] 5
Вечно у меня с регистрами не то, эх. Спасибо, сейчас попробую исправить всё!
0
ФедосеевПавел
Модератор
3860 / 2180 / 895
Регистрация: 01.02.2015
Сообщений: 7,263
01.11.2017, 23:50 6
Покажу пример вывода строки
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
.486
.model flat, stdcall
option casemap :none
 
    include d:\masm32\include\windows.inc
 
    include d:\masm32\include\user32.inc
    include d:\masm32\include\kernel32.inc
    include d:\masm32\include\masm32.inc
 
    includelib d:\masm32\lib\user32.lib
    includelib d:\masm32\lib\kernel32.lib
    includelib d:\masm32\lib\masm32.lib
.data
        aszPressEnter   db      0Dh, 0Ah, "Press ENTER to exit", 0
        hConsoleOutput  HANDLE  ?
        hConsoleInput   HANDLE  ?
    Buffer      db  1024 dup(?)
    BufLen      dd  ?
.code
 
start:
 
    ; получение описателей ввода и вывода консоли
    invoke  GetStdHandle,   STD_INPUT_HANDLE
    mov hConsoleInput,  eax
 
    invoke  GetStdHandle,   STD_OUTPUT_HANDLE
    mov     hConsoleOutput, eax
 
    invoke  ClearScreen
 
 
 
        ;ожидание нажатия ENTER
        invoke  WriteConsole, hConsoleOutput, ADDR aszPressEnter,\
                LENGTHOF aszPressEnter - 1, ADDR BufLen, NULL
        invoke  ReadConsole, hConsoleInput, ADDR Buffer,\
                LENGTHOF Buffer, ADDR BufLen, NULL
 
        invoke  ExitProcess, 0
 
end start
Сначала получают описатели ввода и вывода для консольного окна, а потом при помощи WriteConsole и одного из описателей выводят строку
1
vivatverum
0 / 0 / 2
Регистрация: 05.11.2016
Сообщений: 51
02.11.2017, 00:29  [ТС] 7
Я дошла до этого. Правда так и не увидела вывода, но это не существенно. Я прогнала в дебагере код и, по-моему, результаты перезаписываются на место друг друга... Или же я просто не понимаю. Не могли бы вы, пожалуйста, мне помочь с этим?
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
    .486
    .model flat, stdcall
    option casemap :none   
 
    include \masm32\include\windows.inc
    include \masm32\include\masm32.inc
    include \masm32\include\kernel32.inc
    include \masm32\macros\macros.asm
    includelib \masm32\lib\masm32.lib
    includelib \masm32\lib\kernel32.lib
 
.data
    hConsoleOutput  HANDLE  ?
    text1 db 'AAAAAA',0
    text2 db 'BBB', 0
    text3 db 9 dup (0)
    position = 3
.code
 
start:
 
cld
lea esi, [text1]    ;цепочка источник
lea edi, [text3]    ;цепочка приёмник
mov ecx, position   ;количество элементов для обработки
rep     movsb
 
cld
lea esi, [text2]    ;цепочка источник
lea edi, [text3]    ;цепочка приёмник
mov ecx, position   ;количество элементов для обработки
rep     movsb
 
cld
lea esi, [text1 + position] ;цепочка источник
lea edi, [text3]    ;цепочка приёмник
mov ecx, 3  ;количество элементов для обработки
rep     movsb
 
invoke GetStdHandle, STD_OUTPUT_HANDLE
mov hConsoleOutput,EAX
invoke WriteConsole, hConsoleOutput, offset text3, 16d, NULL, NULL
 
invoke ExitProcess, 0
 
end start
0
ФедосеевПавел
Модератор
3860 / 2180 / 895
Регистрация: 01.02.2015
Сообщений: 7,263
02.11.2017, 00:47 8
В строке 30 вы заново устанавливаете место записи на начало результирующей строки, тем самым затирая результат копирования из 1-й строки.
Может быть не трогать edi и его значение будет правильным после предыдущего rep
1
vivatverum
0 / 0 / 2
Регистрация: 05.11.2016
Сообщений: 51
02.11.2017, 00:51  [ТС] 9
Лучший ответ Сообщение было отмечено ФедосеевПавел как решение

Решение

Даааа, вы правы, всё заработало! Огромное вам спасибо за помощь!!
0
02.11.2017, 00:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.11.2017, 00:51

Ошибка в коде
дописал программу, выдает ошибки, не могу разобраться, помогите кто сможет ...

Ошибка в коде
Пользуюсь TASM Visual (настройки: компилятор - TASM, отладчик - OllyDbg) ...

Ошибка к коде
При компиляции ввыводит ошибку в 2 строках 194 и 360 "rotate count out of...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru