Бьюсь второй день, все никак не могу реализовать сдвиг строки То есть вводится строка ~5 цифр, стрелочкой влево сдвигаем курсор. На месте курсора вписываем цифру, и весь ряд дальше должен сдвинуться на одну позицию... Мозг кипит Надеюсь на вашу помосчь Код (Text): data segment para public 'data' a1 db 256 dup (?) w dw 17,19 nb db ? ctt db 0 n1 db 0 n2 db 0 gh db 0 gl_poi db 0 data ends stk segment stack db 256 dup ('?') stk ends code segment para public 'code' assume cs:code,ds:data,ss:stk start: mov ax,data mov ds,ax mov dl,5 mov dh,10 mov bh,0 mov n1,dl mov n2,dl lea si,a1 looper: mov ah,1 int 16h jnz looper mov ah,0 int 16h inc nb cmp ah,1Ch jnz e3 jmp fastend e3: cmp ah,14 ; backspace jnz e4 jmp fastend e4: cmp ah,4Bh ; left arrow jz cursorleft cmp ah,4Dh ; right arrow jz cursorright cmp al,30h ;0<> jl looper cmp al,39h ;9<> jg looper mov cl,10 cmp cl,nb jz edndof jmp vivod cursorleft: dec ctt dec dl mov ah,2 int 10h jmp looper cursorright: inc ctt inc dl mov ah,2 int 10h jmp looper sdvig: mov di,si mov cl,n2 mov gh,cl sub gh,dl sub cx,cx mov cl,gh metka: mov al,[di] mov [di+1],al mov dl,n2 mov ah,2 int 10h mov ah,9 push cx mov cx,1 int 10h pop cx dec dl dec di loop metka jmp looper vivod: cmp ctt,0 jl sdvig inc n2 mov dl,n2 mov ah,2 int 10h mov ah,9 mov [si],al mov cx,1 mov bl,0C3h int 10h inc si ;inc dl jmp looper edndof: jmpdf: jmp jmpdf fastend: mov ax,4c00h int 21h code ends end start
первое, что приходит на ум - копируй остаток строки в локальный буфер, потом вставляй новый символ, потом вставляй этот остаток строки. Читать твой код мне было просто влом
в разных случаях по разному. в простейших случаях, при коротких текстах - сдвиг хвоста сзаду и до места вставки. в более сложных и объемных - через дерево вставок или список страниц
В простом случае это выглядит так: (кусок кода из моего недоделанного псевдоредактора) Код (Text): inc SizeStr ;увеличить размер строки movzx ecx,SizeStr ;ecx размер строки mov edi,offset PBUFFFER2 ;edi адрес начала строки add edi,ecx ;edi адрес последнего байта измененной строки ;следим за размером буфера sub ecx,cursor ;вычесть из строки смещение курсора mov esi,edi dec esi ;esi адрес последнего байта первоначальной строки ;адрес чтения и записи отличаются на 1 байт std ; уменьшение адреса rep movsb ; сдвинем часть строки на 1 в право (осторожно копируем с права на лева по "1 элементу") cld ; увеличение адреса mov [edi],al ; запишем пришедший байт (он все это время был в al) inc cursor ; увеличить смещение курсора