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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2010, 17:48   #1
Цветик
Пользователь
 
Регистрация: 12.10.2010
Сообщений: 21
По умолчанию задача со строками

Написать программу выбора одинаковых элементов из двух строк. На совпадение проверять символы, стоящие в строках на одних и тех же позициях. Одинаковые элементы поместить в отдельную строку и вывести на экран.
Вот что удалось сделать:
.data
s1 db "I love you" ;исходная строка
s2 db "I need you" ;2 исходная строка
s3 db 15 dup(?); строка для повторных символов
frmt db "%d",0
Title1 db "lab1",0
.code
start:
cld ;направление обработки строки слева
lea esi, s1
lea edi, s2
a:
cmp byte ptr [esi], byte ptr [edi]
jne a1
rep movsb
a1:
inc esi
inc edi
loop a
invoke MessageBoxA,0,offset s3, offset Title1,MB_OK
invoke ExitProcess,0
end start

Не хочет компилировать и пишет что ошибка с префиксом rep
Цветик вне форума Ответить с цитированием
Старый 13.10.2010, 00:03   #2
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию

Странно, у меня на cmp byte ptr [esi], byte ptr [edi] выругался.
Вот немного другой подход, но вроде работает:
Код:
.486
.model flat, stdcall
option casemap:none

include \masm32\INCLUDE\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

.data
s1 db "I love you" ;исходная строка
s2 db "I need you" ;2 исходная строка
s3 db 15 dup(?); строка для повторных символов
frmt db "%d",0
Title1 db "lab1",0
.code 
start: 

mov ecx, SIZEOF s1
cld
lea esi, [s1]
lea edi, [s2]
lea edx, [s3]

next:
jcxz end_cmp
repne cmpsb
jnz end_cmp
mov al, byte ptr [esi-1]
mov byte ptr [edx], al
inc edx
jmp next
end_cmp:
mov byte ptr [edx], 0
invoke MessageBoxA,0,offset s3, offset Title1,MB_OK
invoke ExitProcess,0
end start
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 13.10.2010, 05:11   #3
Цветик
Пользователь
 
Регистрация: 12.10.2010
Сообщений: 21
По умолчанию

Цитата:
Сообщение от Ulex Посмотреть сообщение
Странно, у меня на cmp byte ptr [esi], byte ptr [edi] выругался.
Вот немного другой подход, но вроде работает:
Код:
.486
.model flat, stdcall
option casemap:none

include \masm32\INCLUDE\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

.data
s1 db "I love you" ;исходная строка
s2 db "I need you" ;2 исходная строка
s3 db 15 dup(?); строка для повторных символов
frmt db "%d",0
Title1 db "lab1",0
.code 
start: 

mov ecx, SIZEOF s1
cld
lea esi, [s1]
lea edi, [s2]
lea edx, [s3]

next:
jcxz end_cmp
repne cmpsb
jnz end_cmp
mov al, byte ptr [esi-1]
mov byte ptr [edx], al
inc edx
jmp next
end_cmp:
mov byte ptr [edx], 0
invoke MessageBoxA,0,offset s3, offset Title1,MB_OK
invoke ExitProcess,0
end start
Спасибо конечно=) но нужно сравнивать по символьно а cmpsb использовать нельзя=(
Цветик вне форума Ответить с цитированием
Старый 13.10.2010, 05:22   #4
Цветик
Пользователь
 
Регистрация: 12.10.2010
Сообщений: 21
По умолчанию

.data
s1 db "I love you" ;исходная строка
s2 db "I need you" ;2 исходная строка
s3 db 15 dup(?); строка для повторных символов
frmt db "%d",0
Title1 db "lab1",0
len equ $-s1
.code
start:
cld ;направление обработки строки слева
lea esi, s1
lea edi, s2
mov ecx, len
a:
mov bl, byte ptr [esi]
mov al, byte ptr [edi]
cmp bl, al

jne a1
movsb
jmp a2
a1:
inc esi
inc edi
loop a
a2: inc esi
inc edi
sub ecx,1
cmp ecx,0
jne a1
invoke MessageBoxA,0,offset s3, offset Title1,MB_OK
invoke ExitProcess,0

end start

Вот я не много изменила, он компилирует и линкует но к сожалению не запускает, точнее где то он и запускается, зацикливается и результат не выводит=(
Цветик вне форума Ответить с цитированием
Старый 13.10.2010, 07:03   #5
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,162
По умолчанию

Цветик
можно проще
Код:
.486
.model flat, stdcall
option casemap:none
include \masm32\INCLUDE\windows.inc
includelib \masm32\lib\user32.lib
extern _imp__MessageBoxA@16:dword
.code 
start:	mov ecx,SIZEOF s1
	mov esi,offset s1
	mov edi,offset s2
	mov edx,offset s3
next:	mov al,[esi]
	cmp al,[edi]
	jnz a1
	mov [edx],al
	inc edx
a1:	inc edi
	inc esi
	loop next
end_cmp: push MB_OK
	push offset Title1
	push offset s3
	push 0
	call _imp__MessageBoxA@16
	retn
.data
s1 db "I love you",0 ;исходная строка
s2 db "I need you",0 ;2 исходная строка
s3 db 15 dup(0); строка для повторных символов
Title1 db "lab1",0
end start
Mikl___ вне форума Ответить с цитированием
Старый 13.10.2010, 13:36   #6
Цветик
Пользователь
 
Регистрация: 12.10.2010
Сообщений: 21
По умолчанию

Пожалуйста если кто может нужно переделать из той которая есть
Цветик вне форума Ответить с цитированием
Старый 13.10.2010, 16:31   #7
Vergo
Пользователь
 
Регистрация: 20.09.2010
Сообщений: 38
По умолчанию

Цветик, это минимум изменений с твоим последним кодом:

Код:
   .data
    s1 db "I love you" ;исходная строка    
    s2 db "I need you" ;2 исходная строка  
    s3 db 15 dup(?); строка для повторных символов    
    frmt db "%d",0
    Title1 db "lab1",0

    len equ s2-s1
    
.code 

start: 
    cld             
    lea esi, s1
    lea edi, s2
    lea edx, s3
    mov ecx, len
a: 
    mov bl, byte ptr [esi]
    mov al, byte ptr [edi]
    cmp bl, al 

    jne a1
    mov byte ptr [edx], al
    inc edx
a1: 
    inc esi
    inc edi
    loop a
    
invoke MessageBoxA,0,offset s3, offset Title1, MB_OK 
invoke ExitProcess,0
end start
P.s.: у Mikl фактически то же самое
Vergo вне форума Ответить с цитированием
Старый 13.10.2010, 16:53   #8
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Код:
.data
        s1 db "I love you" ;исходная строка
        len equ $-s1
        s2 db "I need you" ;2 исходная строка
        s3 db 15 dup(?); строка для повторных символов
        Title1 db "lab1",0
 
.code 
start:
        cld ;направление обработки строки слева
        lea esi, s1
        lea edx, s2
        lea edi, s3
        mov ecx, len
a:
        mov al, byte ptr [esi]
        cmp al, byte ptr [edx]
        jne a1
        stosb
 
a1:
        inc esi
        inc edx
        
        loop a
        invoke MessageBoxA,0,offset s3, offset Title1,MB_OK 
        invoke ExitProcess,0
end start
вот так еще
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача со строками. Экзамен! zazzi Помощь студентам 1 03.07.2010 12:37
Delphi. задача со строками SnowFall Помощь студентам 6 13.03.2009 16:50
Задача со строками Panda Помощь студентам 8 02.07.2008 09:10
Задача со строками Klyan Общие вопросы C/C++ 6 21.09.2007 22:22