Объединение двух строк - Assembler
Формулировка задачи:
Заданы 2 строки, в которых символы упорядочены в порядке возрастания кодов. Объединить их в одну строку, сохранив упорядоченность. Помогите пожалуйста , написал не пойму где неправильно.
.386
.model flat,stdcall
option casemap:none
include c:\masm32\include\windows.inc
include c:\masm32\include\user32.inc
include c:\masm32\include\kernel32.inc
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
include c:\masm32\include\msvcrt.inc
includelib c:\masm32\lib\msvcrt.lib
.data
mas db -2,-7,-9,7
s1 db '456',0
s2 db '123',0
fmt db 'Hello mafaka',10,13,0
string db 7 dup(?)
.code
start:
lea si,s1
lea di,string
mov bx,di
lea di,s2
mov dx,0;
mov cx,0;
logic:
lodsb;
dec si;
mov cl,al;
or cl,cl;
jz S2mS1;
push si;
mov si,di;
lodsb;
dec si;
mov dl,al;
or dl,dl;
jz S1mS2;
pop si;
or si,di;
jz printt
sub dl,dl;
sub cl,cl;
cmpsb
jz S1eS2;
jb S1mS2;
ja S2mS1;
S1mS2:
dec si;
lodsb;
push di;
mov di,bx;
stosb;
mov bx,di;
pop di;
jmp logic;
S2mS1:
push si;
push di;
mov si,di
dec si;
lodsb;
mov di,bx;
stosb;
mov bx,di;
pop di;
pop si;
jmp logic;
S1eS2:
push di;
dec si;
lodsb;
mov di,bx;
stosb;
mov bx,di;
pop di;
push si;
mov si,di;
dec si;
lodsb;
pop si;
push di;
mov di,bx;
stosb;
mov bx,di;
pop di;
jmp logic;
printt:
mov al,0;
mov di,bx;
stosb;
invoke crt_printf,addr string
INVOKE ExitProcess, 0
end startРешение задачи: «Объединение двух строк»
textual
Листинг программы
; Будем считать, что строки одинаковой длины s1 db '456',0 ; s2 db '123',0 ; len equ ($-s2)-1 ;длина одной строки (без нуля в конце) start: mov ecx,len ;ECX = кол-во байт для копирования. lea edi,[s2] ;приёмник - dec edi ; - конец первой строки. lea esi,[s2] ;источник - вторая строка. rep movsb ;скопировать ECX-байт из ESI в EDI xor al,al ;AL = 0 (нуль-терминал) stosb ;вставим его в хвост строки. lea ecx,[len*2] ;длина новой строки (S1)
Объяснение кода листинга программы
- Объединение двух строк одинаковой длины.
- Строки представлены в виде массивов байтов, завершающихся нулевым символом.
- Переменная
lenсодержит длину одной строки (без нуля в конце). - Первая строка
s1начинается с адреса 0, вторая строкаs2начинается с адресаlen+1. - Код выполняет следующие действия:
- Задаёт
ecxравнымlen, что означает количество байт для копирования. - Устанавливает
ediравнымlen+1, что означает конец первой строки. - Устанавливает
esiравнымlen+1, что означает начало второй строки. - Копирует
lenбайт изs2вs1с помощью инструкцииrep movsb. - Устанавливает
alравным нулю, что означает нуль-терминал. - Вставляет нуль-терминал в конец строки с помощью инструкции
stosb. - Устанавливает
ecxравнымlen*2, что означает длину новой строки.
- Задаёт