Сдвиг строки?

Тема в разделе "WASM.BEGINNERS", создана пользователем tagegor, 18 дек 2009.

  1. tagegor

    tagegor New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2009
    Сообщения:
    54
    Бьюсь второй день, все никак не могу реализовать сдвиг строки
    То есть вводится строка ~5 цифр, стрелочкой влево сдвигаем курсор. На месте курсора вписываем цифру, и весь ряд дальше должен сдвинуться на одну позицию... Мозг кипит :lol:
    Надеюсь на вашу помосчь ;)
    Код (Text):
    1. data    segment para public 'data'
    2.  
    3. a1  db 256 dup (?)
    4. w   dw 17,19
    5. nb  db ?
    6. ctt db 0
    7. n1 db 0
    8. n2 db 0
    9. gh db 0
    10. gl_poi db 0
    11.  
    12.  
    13. data    ends   
    14.  
    15. stk segment stack
    16.     db  256 dup ('?')
    17. stk ends
    18.  
    19. code    segment para public 'code'
    20.     assume cs:code,ds:data,ss:stk
    21. start:
    22.  
    23. mov ax,data
    24. mov ds,ax
    25.  
    26. mov dl,5
    27. mov dh,10
    28. mov bh,0
    29.  
    30. mov n1,dl
    31. mov n2,dl
    32.  
    33. lea si,a1
    34.  
    35. looper:
    36.                                                                                
    37.     mov ah,1
    38.     int 16h
    39. jnz looper
    40.  
    41.     mov ah,0
    42.     int 16h
    43.     inc nb
    44.     cmp ah,1Ch                                                                         
    45. jnz e3
    46.     jmp fastend
    47. e3:
    48.  
    49.     cmp ah,14   ; backspace
    50. jnz e4
    51.     jmp fastend
    52. e4:
    53.     cmp ah,4Bh   ; left arrow
    54. jz cursorleft
    55.     cmp ah,4Dh   ; right arrow
    56. jz cursorright
    57.     cmp al,30h  ;0<>
    58. jl looper
    59.     cmp al,39h  ;9<>
    60. jg looper
    61.    
    62.     mov cl,10
    63.     cmp cl,nb
    64.    
    65. jz edndof
    66.  
    67. jmp vivod
    68.  
    69. cursorleft:
    70.     dec ctt
    71.     dec dl
    72.     mov ah,2
    73.     int 10h
    74. jmp looper
    75.  
    76.  
    77.  
    78. cursorright:
    79.     inc ctt
    80.     inc dl
    81.     mov ah,2
    82.     int 10h
    83. jmp looper
    84.  
    85. sdvig:
    86.  
    87.     mov di,si
    88.     mov cl,n2
    89.     mov gh,cl
    90.     sub gh,dl  
    91.     sub cx,cx
    92.     mov cl,gh
    93.    
    94. metka:
    95.  
    96.  
    97.     mov al,[di]
    98.     mov [di+1],al
    99.     mov dl,n2
    100.    
    101.     mov ah,2
    102.     int 10h
    103.     mov ah,9
    104.     push cx
    105.     mov cx,1
    106.     int 10h
    107.     pop cx
    108.     dec dl
    109.     dec di
    110.    
    111.  
    112. loop metka
    113. jmp looper
    114.  
    115.  
    116. vivod:
    117.  
    118.     cmp ctt,0  
    119.     jl sdvig
    120.    
    121.     inc n2
    122.        
    123.     mov dl,n2
    124.    
    125.     mov ah,2
    126.     int 10h
    127.     mov ah,9
    128.     mov [si],al
    129.     mov cx,1
    130.     mov bl,0C3h
    131.     int 10h
    132.     inc si
    133.     ;inc dl
    134. jmp looper
    135.  
    136.  
    137. edndof:
    138.  
    139. jmpdf:
    140. jmp jmpdf
    141.  
    142. fastend:
    143.  
    144. mov ax,4c00h    
    145. int 21h    
    146. code    ends
    147. end start
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    первое, что приходит на ум - копируй остаток строки в локальный буфер, потом вставляй новый символ, потом вставляй этот остаток строки.
    Читать твой код мне было просто влом :)
     
  3. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    в разных случаях по разному. в простейших случаях, при коротких текстах - сдвиг хвоста сзаду и до места вставки. в более сложных и объемных - через дерево вставок или список страниц
     
  4. FLASH300

    FLASH300 New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2008
    Сообщения:
    72
    В простом случае это выглядит так:
    (кусок кода из моего недоделанного псевдоредактора) :)

    Код (Text):
    1.      inc SizeStr   ;увеличить размер строки
    2.        movzx ecx,SizeStr ;ecx размер строки
    3.  
    4.        mov edi,offset PBUFFFER2  ;edi адрес начала строки
    5.  
    6.        add edi,ecx   ;edi адрес последнего байта измененной строки
    7.        ;следим за размером буфера
    8.        sub ecx,cursor  ;вычесть из строки смещение курсора
    9.        mov esi,edi
    10.        dec esi      ;esi адрес последнего байта первоначальной строки
    11.        ;адрес чтения и записи отличаются на 1 байт
    12.  
    13.        std         ; уменьшение адреса
    14.        rep movsb   ; сдвинем часть строки на 1 в право (осторожно копируем с права на лева по "1 элементу")
    15.        cld         ; увеличение адреса
    16.  
    17.        mov [edi],al ; запишем пришедший байт (он все это время был в al)
    18.  
    19.        inc cursor   ; увеличить смещение курсора