Консультация № 154900
18.12.2008, 20:38
0.00 руб.
0 4 1
Помогите сделать пожалуйста!!Объединить ASCIIZ-строки с адресами в AX и DX в одну по адресу в АХ. Признаком конца строки является нулевой ASCII-символ. Делал оператором movsb только заменяет строку

Обсуждение

давно
Посетитель
7438
7205
19.12.2008, 05:18
общий
это ответ
Здравствуйте, Artem--ua!
Примерно так. Сначала ищем конец первой, потом добавляем вторую.
Предполагаем, что ES указывает на сегмент данных
Код:
mov di, ax ; адрес сроки, куда добавляем
mov al,0 ; ищем конечный нулевой байт
mov cx,0ffffh ; заведомо большая величина
repne scasb ; ищем al в es:di
dec di ; теперь di показывает на 0
mov si, dx ; адрес второй строки
copy_loop: копируем
lodsb
stosb
cmp al,0 ; проверим на последний 0
jne copy_loop
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
19.12.2008, 19:28
общий
Здравствуйте!
Ну я так понял, что должен получиться вот такой код:
Код:
;LABA2
COD SEGMENT
ASSUME CS:COD,DS:DAT1,ES:DAT2
COPY PROC
MOV DI, AX ; адрес сроки, куда добавляем
mov AL,0 ; ищем конечный нулевой байт
mov CX,0FFFFH ; заведомо большая величина
REPNE SCASB ; ищем al в es:di
DEC DI ; теперь di показывает на 0
MOV SI, DX ; адрес второй строки
COPY_LOOP: ;копируем
LODSB
STOSB
CMP AL,0 ; проверим на последний 0
JNE COPY_LOOP
JE BREAK
BREAK:
RET
COPY ENDP
BEGIN: MOV AX,DAT1
MOV DS,AX
MOV AX,DAT2
MOV ES,AX
LEA AX, WORDS1
LEA DX, WORDS2
CALL COPY
MOV AX, 0900h
MOV DX, OFFSET WORDS1
INT 21H
MOV AX, 4C00H
INT 21H

COD ENDS


DAT1 SEGMENT
WORDS1 DB 'FIRST LINE$'
DAT1 ENDS

DAT2 SEGMENT
WORDS2 DB 'SECOND LINE$'
DAT2 ENDS

STK SEGMENT
DB 256 DUP(?)
STK ENDS

END BEGIN

Выводит только первую строку!
давно
Посетитель
7438
7205
20.12.2008, 01:11
общий
Когда я говорил, что "Предполагаем, что ES указывает на сегмент данных", я имел в виду,
что и DS указывает на тот же сегмент данных.
Когда используютя разные сегменты, надо писать по-другому.
Для Вашего случая, например, так:
Код:
;LABA2
COD SEGMENT
ASSUME CS:COD,DS:DAT1,ES:DAT2
COPY PROC
MOV SI, AX ; адрес сроки, куда добавляем
SEARCH_LOOP:
CMP BYTE PTR [SI], '$' ; ищем конечный байт
JE COPY_START
INC SI
JMP SEARCH_LOOP
COPY_START:
MOV DI, DX ; адрес второй строки
COPY_LOOP: ;копируем
MOV AL, ES:[DI]
INC DI
MOV [SI], AL
INC SI
CMP AL,'$' ; проверим на последний '$'
JNE COPY_LOOP
RET
COPY ENDP
BEGIN: MOV AX,DAT1
MOV DS,AX
MOV AX,DAT2
MOV ES,AX
LEA AX, WORDS1
LEA DX, WORDS2
CALL COPY
MOV AX, 0900h
MOV DX, OFFSET WORDS1
INT 21H
MOV AX, 4C00H
INT 21H

COD ENDS


DAT1 SEGMENT
WORDS1 DB 'FIRST LINE$'
DAT1 ENDS

DAT2 SEGMENT
WORDS2 DB 'SECOND LINE$'
DAT2 ENDS

STK SEGMENT
DB 256 DUP(?)
STK ENDS

END BEGIN

Кроме того, изначально предполагалось, что строки заканчиваются на нулевой байт,
у Вас же на $
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Неизвестный
20.12.2008, 02:49
общий
Спасибо!!! Очень помогли! А насчет "что строки заканчиваются на нулувой байт,
у Вас же на $" это я понял, я потом заменил! Еще раз спасибо!
Форма ответа