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
на строке

Code: Select all

add eax,byte [ebx]
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, а не то может злая шутка случиться :lol:

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
Я проверил, нашёл всем спасибо