Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2011, 08:45   #1
munthrekosh
Пользователь
 
Аватар для munthrekosh
 
Регистрация: 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
Ш.Р.Ю.-программист! йопта!!!
munthrekosh вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка в переводе кода Waqq Помощь студентам 1 07.11.2011 08:20
Ошибка в переводе кода с Turbo Pascal на Fortran abit-2010 Помощь студентам 0 05.07.2011 22:55
Ошибка при переводе числа Marsel737 Общие вопросы Delphi 4 06.12.2009 12:56
Очень нужна помощь в переводе символов в ASCII и обратно !!!~VivO~!!! Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 05.05.2008 10:47