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