Помощь german'у

Assembler programming questions
  • Это не возможно, если ты не укажешь длину строки. Есть два способа - переменная с длиной и завершающий ноль.
    Переменная с длиной:

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

    Code: Select all

    add eax,byte [ebx]
    Fasm 1.60 выдает ошибку:
    Error: operand sizes do not match
  • Мда... Кое-чего не учел...
    Правильные варианты:

    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.
    ;----------------------------------------
  • in code we trust
  • Пишу без лирики сразу переходя к вопросу:

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

    Помогите пожалуйста, товорищи ассемблирующие!!!
  • Что код-то должен делать непонятно...
    С pos2 по pos в стиринг или что?
    Ты явно неправильно используешь edi ибо записываешь в него подряд вторую переменную
    Этот код берет вещь из esi и перемещает в edi, movsd - перемащает 1 dword - 4 байта, если строка нулем кончается
    можно сделать rep movsb - скопирует побайтно пока не найдет 0
  • Нужно rep movsd писать и ecx = pos2-pos1, кто-нибудь дополните меня...
  • Code: Select all

    mov  ecx,[pos2]
    mov  esi,[pos]
    sub   ecx,esi
    mov  edi,string
    rep   movsb
    
  • вобщем надо в ecx указать количество перемещаемых байт если мне не изменяет память...
    ну или делать repnz пока не встретится нуль в строке... что то типа этого...
  • и не забыть настроить es \ ds, а не то может злая шутка случиться :lol:
  • Спасибо и опятьв вопрос: Не подскажет ли мне кто-нибудь где найти пример применение IPC в MenuetOS
  • Был такой пример IPC , но я точно не помню есть ли в сорцах Колибри 4....
  • Я проверил, нашёл всем спасибо
  • Who is online

    Users browsing this forum: No registered users and 8 guests