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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2009, 16:54   #1
Журенова Катя
 
Регистрация: 23.04.2009
Сообщений: 5
Восклицание Ввод-вывод, работа со строками (ассемблер, DOS)

Ввести с клавиатуры две строки. Сравнить их. Вывести на экран но-мер начала второй строки в первой. ПОМОГИТЕ написать программу.
(тема прерывания, Обработка символьной информации с помощью функций DOS
Журенова Катя вне форума Ответить с цитированием
Старый 23.04.2009, 17:13   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну со вводом прерываниями не скажу (долго писать) но...
Могу предложить такой пример из MASMLIB для определения вхождения подстроки в строку
Код:
	.486
	.model flat,stdcall
	option casemap:none
 ; 	include d:\masm32\include\masm32.inc
;	includelib d:\masm32\lib\masm32.lib
StrLen PROTO :DWORD

.data
 s1 db "qwerty",0
 s2 db "rt",0
.code
InString2 proc startpos:DWORD,lpSource:DWORD,lpPattern:DWORD

  ; ------------------------------------------------------------------
  ; InString searches for a substring in a larger string and if it is
  ; found, it returns its position in eax.
  ;
  ; It uses a one (1) based character index (1st character is 1,
  ; 2nd is 2 etc...) for both the "StartPos" parameter and the returned
  ; character position.
  ;
  ; Return Values.
  ; If the function succeeds, it returns the 1 based index of the start
  ; of the substring.
  ;  0 = no match found
  ; -1 = substring same length or longer than main string
  ; -2 = "StartPos" parameter out of range (less than 1 or longer than
  ; main string)
  ; ------------------------------------------------------------------

    LOCAL sLen:DWORD
    LOCAL pLen:DWORD

    push ebx
    push esi
    push edi

    invoke StrLen,lpSource
    mov sLen, eax           ; source length
    invoke StrLen,lpPattern
    mov pLen, eax           ; pattern length

    cmp startpos, 1
    jge @F
    mov eax, -2
    jmp isOut               ; exit if startpos not 1 or greater
  @@:

    dec startpos            ; correct from 1 to 0 based index

    cmp  eax, sLen
    jl @F
    mov eax, -1
    jmp isOut               ; exit if pattern longer than source
  @@:

    sub sLen, eax           ; don't read past string end
    inc sLen

    mov ecx, sLen
    cmp ecx, startpos
    jg @F
    mov eax, -2
    jmp isOut               ; exit if startpos is past end
  @@:

  ; ----------------
  ; setup loop code
  ; ----------------
    mov esi, lpSource
    mov edi, lpPattern
    mov al, [edi]           ; get 1st char in pattern

    add esi, ecx            ; add source length
    neg ecx                 ; invert sign
    add ecx, startpos       ; add starting offset

    jmp Scan_Loop

    align 16

  ; @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

  Pre_Scan:
    inc ecx                 ; start on next byte

  Scan_Loop:
    cmp al, [esi+ecx]       ; scan for 1st byte of pattern
    je Pre_Match            ; test if it matches
    inc ecx
    js Scan_Loop            ; exit on sign inversion

    jmp No_Match

  Pre_Match:
    lea ebx, [esi+ecx]      ; put current scan address in EBX
    mov edx, pLen           ; put pattern length into EDX

  Test_Match:
    mov ah, [ebx+edx-1]     ; load last byte of pattern length in main string
    cmp ah, [edi+edx-1]     ; compare it with last byte in pattern
    jne Pre_Scan            ; jump back on mismatch
    dec edx
    jnz Test_Match          ; 0 = match, fall through on match

  ; @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

  Match:
    add ecx, sLen
    mov eax, ecx
    inc eax
    jmp isOut

  No_Match:
    xor eax, eax

  isOut:
    pop edi
    pop esi
    pop ebx

    ret

InString2 endp

start:


 invoke InString2,1,ADDR s1,ADDR s2
 ;В EAX находится позиция вхождения строки


ret
end start
I'm learning to live...

Последний раз редактировалось Stilet; 23.04.2009 в 17:16.
Stilet вне форума Ответить с цитированием
Старый 24.04.2009, 08:42   #3
airyashov
Форумчанин
 
Регистрация: 02.04.2008
Сообщений: 358
По умолчанию

пишите договоримся
airyashov(а)inbox.ru
icq:3(один)7748666
неплохо пишу на ассемблере для 80х86
icq: 3(один)7748666
mail: airyashov(а)inbox.ru
airyashov вне форума Ответить с цитированием
Старый 24.04.2009, 22:13   #4
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

Можно было сделать короче, но тогда бы каша получилась.

Код:
.model	small
.stack	100h
.data
MaxLen1 db 255                  ;структура....
Len1 db 0                          ;....первой....
string1 db 254 dup (0)         ;...... строки

MaxLen2 db 255                  ;структура....
Len2 db 0                          ;....второй.....
string2 db 254 dup (0)         ;....строки

msgInp1 db 'Input first string:$'
msgInp2 db 'Input second string:$'

msgNo db 'First string not included in second string!$'
msgYes db 'First string included in second string at '
Num db 0,0,0,'$'

.code
;************** Главная процедура *************
start proc
mov	ax,@data
mov	ds,ax
mov	es,ax
xor	ax,ax

call InputProc
call Check

mov	ax,4c00h
int	21h
ret
endp

;*************/Главная процедура**********

;***********Процедура перевода строки**********
NewStr proc
mov dl,10
mov ah,2
int 21h
ret
endp
;***********/Процедура перевода строки**********

;***********Процедура вывода сообщения (в dx-адрес)**********
OutMsg proc
mov ah,9
int 21h
ret
endp
;***********/Процедура вывода сообщения (в dx-адрес)**********

;***********Процедура ввода строки (в dx-адрес начала структуры)***
inputStr proc
mov ah,0Ah
int 21h
ret
endp
;***********/Процедура ввода строки (в dx-адрес начала структуры)***

;**********Процедура ввода********
InputProc proc
mov dx,offset msgInp1                     ;приглашение ввода.....
call OutMsg                                    ;....первой строки
mov dx,offset MaxLen1                     ;ввод......
call inputStr                                    ;....первой строки
call newStr                                     ;перевод каретки на новую строку
mov dx,offset msgInp2                     ;приглашение ввода.....
call OutMsg                                    ;.....второй строки
mov dx,offset MaxLen2                     ;ввод......
call inputStr                                    ;....второй строки
call newStr                                     ;перевод каретки на новую строку
ret
endp
;**********/Процедура ввода********

;**********Процедура проверки**********
Check proc
mov al,Len1
cmp al,Len2
ja CheckNo
mov al,string1[0]
mov di,offset string2
mov bx,di
xor cx,cx
mov cl,Len2
sub cl,Len1
inc cl
CheckLoop:
cld
repne scasb
jne CheckNo
call podCheck
test si,si
jz CheckYes
jmp CheckLoop
CheckYes:
mov dx, offset msgYes
mov ax,di
sub ax,bx
call Convert
jmp exitCheck
CheckNo:
mov dx,offset msgNo
exitCheck:
call OutMsg
ret
endp
;**********/Процедура проверки**********

;**********Процедура подпроверки********
podCheck proc
push cx
push di
dec di
mov si,offset string1
mov cl,Len1
cld
repe cmpsb
jne notPodCheck
xor si,si
jmp exitPodCheck
notPodCheck:
mov si,1
exitPodCheck:
pop di
pop cx
ret
endp
;**********/Процедура подпроверки********

;*********Процедура преобразования байта в символьную форму****
Convert proc
mov si,offset Num+2
mov bx,10
loopConv:
div bl
add ah,'0'
mov [si],ah
xor ah,ah
test al,al
jz exitConv
jmp LoopConv
exitConv:
ret
endp
;*********/Процедура преобразования байта в символьную форму****
end	start
Надо бы избавиться от привычки ставить многоточие.....
Min вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввод с клавиатуры и поиск/Assembler/TASM for Dos Rifler Помощь студентам 8 03.09.2010 08:22
работа со строками (ассемблер) ilya107 Помощь студентам 2 13.03.2009 19:36
Ввод/Вывод данных.Лабораторная работа. kry Общие вопросы C/C++ 1 03.03.2009 11:03
Ассемблер - вывод факториала Voortex Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 8 07.12.2008 12:29