Объединение двух строк - 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)

Объяснение кода листинга программы

  1. Объединение двух строк одинаковой длины.
  2. Строки представлены в виде массивов байтов, завершающихся нулевым символом.
  3. Переменная len содержит длину одной строки (без нуля в конце).
  4. Первая строка s1 начинается с адреса 0, вторая строка s2 начинается с адреса len+1.
  5. Код выполняет следующие действия:
    • Задаёт ecx равным len, что означает количество байт для копирования.
    • Устанавливает edi равным len+1, что означает конец первой строки.
    • Устанавливает esi равным len+1, что означает начало второй строки.
    • Копирует len байт из s2 в s1 с помощью инструкции rep movsb.
    • Устанавливает al равным нулю, что означает нуль-терминал.
    • Вставляет нуль-терминал в конец строки с помощью инструкции stosb.
    • Устанавливает ecx равным len*2, что означает длину новой строки.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.727 из 5