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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2013, 00:05   #1
Blind Guard
Форумчанин
 
Регистрация: 14.03.2012
Сообщений: 139
По умолчанию Вставить заданное слово в строку перед заданным словом

Здраствуйте.

В программе нужно ввести строку, ввести слово из этой строки и слово, которое вставить перед этим словом в строке.
Не могу понять в чём ошибка.
string — строка.
string_word — слово строки.
word — слово, которое нужно вставить.
Как счётчик использую регистр si. (метка counter)
SSS — здесь должно быть кое-какое смещение, но т.к. регистры si, di заняты, то пока что условное название.

Буду очень благодарен, если кто-нибудь попытается найти ошибку.


Код:
.model small
.stack 100h

.data

    string_request db "Please, enter string:", 0Dh, 0Ah, '$'
    string_word_request db "Please, enter the word from string:", 0Dh, 0Ah, '$'
    word_request db "Please, enter the word:", 0Dh, 0Ah, '$' 
    warning_string db "Invalid Input! Try again:", 0Dh, 0Ah, '$'
    string db 200 dup('$')            
    string_word db 200 dup('$')       
    word db 200 dup('$')  

.code
        
start:

    mov ax, @data
    mov ds, ax
    
    mov dx, offset string_request
    mov ah, 9
    int 21h 
    
    mov ah, 0Ah
    mov dx, offset string
    int 21h 
    
    mov dx, offset string_word_request
    mov ah, 9
    int 21h     

    mov ah, 0Ah
    mov dx, offset string_word
    int 21h                 

    mov dx, offset word_request
    mov ah, 9
    int 21h
    
    mov dx, offset word
    mov ah, 0Ah
    int 21h

    xor si, si             
    mov di, 2       
    jmp c

counter:
    inc di
c:
    cmp word[di], 0dh      
    je end_counter
    inc si
    jmp counter
    
end_counter:    
                          
    inc si                 ; + space
    mov di, 2
    jmp l

last_pos_search:    
    inc di
l:
    cmp string[di], 0dh
    jne last_pos_search

    dec di                ; di point to last string element
    add si, di            ; si point to [last string element + word lenght + space]
    add si, 2

moving_symbols:

    mov bl, string[di]   
    mov string[si], bl 
    dec di
    dec si
    cmp di, SSS           
    je insert_word
    jmp moving_symbols    
    
insert_word:
    mov di, 2
    jmp z1
 z:    
    inc di
 z1:
    mov bl, offset word[di]
    mov string[SSS], bl      
    inc di
    inc SSS                  
    cmp word[di], 0dh
    je insert_space
    cmp SSS, si              
    je insert_space
    jmp z    
  
insert_space:

    mov string[si], ' '

    mov ah, 9
    mov dx, offset string
    int 21h

    int 20h
     
end start

Последний раз редактировалось Blind Guard; 22.04.2013 в 21:52.
Blind Guard вне форума Ответить с цитированием
Старый 22.04.2013, 07:52   #2
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Blind Guard, мои исправления в предыдущем Вашем коде оказались пустыми хлопотами. Здесь повторяются те же ошибки. Регистр bp по умолчанию адресует сегмент стека. Этого достаточно, чтобы код не работал.
vadimych вне форума Ответить с цитированием
Старый 22.04.2013, 16:06   #3
Blind Guard
Форумчанин
 
Регистрация: 14.03.2012
Сообщений: 139
По умолчанию

Странно, я думал этот регистр используется для хранения смещения и индексов.
"Указатель базы", это я пожалуй упустил в определении регистра.
Спасибо за замечание.
Blind Guard вне форума Ответить с цитированием
Старый 22.04.2013, 16:58   #4
Blind Guard
Форумчанин
 
Регистрация: 14.03.2012
Сообщений: 139
По умолчанию

Отредактировал исходный код (см. первое сообщение)
Как счётчик использую регистр si. (метка counter)
SSS — здесь должно быть кое-какое смещение, но т.к. регистры si, di заняты, то пока что условное название.
Возник небольшой вопрос.

Эти строки не хотят работать, объём регистров вроде одинаков (по 16 бит).
Код:
    mov dx, string[di]    
    mov word[si], dx
Но если записать так как показано ниже, то программа запускается (насчёт работоспособности не знаю, проверить не получилось).
Код:
    mov dx, string[di]    
    mov word[si], dh
Заранее спасибо.

Последний раз редактировалось Blind Guard; 22.04.2013 в 21:24.
Blind Guard вне форума Ответить с цитированием
Старый 22.04.2013, 21:53   #5
Blind Guard
Форумчанин
 
Регистрация: 14.03.2012
Сообщений: 139
По умолчанию

Задачу решил, спасибо всем, кто хотел помочь.
Выкладываю сюда код (не оптимизировал), может быть, кому-нибудь поможет.

Задание
Вставить заданное слово в строку перед заданным словом
Код:
.model small
.stack 200h


.data

    string_request db "Please, enter string:", 0Dh, 0Ah, '$'
    string_word_request db "Please, enter the word from string:", 0Dh, 0Ah, '$'
    word_request db "Please, enter the word:", 0Dh, 0Ah, '$' 
    warning_string db "Invalid Input! Try again:", 0Dh, 0Ah, '$'
    string db 200 dup('$')            
    string_word db 200 dup('$')       
    word db 200 dup('$')              

.code
start:        
    mov ax, @data
    mov ds, ax
    
    mov dx, offset string_request
    mov ah, 9
    int 21h 

input_string:                        
    
    mov ah, 0Ah
    mov dx, offset string
    int 21h 

    mov di, 2
    jmp check
    
next_symbol:

    inc di
        
check:  

    cmp string[di], 031
    je next_symbol
    cmp string[di], 0dh
    je string_word_input      
    cmp string[di], 122         
    ja x
    cmp string[di], 091
    je x
    cmp string[di], 092
    je x
    cmp string[di], 093
    je x
    cmp string[di], 094
    je x
    cmp string[di], 095
    je x
    cmp string[di], 096
    je x
    cmp string[di], 048
    je x
    cmp string[di], 049
    je x
    cmp string[di], 050
    je x
    cmp string[di], 051
    je x
    cmp string[di], 052
    je x
    cmp string[di], 053
    je x               
    cmp string[di], 054
    je x
    cmp string[di], 055
    je x
    cmp string[di], 056
    je x
    cmp string[di], 057
    je x  

    jmp next_symbol  
    
x: 
    mov dx, offset warning_string
    mov ah, 9
    int 21h
    jmp input_string
    
string_word_input:                            
     
    mov dx, offset string_word_request
    mov ah, 9
    int 21h

    jmp q
string_word_warning:
    mov dx, offset warning_string
    mov ah, 9
    int 21h             
q: 

swi_without_message:
    
    mov ah, 0Ah
    mov dx, offset string_word
    int 21h 
    
    mov di, 2
    jmp check2

next_symbol_2:

    inc di
        
check2:  

    cmp string_word[di], 0dh
    je check_existence
    cmp string_word[di], 031
    ; по аналогии c check

    jmp next_symbol_2  
    
y: 
    mov dx, offset warning_string
    mov ah, 9
    int 21h
    jmp swi_without_message

check_existence:
    
    mov di, 2             
    mov si, 2             

start_check:   
 
    cmp string[di], ' '         
    jne xx
    inc di
    jmp start_check
        
xx:    
    push di        
xx1: 
    mov bl, string[di]         
    cmp string_word[si], bl
    jne bad_symbol              
     
good_symbol:
    
    inc di
    inc si
    cmp string_word[si], ' '
    je final_check
    cmp string_word[si], 0dh
    je final_check    
    jmp xx1

bad_symbol:
    cmp string_word[si], 0dh
    je string_word_warning
    mov si, 2
a:
    inc di
    cmp string[di],' '
    je start_check
    cmp string[di], 0dh
    je string_word_warning
    jmp a
    
final_check:
         
    cmp string[di],' '
    je win
    cmp string[di], 0dh
    je win
    jmp string_word_warning

win:    

    mov dx, offset word_request
    mov ah, 9
    int 21h

input_word:
    
    mov dx, offset word
    mov ah, 0Ah
    int 21h

new_string_creator: 

    xor si, si
    mov di, 2       
    jmp c

counter:
    inc di
    inc si
c:  
    mov bx, word[di]            
    cmp bh, 0dh      
    jne counter
    
end_counter:    
                                      
    mov di, 2
    jmp l

last_pos_search:    
    inc di
l:
    cmp string[di], 0dh
    jne last_pos_search

    add si, di            ; si point to [last string element + word lenght + space]  
    inc si
    dec di                ; di point to last string element

moving_symbols:

    mov bl, string[di]      
    mov string[si], bl 
    dec di
    dec si 
    pop bx  
    push bx
    cmp di, bx           
    jne moving_symbols    
    mov bl, string[di]      
    mov string[si], bl
    
insert_word:
    mov di, 2
    jmp iw1
 iw:    
    inc di
 iw1:      
    mov dl, offset word[di]
    pop bx 
    push bx
    mov string[bx], dl     
    inc di 
    pop bx
    inc bx                
    push bx
    cmp word[di], 0dh
    je insert_space
    pop bx
    push bx
    cmp bx, si              
    je insert_space
    jmp iw1    
  
insert_space:
    
    dec si
    mov string[si], ' '
    
    mov ah, 9
    mov dx, offset string
    int 21h

int 20h     
end start

Последний раз редактировалось Blind Guard; 23.04.2013 в 02:43.
Blind Guard вне форума Ответить с цитированием
Старый 07.04.2014, 19:56   #6
AlexeyAs
Новичок
Джуниор
 
Регистрация: 07.04.2014
Сообщений: 1
По умолчанию

почему не выводится отредактированная строка?
AlexeyAs вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вставить в строке перед заданным словом другое заданное слово. Axrik Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 23.04.2013 02:42
Вставить нулевую строку и нулевой столбец перед строкой и столбцом где находится первый минимальный элемент Proskurina Помощь студентам 1 03.03.2013 19:24
Перед строкой содержащей слово, являющееся последним словом по алфавиту во всем тексте, вставить строку (Java) papikyandgan Помощь студентам 8 13.11.2011 17:55
Вставить слово в строку VictorM Microsoft Office Excel 2 17.02.2009 21:45