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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2011, 17:17   #1
Ibanez Wizard
Адский тунеядец
Форумчанин
 
Аватар для Ibanez Wizard
 
Регистрация: 11.06.2010
Сообщений: 164
По умолчанию Работа со строками. Программа из недавней темы.

Почитал задачу вот здесь . Поскольку я новичок-чайник, то для общего развития попробовал её решить, на основе того алгоритма, который предлагает чувак (KatruKot) из той темы на паскале. Сначала попробовал написать функцию copy() на ассемблере. Проверил - работает. Посчитать количество символов не составило труда (length).
Кстати вот условие:

Дана строка S и число N. Преобразовать строку S в строку длины N следующим образом: если длина строки S больше N, то отбросить первые символы, если длина строки S меньше N, то в ее начало добавить символы "." (точка).

Ну в общем я на основе написанных мною функций, решил попробовать решить эту задачу. Сидел перед монитором и вникал что да как. В итоге на половину получилось (как я считаю).
В первом случае, если длина S больше N, у меня получилось сделать так, чтобы отбросились первые символы, но вот во втором где надо добавить точки в начало - точки то я добавляю, но поскольку заданная мною строка в сегменте данных ограничена всего восемью символами, то точки впереди не добавляются, а заменяют числа, стоящие впереди.
Я думал как это предотвратить но мои знания не позволяют это сделать.
Скажите пожалуйста как? Очень хочется её закончить.
И ещё - скажите какие ошибки и недочеты у меня в программе помимо этой.
Вот исходник KatruKot'а на паскале (я его в TP 7.0 откомпилировал. Вроде работала как надо, единственное я cls убрал после бегина - ругается на него):
Код:
var
s:string;
n,d,i:integer;
begin
writeln('Введите строку');
readln(s);
writeln('Введите число');
readln(n);
d:=length(s);
if d>n then s:=copy(s,d-n+1,n)
else if d<n then
repeat
s:='.'+s;
until length(s)=n;
writeln(s);
end.
А вот моя программе на макро ассемблере (написал комментарии чтобы получше смотрелось):

Код:
.386
.model flat, stdcall
option casemap : none

.data?
d dd ?;количество символов в строке 
s2 db ?; запасная строка
start_char dd  ?; начальное значение для copy

.data
s db "12345678", 0; сама строка()
n dd 11; число N

.code
start:
cld
lea eax, s
push eax
call _length; подсчет символов в строке
mov eax, d
sub eax, n
inc eax
mov start_char, eax; d-n+1
cmp eax, n
jnc more; d>n
jc less; d<n

more:; d>n
push n
push start_char
lea eax, s2
push eax
lea eax, s
push eax 
call _copy
ret

less:;d<n
lea edi, s
mov eax, '.'
add eax, [esi]
mov [esi], eax
lea eax, s
push eax
call _length; подсчет символов в строке
mov eax, d
cmp eax, n
jnz less
ret

;###############################################################
;###############################################################
;Проедуры lenght() и copy()####################################
;###############################################################
;###############################################################

_length proc String:byte
xor eax, eax
lea esi, s
@1:
inc eax
cmp byte ptr [eax+esi], 0
jnz @1
mov d, eax
ret
_length endp

_copy proc String:byte,StringOut:byte,StartChar:dword,Count:dword
xor eax, eax
lea esi, s
lea edi, s2
mov ecx, n
add esi, 3
dec esi
@2:
mov eax, [esi]
stosb
inc esi
loop @2
ret
_copy endp
end start
Ibanez Wizard вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с матрицами (норма матрицы, работа со строками) Neitrosha Помощь студентам 1 26.11.2010 20:19
программа со строками.!!!! radeon37 Паскаль, Turbo Pascal, PascalABC.NET 0 20.05.2010 17:58
А вы знаете, что пользователи могут в течении часа после создания темы редактировать заголовок темы? Alar О форуме и сайтах клуба 4 27.04.2010 15:20
программа со строками в Си champion92 Общие вопросы C/C++ 2 02.12.2009 16:52
Программа со строками без указателей и выводом в файл Crimson_Fist Помощь студентам 2 25.11.2009 10:20