Объединение двух строк - 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
, что означает длину новой строки.
- Задаёт
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д