Ввод и сортировка строки - Assembler

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

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

Добрый день, необходимо обработать строку таким образом: первую треть строки по алфавитному порядку, вторую - по обратному алфавитному и последнюю - каждый символ предыдущим. Как реализовать перевод в ASCII и как можно сравнить два символа?
Листинг программы
  1. StrWork proc
  2. mov dx, offset text2
  3. call WrStr
  4. lea dx, string
  5. mov ah, 0ah
  6. int 21h
  7. xor bx, bx
  8. xor dx, dx
  9. lea si, string
  10. strloop:lodsb
  11. cmp al, 0dh
  12. je strend
  13. inc cl
  14. jmp strloop
  15. strend: mov ax, cl
  16. mov bl, 3
  17. div bl
  18. xor bl, bl
  19. str1:
  20. inc bl
  21. cmp bl, al
  22. jl str1
  23. push cl
  24. sub cl, al
  25. mov al, cl
  26. pop cl
  27. str2:
  28. inc bl
  29. cmp bl, al
  30. jl str2
  31. str3:
  32. inc bl
  33. cmp bl, cl
  34. jl str3
  35. StrWork endp
Листинг программы
  1. StrWork proc
  2. mov dx, offset text2
  3. call WrStr
  4. lea dx, string
  5. mov ah, 0ah
  6. int 21h
  7. xor cl, cl
  8. xor bx, bx
  9. xor dx, dx
  10. lea si, string
  11. strloop:lodsb
  12. cmp al, 0dh
  13. je strend
  14. inc cl
  15. jmp strloop
  16. strend: mov al, cl
  17. cbw
  18. mov bl, 3
  19. div bl
  20. xor bl, bl
  21. str1: push al
  22. lodsb
  23. sub al, '0'
  24. cmp al,
  25. inc bl
  26. pop al
  27. cmp bl, al
  28. jl str1
  29. push cl
  30. sub cl, al
  31. mov al, cl
  32. pop cl
  33. str2: push al
  34. lodsb
  35. sub al, '0'
  36. inc bl
  37. pop al
  38. cmp bl, ax
  39. jl str2
  40. str3: lodsb
  41. sub al, '0'
  42. sub al, 1
  43. add al, '0'
  44. inc bl
  45. cmp bl, cl
  46. jl str3
  47. StrWork endp
Листинг программы
  1. StrWork proc
  2. mov dx, offset text2
  3. call WrStr
  4. lea dx, string
  5. mov ah, 0ah
  6. int 21h
  7. xor cx, cx
  8. xor bx, bx
  9. xor dx, dx
  10. lea si, string
  11. strloop:lodsb
  12. cmp al, 0dh
  13. je strend
  14. inc dl
  15. jmp strloop
  16. strend: mov al, dl
  17. cbw
  18. mov cx, ax
  19. mov bl, 3
  20. div bl
  21. xor bh, bh
  22. xor bl, bl
  23. mnloop:
  24. str1: push al
  25. lodsb
  26. sub al, '0'
  27. mov bl, al
  28. lodsb
  29. cmp al, bl
  30. jl
  31. pop al
  32. inc bh
  33. cmp bh, al
  34. jl str1
  35. push cl
  36. sub cl, al
  37. mov al, dl
  38. pop cl
  39. str2: push al
  40. lodsb
  41. sub al, '0'
  42. inc bh
  43. pop al
  44. cmp bl, ax
  45. jl str2
  46. str3: lodsb
  47. sub al, '0'
  48. sub al, 1
  49. add al, '0'
  50. inc bh
  51. cmp bh, cx
  52. jl str3
  53. loop mnloop
  54. StrWork endp
Листинг программы
  1. StrWork proc
  2. mov dx, offset text2
  3. call WrStr
  4. push cx dx
  5. call Read_Keys
  6. pop dx cx
  7. strloop:lodsb
  8. cmp al, 0dh
  9. je strend
  10. inc dl
  11. jmp strloop
  12. strend: mov al, dl
  13. cbw
  14. mov cx, ax
  15. mov bx, 3
  16. div bx
  17. mnloop: xor bx, bx
  18. str1: push ax
  19. lodsw
  20. sub ax, '0'
  21. mov bx, ax
  22. lodsb
  23. cmp ax, bx
  24. jl strel1
  25. push cx
  26. mov cx, ax
  27. mov ax, bx
  28. stosb
  29. mov ax, cx
  30. stosb
  31. pop cx
  32. strel1: pop ax
  33. inc bx
  34. cmp bx, ax
  35. jl str1
  36. push cx
  37. sub cx, ax
  38. mov ax, dx
  39. pop cx
  40. str2: push ax
  41. lodsb
  42. sub ax, '0'
  43. mov bx, ax
  44. lodsb
  45. cmp ax, bx
  46. jg strel2
  47. push cx
  48. mov cx, ax
  49. mov ax, bx
  50. stosb
  51. mov ax, cx
  52. stosb
  53. pop cx
  54. strel2: inc bx
  55. pop ax
  56. cmp bx, ax
  57. jl str2
  58. str3: lodsb
  59. sub ax, '0'
  60. sub ax, 1
  61. add ax, '0'
  62. stosb
  63. inc bx
  64. cmp bx, dx
  65. jl str3
  66. loop mnloop
  67. mov dx, offset string
  68. call WrStr
  69. ret
  70. StrWork endp
Листинг программы
  1. StrWork proc
  2. mov dx, offset text2
  3. call WrStr
  4. call Read_Keys
  5. strend: mov al, cl
  6. cbw
  7. mov cx, ax
  8. mov bx, 3
  9. div bx
  10. mnloop: xor bx, bx
  11. str1: push ax
  12. lodsw
  13. sub ax, '0'
  14. mov bx, ax
  15. lodsw
  16. cmp ax, bx
  17. jl strel1
  18. push cx
  19. mov cx, ax
  20. mov ax, bx
  21. stosw
  22. mov ax, cx
  23. stosw
  24. pop cx
  25. strel1: pop ax
  26. inc bx
  27. cmp bx, ax
  28. jl str1
  29. push cx
  30. sub cx, ax
  31. mov ax, dx
  32. pop cx
  33. str2: push ax
  34. lodsw
  35. sub ax, '0'
  36. mov bx, ax
  37. lodsw
  38. cmp ax, bx
  39. jg strel2
  40. push cx
  41. mov cx, ax
  42. mov ax, bx
  43. stosw
  44. mov ax, cx
  45. stosw
  46. pop cx
  47. strel2: inc bx
  48. pop ax
  49. cmp bx, ax
  50. jl str2
  51. str3: lodsw
  52. sub ax, '0'
  53. sub ax, 1
  54. add ax, '0'
  55. stosw
  56. inc bx
  57. cmp bx, dx
  58. jl str3
  59. loop mnloop
  60. mov dx, offset string
  61. call WrStr
  62. ret
  63. StrWork endp
Листинг программы
  1. StrWork proc
  2. push ax bx cx dx si
  3. mov dx, offset text2
  4. call WrStr
  5. call Read_Keys
  6. lea dx, string+2
  7. xor cx, cx
  8. mov cl, string+1
  9. mov al, cl
  10. cbw
  11. mov cx, ax
  12. mov bl, 3
  13. div bl
  14. mov dl, al
  15. xor bl, bl
  16. mov dh, cl
  17. mov ah, dl
  18. strlp: push cx
  19. stlp: lodsb
  20. mov bh, al
  21. lodsb
  22. sub al, '0'
  23. sub bh, '0'
  24. cmp al, bh
  25. jg strels1
  26. mov ch, al
  27. mov al, bh
  28. add al, '0'
  29. stosb
  30. mov al, ch
  31. add al, '0'
  32. stosb
  33. strels1:inc bl
  34. cmp bl, dl
  35. jl stlp
  36. mov dl, dh
  37. sub dl, ah
  38. stlp1: lodsb
  39. mov bh, al
  40. lodsb
  41. sub al, '0'
  42. sub bh, '0'
  43. cmp al, bh
  44. jg strels2
  45. mov ch, al
  46. mov al, bh
  47. add al, '0'
  48. stosb
  49. mov al, ch
  50. add al, '0'
  51. stosb
  52. strels2:inc bl
  53. cmp bl, dl
  54. jl stlp1
  55. stlp2: lodsb
  56. sub al, '0'
  57. sub al, 1
  58. add al, '0'
  59. stosb
  60. inc bl
  61. cmp bl, dl
  62. jl stlp2
  63. inc bl
  64. cmp bl, cl
  65. pop cx
  66. loop strlp
  67. mov ah, 40h
  68. mov dx, 2
  69. int 21h
  70. call Read_Key
  71. pop si dx cx bx ax
  72. ret
  73. StrWork endp

Решение задачи: «Ввод и сортировка строки»

textual
Листинг программы
  1.     LOCALS  @@
  2. sseg     segment  stack 'stack'
  3.            db 512 dup(?)
  4. sseg     ends
  5. ;--------- Поля даних -----
  6. dseg     segment 'data'
  7.    CRLF    db  13, 10, '$'
  8.    string  db 0, 100 dup (?)
  9.    keybuf  db 102, ?, 100 dup (?)
  10.    arr     dw  20 dup(1)
  11.    n=$-arr
  12.    textmenu db 13, 10, 10
  13. db  ' ------------------------------------------------------------¬',13,10
  14. db  ' ¦                          M E N U                          ¦',13,10
  15. db  ' +-----------------------------------------------------------+',13,10
  16. db  ' ¦ 1 - Put the sentence to work over it.                     ¦',13,10
  17. db  ' ¦ 2 - Fullfil an array (Between 0 and 20)                   ¦',13,10
  18. db  ' ¦ 0 - Exit.                                                 ¦',13,10
  19. db  ' L------------------------------------------------------------',13,10,10
  20. db  '          Your choice ? =>','$'
  21.    text0  db    'The amount of negative elements in array is $'
  22.    text1  db    'Enter the values of the elements: $'
  23.    text2  db     'Put the sentence: ','$'
  24.    text3  db     'The new sentence is: ','$'
  25.    text4  db     'Enter amount of elements: $'
  26.    errstr db     'Wrong number. Please, enter right value: $'
  27.    buffer db 7, 8 dup(0)
  28.  
  29. dseg     ends
  30.  
  31. ;---- Текст   програми ---
  32. cseg     segment 'code'
  33.             assume  cs:cseg, ds:dseg, ss:sseg
  34.  
  35. start proc far
  36.           mov   ax, dseg
  37.           mov   ds, ax
  38.           mov dx, 0018h
  39. m:        call ClrScr
  40.           call SetCur
  41.           call Menu
  42.           cmp dl, '1'
  43.           je m1
  44.           cmp dl, '2'
  45.           je m2
  46.           cmp dl, '0'
  47.           jne m
  48.           jmp endprog
  49. m1:       call StrWork
  50.           jmp m
  51. m2:       call FillArr
  52.           jmp m
  53. endprog:  call ClrScr
  54.           call SetCur
  55.           mov ax, 4C00h
  56.           int 21h
  57.   start  endp
  58. ;-------------------------
  59. Menu proc
  60.         mov dx, offset textmenu
  61.         call WrStr
  62.         mov ah, 7
  63. sign0:  int 21h
  64.         cmp al, '0'
  65.         JL sign1
  66.         cmp al, '2'
  67.         JG sign0
  68. sign1:  mov dl, al
  69.         mov ah, 2
  70.         int 21h
  71.         call NewLine
  72.         call NewLine
  73.         ret
  74. Menu endp
  75. ;-------------------------
  76. StrWork proc
  77.     push ax bx cx dx ds es si di
  78.  
  79.         call    ReadString
  80.         call    NewLine
  81.  
  82.         mov     ah,     9
  83.         lea     dx,     String+1
  84.         int     21h
  85.         call    NewLine
  86.  
  87.         ;сортируем первую треть строки по возрастанию
  88.         mov     al,     String  ;находим длину массива
  89.         mov     ah,     0
  90.         mov     cl,     3
  91.         div     cl
  92.         mov     cl,     al
  93.         lea     si,     String+1        ;берём адрес массива
  94.         call    SortIncrease            ;сортируем
  95.  
  96.         ;сортируем вторую треть массива по убыванию
  97.         add     si,     cx
  98.         call    SortDecrease
  99.  
  100.         ;заключительную треть - заменить предыдущим символом
  101.         add     si,     cx
  102.         mov     ax,     cx
  103.         mov     cl,     String+0
  104.         mov     ch,     0
  105.         sub     cx,     ax
  106.         sub     cx,     ax
  107.         call    PrevChars
  108.  
  109.         ;вывод результата
  110.         mov     ah,     9
  111.         lea     dx,     String+1
  112.         int     21h
  113.         call    NewLine
  114.  
  115.     ;ожидание нажатия
  116.     call    Read_Key
  117.  
  118.     pop di si es ds dx cx bx ax
  119.     ret
  120. StrWork endp
  121. ;-------------------------
  122. FillArr proc
  123.          push ax bx cx dx si di
  124.          mov dx, offset text4
  125.          call WrStr
  126.          push bx cx dx di
  127.          call ReadNum
  128.          pop di dx cx bx
  129.          cmp ax, 0
  130.          jl mend
  131.          cmp ax, 20
  132.          jg mend
  133.          lea bx, [arr]
  134.          mov cx, ax
  135.          xor si, si
  136.          push ax
  137. elm:     mov dx, offset text1
  138.          call WrStr
  139.          push bx cx dx si
  140.          call ReadNum
  141.          pop si dx cx bx
  142.          mov [bx+si], ax
  143.          add si, 2
  144.          call NewLine
  145.          loop elm
  146.          pop ax
  147.          mov cx, ax
  148.          call ClrScr
  149.          mov dx, offset text0
  150.          call WrStr
  151.          xor si, si
  152.          mov ax, 0
  153. mloop:   cmp word ptr [bx+si], 0
  154.          jnle melse
  155.          inc ax
  156. melse:   add si, 2
  157.          loop mloop
  158.          call Outpt
  159.          call Read_Key
  160.          pop di si dx cx bx ax
  161. mend:    ret
  162. FillArr endp
  163. ;-------------------------
  164. Outpt proc
  165.         xor cx, cx
  166.         mov bx, 10
  167. ot2:    xor dx, dx
  168.         div bx
  169.         push dx
  170.         inc cx
  171.         test ax, ax
  172.         jnz ot2
  173.         mov ah, 02h
  174. ot3:    pop dx
  175.         add dl, '0'
  176.         int 21h
  177.         loop ot3
  178. Outpt endp
  179. ;-------------------------
  180. ;Чтение строки из консоли клавиатуры)
  181. ;Результат сохраняется в переменной String
  182. формате:
  183. ;String+0 - размер строки
  184. ;String+1 - первый символ строки
  185. ReadString      proc
  186.         ;сохранение регистров
  187.         push    ax
  188.         push    cx
  189.         push    dx
  190.         push    si
  191.         push    di
  192.         push    ds
  193.         push    es
  194.         pushf
  195.         ;чтение строки в буфер ввода KeyBuf
  196.         mov     ah,     0Ah
  197.         lea     dx,     KeyBuf
  198.         int     21h
  199.         ;копирование строки из буфера ввода
  200.         mov     ax,     dseg
  201.         mov     ds,     ax
  202.         mov     es,     ax
  203.         cld
  204.         lea     si,     KeyBuf+1
  205.         lea     di,     String+0
  206.         mov     cl,     KeyBuf+1
  207.         mov     ch,     0
  208.         mov     String, cl
  209.         inc     cx              ;т.к. копируется не только строка, но и байт длины строки
  210.         rep     movsb
  211.         ;добавление в конец строки символа "конец строки" для вывода на экран
  212.         mov     al,     '$'
  213.         stosb
  214.         ;восстановление регистров
  215.         popf
  216.         pop     es
  217.         pop     ds
  218.         pop     di
  219.         pop     si
  220.         pop     dx
  221.         pop     cx
  222.         pop     ax
  223.  
  224.         ret
  225. ReadString      endp
  226. ;-------------------------
  227. ;Сортировка по возрастанию
  228. ;si - адрес 0-го байта
  229. ;cx - количество
  230. SortIncrease    proc
  231.         push    ax
  232.         push    cx
  233.         push    di
  234.         push    si
  235.  
  236.         mov     di,     si
  237.         mov     bx,     cx
  238.         dec     bx
  239. @@ForI:
  240.         mov     cx,     bx
  241.         mov     si,     di
  242.         inc     si
  243. @@ForJ:
  244.         mov     al,     [si]
  245.         cmp     al,     [si-1]
  246.         ja      @@SkipExchange
  247.         xchg    al,     [si-1]
  248.         xchg    al,     [si]
  249. @@SkipExchange:
  250.         inc     si
  251.         loop    @@ForJ
  252.         dec     bx
  253.         mov     cx,     bx
  254.         jnz     @@ForI
  255.  
  256.         pop     si
  257.         pop     di
  258.         pop     cx
  259.         pop     ax
  260.         ret
  261. SortIncrease    endp
  262. ;-------------------------
  263. ;Сортировка по убыванию
  264. ;si - адрес 0-го байта
  265. ;cx - количество
  266. SortDecrease    proc
  267.         push    ax
  268.         push    cx
  269.         push    di
  270.         push    si
  271.  
  272.         mov     di,     si
  273.         mov     bx,     cx
  274.         dec     bx
  275. @@ForI:
  276.         mov     cx,     bx
  277.         mov     si,     di
  278.         inc     si
  279. @@ForJ:
  280.         mov     al,     [si]
  281.         cmp     al,     [si-1]
  282.         jb      @@SkipExchange
  283.         xchg    al,     [si-1]
  284.         xchg    al,     [si]
  285. @@SkipExchange:
  286.         inc     si
  287.         loop    @@ForJ
  288.         dec     bx
  289.         mov     cx,     bx
  290.         jnz     @@ForI
  291.  
  292.         pop     si
  293.         pop     di
  294.         pop     cx
  295.         pop     ax
  296.         ret
  297. SortDecrease    endp
  298. ;-------------------------
  299. PrevChars       proc
  300. @@ForI:
  301.         dec     byte ptr [si]
  302.         inc     si
  303.         loop    @@ForI
  304.         ret
  305. PrevChars       endp
  306. ;-------------------------
  307. Read_Key proc
  308.    push ax
  309.    mov ah, 7
  310.    int 21h
  311.    pop ax
  312.    ret
  313. Read_Key endp
  314. ;-------------------------
  315. ClrScr proc
  316.     push ax bx cx dx
  317.     mov ax, 0600h
  318.     mov bh, 07h
  319.     mov cx, 0000h
  320.     mov dx, 184fh
  321.     int 10h
  322.     pop dx cx bx ax
  323.     ret
  324. ClrScr endp
  325. ;-------------------------
  326. ReadNum proc
  327.            mov ah, 0ah
  328.            xor di, di
  329.            mov dx, offset buffer
  330.            int 21h
  331.            mov dl, 0ah
  332.            mov ah, 02
  333.            int 21h
  334.            mov si, offset buffer+2
  335.            cmp byte ptr [si], "-"
  336.            jnz ii1
  337.            mov di, 1
  338.            inc si
  339. ii1:       xor ax, ax
  340.            mov bx, 10
  341. ii2:       mov cl, [si]
  342.            cmp cl, 0dh
  343.            jz endin
  344.            cmp cl, '0'
  345.            jl error
  346.            cmp cl, '9'
  347.            ja error
  348.            sub cl, '0'
  349.            mul bx
  350.            add ax, cx
  351.            inc si
  352.            jmp ii2
  353. error:     mov dx, offset errstr
  354.            call WrStr
  355.            int 20h
  356. endin:     cmp di, 1
  357.            jnz ii3
  358.            neg ax
  359. ii3:       ret
  360. ReadNum endp
  361. ;-------------------------
  362. SetCur proc
  363.    push ax bx
  364.    mov ah, 02h
  365.    mov bh, 00h
  366.    int 10h
  367.    pop bx ax
  368.    ret
  369. SetCur endp
  370. ;-------------------------
  371. NewLine proc
  372.    push dx
  373.    mov dx, offset CRLF
  374.    call WrStr
  375.    pop dx
  376.    ret
  377. NewLine endp
  378. ;-------------------------
  379.   WrStr  proc near
  380.           mov   ah,09h
  381.           int   21h
  382.           ret
  383.   WrStr  endp
  384. ; ***********************
  385. cseg     ends
  386.          end   start

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


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

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

12   голосов , оценка 4.167 из 5

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

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

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