Page 1 of 1
Помощь german'у
Posted: Sun Jun 05, 2005 8:11 pm
by german
Подскажите, кто может, как конвертировать строку текста в числовую
переменную. Н-р text db '640' в nmbr dd 640. Пожалуйста помогите ассемблерному ламеру.
Posted: Mon Jun 06, 2005 8:28 am
by halyavin
Это не возможно, если ты не укажешь длину строки. Есть два способа - переменная с длиной и завершающий ноль.
Переменная с длиной:
Code: Select all
xor eax,eax
mov ebx,text
mov ecx,[len]
jecxz .endloop
.loop:
shl eax,1
lea eax,[eax+4*eax]
add eax,byte [ebx]
sub eax,'0'
inc ebx
loop .loop
.endloop:
Завершающий ноль (text db '640',0):
Code: Select all
xor eax,eax
mov ebx,text
.loop:
cmp byte [ebx],0
jz .endloop
shl eax,1
lea eax,[eax+4*eax]
add eax,byte [ebx]
inc ebx
sub eax,'0'
jmp .loop
.endloop:
Результат в eax.
Posted: Mon Jun 06, 2005 2:24 pm
by german
на строке
Fasm 1.60 выдает ошибку:
Error: operand sizes do not match
Posted: Mon Jun 06, 2005 2:55 pm
by Guest
Мда... Кое-чего не учел...
Правильные варианты:
Code: Select all
xor eax,eax
mov ebx,text
mov ecx,[len]
xor edx,edx
jecxz .endloop
.loop:
mov dl,byte [ebx]
shl eax,1
lea eax,[eax+4*eax]
add eax,edx
sub eax,'0'
inc ebx
loop .loop
.endloop:
и
Code: Select all
xor eax,eax
mov ebx,text
xor edx,edx
.loop:
cmp byte [ebx],0
jz .endloop
mov dl,byte [ebx]
shl eax,1
lea eax,[eax+4*eax]
add eax,edx
inc ebx
sub eax,'0'
jmp .loop
.endloop:
;----------------------------------------
Это сообщение составил halyavin.
;----------------------------------------
Posted: Mon Jun 06, 2005 3:16 pm
by mike.dld
Помощь German'у-2
Posted: Wed Jun 15, 2005 6:32 pm
by german
Пишу без лирики сразу переходя к вопросу:
есть строка string db ?
две переменные pos2 dd ? и pos dd ?
данный код перемещает участок памяти,
по адресам указанным в переменных,
в строку string.
Code: Select all
mov esi,[pos2] ;перемещение строки адрес [pos2]:[pos]
mov edi,[pos] ;в переменную strng
mov edi,strng
movsd
Но код не работает перемещая только 4 байта
начиная с позиции pos2.
Помогите пожалуйста, товорищи ассемблирующие!!!
Posted: Wed Jun 15, 2005 6:54 pm
by VASA
Что код-то должен делать непонятно...
С pos2 по pos в стиринг или что?
Ты явно неправильно используешь edi ибо записываешь в него подряд вторую переменную
Этот код берет вещь из esi и перемещает в edi, movsd - перемащает 1 dword - 4 байта, если строка нулем кончается
можно сделать rep movsb - скопирует побайтно пока не найдет 0
Posted: Wed Jun 15, 2005 7:03 pm
by EXIS
Нужно rep movsd писать и ecx = pos2-pos1, кто-нибудь дополните меня...
Posted: Thu Jun 16, 2005 1:29 pm
by willow
Code: Select all
mov ecx,[pos2]
mov esi,[pos]
sub ecx,esi
mov edi,string
rep movsb
Posted: Thu Jun 16, 2005 2:15 pm
by FreGL
вобщем надо в ecx указать количество перемещаемых байт если мне не изменяет память...
ну или делать repnz пока не встретится нуль в строке... что то типа этого...
Posted: Thu Jun 16, 2005 3:22 pm
by cyberGnom
и не забыть настроить es \ ds, а не то может злая шутка случиться

Posted: Thu Jun 16, 2005 5:44 pm
by german
Спасибо и опятьв вопрос: Не подскажет ли мне кто-нибудь где найти пример применение IPC в MenuetOS
Posted: Thu Jun 16, 2005 7:25 pm
by EXIS
Был такой пример IPC , но я точно не помню есть ли в сорцах Колибри 4....
Posted: Thu Jun 16, 2005 8:02 pm
by german
Я проверил, нашёл всем спасибо