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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.04.2023, 18:21   #1
ChestIotVaga
Пользователь
 
Регистрация: 21.11.2022
Сообщений: 84
По умолчанию Вставить заданное слово в строку перед заданным словом

помогите в чём проблема : написал код всё слинковал скомпановал но когда запускаю exe файл просто ничего
вот код
Код:
.MODEL SMALL
.STACK 100h
.DATA
    TARGET_STRING DB 'Hello World', '$'
    TARGET_WORD DB 'World', '$'
    INSERT_WORD DB 'Beautiful ', '$'
.CODE
START:
    MOV AX, @DATA
    MOV DS, AX

    ; Найдем место в строке, где нужно вставить слово
    LEA SI, TARGET_STRING
    MOV BX, 0
FIND_WORD:
    LODSB
    CMP AL, 0
    JE NOT_FOUND
    CMP AL, TARGET_WORD[BX]
    JNE NOT_MATCH
    INC BX
    CMP TARGET_WORD[BX], 0
    JE FOUND
    JMP FIND_WORD
NOT_MATCH:
    MOV BX, 0
    JMP FIND_WORD
NOT_FOUND:
    ; Слово не найдено
    JMP DONE

FOUND:
    ; Место в строке найдено, сделаем место для нового слова
    PUSH SI
    MOV CX, 0
    LEA DI, TARGET_STRING
    ADD DI, BX
    MOV AH, 0
    LODSB
MAKE_SPACE:
    STOSB
    INC CX
    CMP AL, 0
    JE AFTER_MAKE_SPACE
    JMP MAKE_SPACE

AFTER_MAKE_SPACE:
    ; Вставим новое слово
    POP SI
    LEA DI, INSERT_WORD
    LODSB
    MOV AH, 0
INSERT_WORD_LOOP:
    STOSB
    CMP AL, 0
    JE DONE
    LODSB
    JMP INSERT_WORD_LOOP

DONE:
    MOV AH, 4CH
    INT 21H
END START
ChestIotVaga вне форума Ответить с цитированием
Старый 02.04.2023, 18:42   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

1) Вы не выводите строку на экран. В конце не вызываете функцию MOV AH,9;INT 21H
2) Надо резервировать место в строке для добавляемого слова иначе вы сотрёте значения в строках после вашей.

Вот вам полный TASM 5.0. У него в комплекте есть отладчик TD.EXE. Используя его и наблюдая за вашими данными в памяти при пошаговом выполнении программы, вы сможете найти ошибки и наглядно увидеть происходящее.
Вложения
Тип файла: zip DISK1.ZIP (1.34 Мб, 0 просмотров)
Тип файла: zip DISK2.ZIP (1.39 Мб, 0 просмотров)
Тип файла: zip DISK3.ZIP (1.38 Мб, 0 просмотров)

Последний раз редактировалось macomics; 02.04.2023 в 18:50.
macomics вне форума Ответить с цитированием
Старый 02.04.2023, 22:19   #3
ChestIotVaga
Пользователь
 
Регистрация: 21.11.2022
Сообщений: 84
По умолчанию

вот так будет работать теперь?
Код:
.MODEL SMALL
.STACK 100h
.DATA
    TARGET_STRING DB 'Hello World', '$'
    TARGET_WORD DB 'World', '$'
    INSERT_WORD DB 'Beautiful ', '$'
.CODE
START:
    MOV AX, @DATA
    MOV DS, AX

    ; Найдем место в строке, где нужно вставить слово
    LEA SI, TARGET_STRING
    MOV BX, 0
FIND_WORD:
    LODSB
    CMP AL, 0
    JE NOT_FOUND
    CMP AL, TARGET_WORD[BX]
    JNE NOT_MATCH
    INC BX
    CMP TARGET_WORD[BX], 0
    JE FOUND
    JMP FIND_WORD
NOT_MATCH:
    MOV BX, 0
    JMP FIND_WORD
NOT_FOUND:
    ; Слово не найдено
    JMP DONE

FOUND:
    ; Место в строке найдено, сделаем место для нового слова
    PUSH SI
    MOV CX, 0
    LEA DI, TARGET_STRING
    ADD DI, BX
    MOV AH, 0
    LODSB
MAKE_SPACE:
    STOSB
    INC CX
    CMP AL, 0
    JE AFTER_MAKE_SPACE
    JMP MAKE_SPACE

AFTER_MAKE_SPACE:
    ; Вставим новое слово
    POP SI
    LEA DI, INSERT_WORD
    LODSB
    MOV AH, 0
INSERT_WORD_LOOP:
    STOSB
    CMP AL, 0
    JE DONE
    LODSB
    JMP INSERT_WORD_LOOP

DONE:
    ; Выведем измененную строку на экран
    LEA DX, TARGET_STRING
    MOV AH, 9
    INT 21H

    ; Завершение программы
    MOV AH, 4CH
    INT 21H
END START
ChestIotVaga вне форума Ответить с цитированием
Старый 02.04.2023, 22:31   #4
ChestIotVaga
Пользователь
 
Регистрация: 21.11.2022
Сообщений: 84
По умолчанию

вставки слова "Beautiful" перед словом "World" в строке "Hello World". но выводит только слово Hello World помогите пожалуйста с кодом
ChestIotVaga вне форума Ответить с цитированием
Старый 03.04.2023, 02:12   #5
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Код:
.MODEL SMALL
.STACK 100h
.DATA
    TARGET_STRING	DB 'Hello World', '$', 100 dup (0) ; Добавим немного места, чтобы не стирать следующие строки при расширении этой
; Заодно появятся 0 байты, которые вы в программе воспринимаете как конец текста
    TARGET_WORD		DB 'World', 0 ; А тут вообще не было 0 байта, хотя на 0 вы реагируете при поске как на признак окончания строки
    INSERT_WORD		DB 'Beautiful ', 0
.CODE
START:
	MOV	AX, @DATA
	MOV	DS, AX
	MOV	ES, AX
	CLD		; Стоит определить явно направление работы строковых команд

; Найдем место в строке, где нужно вставить слово
	LEA	SI, TARGET_STRING
	MOV	BX, 0
FIND_WORD:
	LODSB
	CMP	AL, 0
	JE	NOT_FOUND
	CMP	AL, TARGET_WORD[BX]
	JNE	NOT_MATCH
	INC	BX
	CMP	TARGET_WORD[BX], 0
	JE	FOUND
	JMP	FIND_WORD
NOT_MATCH:
	MOV	BX, 0
	JMP	FIND_WORD
NOT_FOUND:
    ; Слово не найдено
	JMP	DONE

FOUND:
    ; Место в строке найдено, сделаем место для нового слова

; Это все убираем как непонятную возьню с динамитом
;	PUSH	SI
;	MOV	CX, 0
;	LEA	DI, TARGET_STRING
;	ADD	DI, BX
;	MOV	AH, 0
;	LODSB
;MAKE_SPACE:
;	STOSB
;	INC	CX
;	CMP	AL, 0
;	JE	AFTER_MAKE_SPACE
;	JMP	MAKE_SPACE

;AFTER_MAKE_SPACE:
    ; Вставим новое слово
;	POP	SI
;	LEA	DI, INSERT_WORD
;	LODSB
;	MOV	AH, 0
;INSERT_WORD_LOOP:
;	STOSB
;	CMP	AL, 0
;	JE	DONE
;	LODSB
;	JMP	INSERT_WORD_LOOP

; SI - конец слова в основной строке
; BX - длина слова в строке поиска
; Тогда надо найти конец основной строки и строки для добавления, чтобы определить их длины
	MOV	AL, 0
	OR	CX, -1
	LEA	DI, [INSERT_WORD]
	REPNE	SCASB	; Ищем конец строки (байт равный 0, INSERT_WORD)
	DEC	DI
	LEA	DX, [DI - INSERT_WORD]
	OR	CX, -1
	MOV	DI, SI
	REPNE	SCASB	; Ищем конец строки (байт равный 0, TARGET_STRING)
	DEC	DI
	SUB	SI, BX
	MOV	CX, DI
	SUB	CX, SI
	DEC	DI
	MOV	SI, DI
	ADD	DI, DX
	STD
	REP	MOVSB	; Копируем конец строки, чтобы освободить место для слова
	LEA	DI, [SI + 1]
	LEA	SI, [INSERT_WORD]
	MOV	CX, DX
	CLD
	REP	MOVSB	; Копируем строку INSERT_WORD

DONE:
    ; Выведем измененную строку на экран
	LEA	DX, TARGET_STRING
	MOV	AH, 9
	INT	21H

    ; Завершение программы
	MOV	AH, 4CH
	INT	21H
END START
macomics вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вставить в строке перед заданным словом другое заданное слово Mayrlly Помощь студентам 1 28.04.2020 13:54
Ввести строку и слово. Вставить введенное слово перед самым длинным словом в строке.(программа на си) Кристина1998 Общие вопросы C/C++ 1 20.11.2016 11:15
Ввести строку и слово. Вставить введенное слово перед самым длинным словом в строке.(программа на си) Кристина1998 Помощь студентам 20 07.11.2016 23:39
Вставить заданное слово в строку перед заданным словом Blind Guard Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 07.04.2014 19:56
Вставить в строке перед заданным словом другое заданное слово. Axrik Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 23.04.2013 02:42