Пользователь
Регистрация: 12.11.2011
Сообщений: 80
|
Ошибки в переводе...
Помогите найти ощибки в переводе кода c pascale на assembler (MASM32 v10)
Имеется строка длиной до 100 символов, в которой несколько раз встречается сочетание ”array”. Сформировать строку, содержащую вместо указанного сочетания строку с соче-танием “simple”.
Код:
program Kursa4;
var
str,str2,rstr: string;
i,j: integer;
begin
rstr:='array';
write('**str=');
readln(str); считываем вводимую строку
i:=1; i=1
If length(str)>100 then str:=copy(str,1,100); обрезаем строку до ста символов если их больше ста
while (i<=length(str)) do begin начало цикла в котором будем формировать конечную строку
j:=1; j=1
If (length(str)-i)>=4 then если разность между длиной строки и положением i в строке меньше 4 то пропускаем следующий while (убераем дищние итерации т.к. длина array 5 символов, то можно не проверять строку на содержание в ней слова array начиная с той точки где разность длины строки и положения i в строке меньше 4)
While str[i+j-1]=rstr[j] do Inc(j); Пока символ в введённой строке с номером [i+j-1] соответстует житому (j-итому) символу в слове array то производим инкримент j
If j>5 Then begin Если j>5 то делаем Then иначе Else
str2:=str2+'simple'; Добавляем к итоговой строке simple
i:=i+5; наращиваем i на 5 (пропускаем уже проверенное слово array)
end else begin
str2:=str2+str[i]; Добовляем в итоговую строку итый (i-тый) символ из введённой строки
Inc(i); Инкремент i (переходим к следующиму символу вводимой строки)
end;
end;
write('**str2=');
writeln(str2);
readln;
end.
Код:
.MODEL tiny
.486p
.code
assume cs:@code, ds:@code, es:@code, ss:@code
ORG 100h
begin:
mov si, offset end_pr
mov bx,(end_pr-begin+10Fh)/16
mov ah,4Ah
INT 21h
mov ah, 0ah ;буфферизированый ввод строки
lea dx,input_str
INT 21h
mov ah,09h ;перевод каретки на начало следующей строки
lea dx,car ;(что бы не затирать введённую строку)
int 21h
xor ch,ch ;достаём из буфера длину введённой строки
mov si,dx
inc si
mov cx,[si]
inc si
mov lsi,cx ;сохраняем длину строки в переменную
lea di,str2 ;сохраняем в переменную начальное положение
mov poloj,di ;курсора в итоговой строке
lea si,input_str ;сохраняем в переменную начальное положение
mov polojis,si ;курсора в вводимой строке
mov ax,1
mov per_i,ax ;присваиваем переменной i начальное значение =1
CMP ax,cx ;начало while1. Сравниваем положение курсора в
JBE W1 ;вводимой строке с длиной этой строки
JMP eW1 ;переход на endWhile1
W1: CMP ax,cx
JA eW1
mov cx,lsi ;возвращаем длину введённой строки
mov ax,per_i ;возвращаем переменную i
SUB cx,ax ;Length_input_str-i
CMP cx,4h ;Сравниваем СХ с 4, избавляемся от лишних итераций
JB e1 ;переход на else_1
mov bx,1
mov per_j,bx ;присваиваем переменной j начальное значение 1
mov si,polojis ;возвращаем переменную положения input_str
add si,bx ;перемещаем курсор в input_str на j
lea di,rstr ;возвращаем положение rstr
inc di
cld ;DF=0
cmpsb ;сравниваем строки в в точках di и si.Начало while2
mov polojis,si ;сохраняем текущее положение input_str
JE W2
JMP e1 ;переход на endWhile2(else_1)
W2:
cld
cmpsb
mov polojis,si
JNE e1
INC bx
mov per_j,bx ;Сохраняем переменную j
JMP W2
e1:
mov bx,per_j ;возвращаем переменную j
CMP bx,5 ;сравниваем j с 5
JB e2
lea si,sstr ;возвращаем начальное положение sstr
mov di,poloj возвращаем положение в str2 (итоговая строка)
mov cx,len_sstr ;возвращаем длину sstr
cld ;DF=0
rep movsb ;Пересылаем символы из si в di до тех пор пока СХ не 0
mov poloj,di ;сохраняем текущее положение итоговой строки
mov ax,per_i ;возвращаем переменную i
add ax,5h ;наращиваем i на 5
mov per_i,ax ;сохраняем переменную i
e2:
mov si,polojis;возврашаем положение input_str
dec si ;перемещаем указатель назад
mov di,poloj ;возвращаем положение итоговой строки
cld ;DF=0
movsb ;пересылаем один символ из si в di
mov poloj,di ;сохраняем положение итоговой строки
mov ax,per_i ;возвращаем переменную i
INC ax ;инкремент i
mov per_i,ax ;сохраняем переменную i
JMP W1
eW1:
mov AH, 09h ;вывод итоговой строки str2
lea dx,str2
INT 21h
mov ah,00h ;ф-ия ожидания нажатия клавиши
INT 16h
mov AH,4ch
INT 21h
;данные
rstr db 'array','$' ;rstr=array(заменяемая строка)
sstr db 'simple','$' ;sstr-simple(вставляемая строка)
len_sstr=$-sstr ;длина sstr
str2 db 121 dup(?),13,10,'$' ;итоговая строка str2
input_str db 101,?,101 dup(?) ;вводимая строка input_str
car db 13,10,'$' ;строка перевода каретки
lsi dw ? ;длина input_str
poloj dw ? ;положение в итоговой строке
polojis dw ? ;положение input_str
per_i dw ? ;переменная i
per_j dw ? ;переменная j
DW 64 DUP(0)
end_pr=$
end begin
Ш.Р.Ю.-программист! йопта!!!
|