Переставить первое и последнее слово в строке - Assembler

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

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

Необходимо переставить первое и последнее слово в строке. Как реализовать?

Решение задачи: «Переставить первое и последнее слово в строке»

textual
Листинг программы
  1. .model small
  2.  
  3. .data
  4. var db 'one two three four five'
  5. len = $ - var
  6.  
  7. .stack 100h
  8.    
  9. .code
  10. start:
  11. mov ax,@data
  12. mov ds,ax
  13. mov es,ax
  14.  
  15. lea si,var
  16. mov di,si
  17. add di,len-1
  18. mov cx,len
  19. firtoend:
  20. mov al,byte ptr [si]
  21.  
  22. cmp al,' '
  23. jnz firword
  24.  
  25. mov bx,1
  26.  
  27. push si
  28. push bx
  29.  
  30. jmp init1
  31.  
  32. firword:
  33. push si
  34. push cx
  35.  
  36. init1:
  37. lea si,var+1
  38. mov cx,len
  39. shift:
  40. mov ah,byte ptr [si]
  41. mov byte ptr [si-1],ah
  42.  
  43. inc si
  44. loop shift
  45.  
  46. pop cx
  47.  
  48. cmp cx,len
  49. jnz nospace
  50.  
  51. mov byte ptr [di],' '
  52.  
  53. nospace:
  54. pop si
  55.  
  56. mov byte ptr [di+1],al
  57.  
  58. loop firtoend
  59.  
  60. std
  61. mov al,' '
  62. lea di,var
  63. add di,len-1
  64. mov cx,len
  65. repne scasb
  66. push di
  67. mov bx,cx
  68. dec bx
  69. repne scasb
  70. push cx
  71. inc cx
  72.  
  73. xor di,di
  74.  
  75. label1:
  76. push di
  77. push cx
  78.  
  79. mov al,byte ptr [di]
  80.  
  81. mov di,1
  82. mov cx,bx
  83. shift2:
  84. mov ah,byte ptr [di]
  85. mov byte ptr [di-1],ah
  86.  
  87. inc di
  88. loop shift2
  89.  
  90. mov byte ptr [di-1],al
  91.  
  92. pop cx
  93. pop di
  94. loop label1
  95.  
  96. pop cx
  97. pop di
  98.  
  99. middle:
  100. mov ah,byte ptr [di-1]
  101. mov byte ptr [di],ah
  102.  
  103. dec di
  104. loop middle
  105.  
  106. mov byte ptr [di],' '
  107.  
  108. mov ah,4Ch
  109. mov al,00h
  110. int 21h    
  111. end start

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

  1. Объявляется начало блока данных .model small
  2. Задаются данные переменной var: var db 'one two three four five' и её длина len = $ - var
  3. Определяется стек: .stack 100h
  4. Начало кода start:
  5. Устанавливаются указатели на сегмент данных: mov ax,@data, mov ds,ax, mov es,ax
  6. Указатели si и di устанавливаются в начало строки и в конец строки, соответственно
  7. Итерация через каждый символ в строке a. Проверка, равен ли текущий байт пробелу: cmp al, ' ', jnz firword b. Если найден пробел, сохраняется указатель на текущее слово и размер этого слова в стеке: push si, push cx, push si, push bx c. Сдвиг каждого символа на 1 позицию влево, начиная со следующего после пробела символа, и повторение этого для каждого слова (цикл firword - init1 - shift - nospace) d. Устанавливается пробел после каждого слова e. Повторение этого процесса до тех пор, пока не будут переставлены все слова
  8. Уставновка флага направления std
  9. Перестановка слов в обратном порядке a. Находится конец строки и сохраняется его указатель в стеке: push di, push cx, push di, push bx b. Копирование каждого символа, начиная с конца строки, влево на одну позицию (цикл label1 - shift2) c. Отражение слов в обратном порядке
  10. Вывод сообщения и завершение программы

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


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

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

14   голосов , оценка 4.143 из 5

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

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

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