@ChastIOtvaga

Вставку слова перед заданным словом?

помогите хотел сделать вставку слова перед заданным словом но почему то выводит только Hello World А хотел Hello Beautiful World помогите с кодом в идеале дайте исправленый код
.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
  • Вопрос задан
  • 62 просмотра
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
TARGET_WORD DB 'World', '$'

Твой TARGET_WORD не заканчивается нулём, а условие успешного окончания поиска у тебя такое:

CMP TARGET_WORD[BX], 0
JE FOUND


Ну и дальше тоже не всё гладко:

LEA DI, TARGET_STRING
ADD DI, BX

BX в случае успеха -- это длина искомой строки, если её прибавить к TARGET_STRING, то получится какая-то фигня, если искомая строка была не в начале TARGET_STRING (как у тебя).

CMP AL, 0
JE AFTER_MAKE_SPACE

И TARGET_STRING у тебя не заканчивается нулём, так что этот цикл будет работать дольше чем надо.

STOSB

Ты не загрузил в ES сегмент в котором лежит TARGET_STRING.

LEA DI, INSERT_WORD
LODSB
MOV AH, 0
INSERT_WORD_LOOP:
STOSB

У тебя здесь перепутаны местами SI и DI, ты копируешь TARGET_STRING в INSERT_WORD, а не наоборот.

в идеале дайте исправленый код

С этим на фриланс.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы