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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2011, 20:08   #1
fokinamasha
Новичок
Джуниор
 
Регистрация: 31.03.2011
Сообщений: 2
По умолчанию вычисление длины строки

привет! помогите пожалуйста, мне нужно написать процедуру, вычисляющую длину строки, ассемблер не понимаю, вот код на эту задачу(немного разбирали похожее на паре), но почему то не работает...


Код HTML:
.386
.model flat, stdcall
option casemap: none
includelib kernel32.lib
.code 
strlen proc uses eax ebx ecx edi
string: dword,
retvail: dword
cld
mov ax, ds
mov es, ax
mov edi, string
mov ecx, 2048
mov al, END_OF_STRING
 
repne scasb  ; сканирование по байтам(будет повторятьсся до тех пор, пока не встретиться ноль или другой какой то элемент, который мы запрограмировали(в отличие от rep)
 
dec edi ; remove END_OF_STRING symbol
sub edi, string ; substract addres of string from last symbol
mov ebx, retval; return value
mov[ebx], edi
ret
strlen endp
 
main proc
invoke strlen, ADDR test string, ADDR len
mov eax, len
invoke ExitProcess, 0
main endp
end main


по идее типа она(прога) выдает нам длину строки в байтах...насколько я поняла..типа адрес начала строки минус адрес конца строки...


и скажите, как тут правильно код вставлять, чтобы выглядел как ассемблеровский? Спасибо!
fokinamasha вне форума Ответить с цитированием
Старый 01.04.2011, 20:20   #2
Ibanez Wizard
Адский тунеядец
Форумчанин
 
Аватар для Ibanez Wizard
 
Регистрация: 11.06.2010
Сообщений: 164
По умолчанию

Так не проще?

Код:
.386
.model flat,stdcall
.code
string	db "Hello World!!!",0; строка
start:
mov edi,offset string
call _strlen	
ret
_strlen:			
xor eax,eax
@1:
inc eax
cmp byte ptr[eax+edi],0
jnz @1	
ret
end start
Спрашивай если что непонятно).
А на счёт твоего - я его посмотрел. Там в половине строчек смысла нет. Я попробовал исправить. В debuggere посмотрел - все работает хорошо. Получается правильно. Рассматривал на примере Hello World. Вот программа:

Код:
.386
.model flat, stdcall
option casemap: none
includelib\masm32\lib\kernel32.lib
ExitProcess proto : DWORD; без неё программа будет ругатся
.data
string db "Hello World!", 0;строчка в которой считаем символы
len dd 0; переменная для хранения результата
.code 
start:
cld; со строками работаем, а без неё с индексными регистрами абракадабра происходит
mov ax, ds;в windows эти строки не нужны, но раз так показали в 
mov es, ax; универе значит так надо))
lea eax, string; здесь загружаем единственный параметр нашей функции
push eax;посредством помещения в стек его указателя (адреса) все это делает команда lea
call strlen; вызываем функцию (в eax на выходе количество символов)
mov len, eax; загружаем переменную
invoke ExitProcess, 0; выходим из программы

strlen proc uses eax ebx ecx edi String:BYTE; начало нашей функции с параметром - строкой размером в байт
lea edi, string; ну тут начинается твой алгоритм;
mov ecx, 2048
mov eax, 0;поскольку любая строка заканчивается нулем, то будем отсчитывать пока не встретим нуль
repne scasb  ; сканирование по байтам(будет повторятьсся до тех пор, пока не встретиться ноль или другой какой то элемент, который мы запрограмировали(в отличие от rep)
dec edi ; remove END_OF_STRING symbol
sub edi, offset string ; substract addres of string from last symbol
lea ebx, len; return value
mov [ebx], edi; ну тут по адресу который мы получили в предыдущей строке опять командой lea будет наш результат
mov eax, len
ret
strlen endp

Здесь строчку
Код:
strlen proc uses eax ebx ecx edi
Заменяет то, что я записал в описании функции.
Вот эту строчку:
Код:
includelib\masm32\lib\kernel32.lib
ты можешь заменить своей прежней, просто у меня так не компилировалось (в другом месте эта библиотека находилась).
Код:
ExitProcess proto : DWORD
А она здесь нужна для того, чтобы вызвать ExitProcess. Это прототип функции. Вообще он объявлен в kernel32.inc, но раз ты его не подключила, то придется так).
А на счет команды lea - она загружает в первый операнд адрес второго, то есть строчки
Код:
mov eax, offset string
и
Код:
lea eax, string
будут эквивалентны.

Последний раз редактировалось Ibanez Wizard; 01.04.2011 в 21:13.
Ibanez Wizard вне форума Ответить с цитированием
Старый 01.04.2011, 21:57   #3
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Ibanez Wizard, что бы не лезть в дебаггер раз за разом, выведи результат в окно:
Код:
.386
.model flat,stdcall
option casemap:none
include \masm32\include\user32.inc
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
.data
fmt db '%d',0
string db 'abcdefghijklmnopqrstuvwxyz'
m db ?
.code
start:
mov eax,offset m
sub eax,offset string
push eax
push offset fmt
push offset m
call wsprintf
push 0
push 0
push offset m
push 0
call MessageBox
push 0
call ExitProcess
end start
vadimych вне форума Ответить с цитированием
Старый 01.04.2011, 22:06   #4
Ibanez Wizard
Адский тунеядец
Форумчанин
 
Аватар для Ibanez Wizard
 
Регистрация: 11.06.2010
Сообщений: 164
По умолчанию

vadimych, если я буду выводить на экран, то я увижу только результат, да и к тому же мне бы пришлось вывод на экран потом из исходника удалять (чтобы выложить готовый вариант). В отладчике я себя увереннее чувствую.
Ibanez Wizard вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вычисление длины строки Agafon Microsoft Office Word 12 17.11.2010 15:43
измерение длины строки Agafon Общие вопросы Delphi 6 11.11.2010 15:13
Функция получения длины строки в C# kloffelin Помощь студентам 12 26.10.2010 22:39
Поиск длины строки beda Microsoft Office Word 5 21.06.2010 14:27
Строки неизвестной длины в си abr_question Общие вопросы C/C++ 18 22.01.2010 00:26