Объединение двух строк - Assembler

Узнай цену своей работы

Формулировка задачи:

Заданы 2 строки, в которых символы упорядочены в порядке возрастания кодов. Объединить их в одну строку, сохранив упорядоченность. Помогите пожалуйста , написал не пойму где неправильно.
Листинг программы
  1. .386
  2. .model flat,stdcall
  3. option casemap:none
  4. include c:\masm32\include\windows.inc
  5. include c:\masm32\include\user32.inc
  6. include c:\masm32\include\kernel32.inc
  7. includelib c:\masm32\lib\user32.lib
  8. includelib c:\masm32\lib\kernel32.lib
  9. include c:\masm32\include\msvcrt.inc
  10. includelib c:\masm32\lib\msvcrt.lib
  11. .data
  12. mas db -2,-7,-9,7
  13. s1 db '456',0
  14. s2 db '123',0
  15. fmt db 'Hello mafaka',10,13,0
  16. string db 7 dup(?)
  17. .code
  18. start:
  19. lea si,s1
  20. lea di,string
  21. mov bx,di
  22. lea di,s2
  23. mov dx,0;
  24. mov cx,0;
  25.  
  26. logic:
  27. lodsb;
  28. dec si;
  29. mov cl,al;
  30. or cl,cl;
  31. jz S2mS1;
  32. push si;
  33. mov si,di;
  34. lodsb;
  35. dec si;
  36. mov dl,al;
  37. or dl,dl;
  38. jz S1mS2;
  39. pop si;
  40. or si,di;
  41. jz printt
  42. sub dl,dl;
  43. sub cl,cl;
  44.  
  45. cmpsb
  46. jz S1eS2;
  47. jb S1mS2;
  48. ja S2mS1;
  49.  
  50. S1mS2:
  51. dec si;
  52. lodsb;
  53. push di;
  54. mov di,bx;
  55. stosb;
  56. mov bx,di;
  57. pop di;
  58. jmp logic;
  59.  
  60. S2mS1:
  61. push si;
  62. push di;
  63. mov si,di
  64. dec si;
  65. lodsb;
  66. mov di,bx;
  67. stosb;
  68. mov bx,di;
  69. pop di;
  70. pop si;
  71. jmp logic;
  72. S1eS2:
  73. push di;
  74. dec si;
  75. lodsb;
  76. mov di,bx;
  77. stosb;
  78. mov bx,di;
  79. pop di;
  80. push si;
  81. mov si,di;
  82. dec si;
  83. lodsb;
  84. pop si;
  85. push di;
  86. mov di,bx;
  87. stosb;
  88. mov bx,di;
  89. pop di;
  90. jmp logic;
  91. printt:
  92. mov al,0;
  93. mov di,bx;
  94. stosb;
  95. invoke crt_printf,addr string
  96. INVOKE ExitProcess, 0
  97. end start

Решение задачи: «Объединение двух строк»

textual
Листинг программы
  1. ; Будем считать, что строки одинаковой длины
  2. s1   db   '456',0          ;
  3. s2   db   '123',0          ;
  4. len  equ  ($-s2)-1         ;длина одной строки (без нуля в конце)
  5.  
  6. start:
  7.      mov   ecx,len         ;ECX = кол-во байт для копирования.
  8.      lea   edi,[s2]        ;приёмник -
  9.      dec   edi             ;    - конец первой строки.
  10.      lea   esi,[s2]        ;источник - вторая строка.
  11.      rep   movsb           ;скопировать ECX-байт из ESI в EDI
  12.      xor   al,al           ;AL = 0 (нуль-терминал)
  13.      stosb                 ;вставим его в хвост строки.
  14.      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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут