Вопрос по mov в FASM

Тема в разделе "WASM.BEGINNERS", создана пользователем Zhelezka, 28 авг 2008.

  1. Zhelezka

    Zhelezka New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2008
    Сообщения:
    103
    У меня возникли пробелы в знании FASM.
    Мне нужно узнать как в FASM работать с памятью с помощью mov
    Объясните как решить эту задачу:

    Переменные:
    var1-неизвестно(адрес этой переменной хранится в addr1)
    addr1-извесно
    var2-извесно
    addr2-неизвестно(помещается адрес переменной var2)
    var3-неизвестно( var3=var2 )
    Как найти все неизвестные?
     
  2. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    Код (Text):
    1. var1 dd 'unk'
    2. addr1 dd var1
    3. var2 dd 'knw'
    4. addr2 dd ?
    5. var3 dd ?
    6.  
    7. mov esi,[addr1]
    8. lodsd; - in eax value of var1
    9. mov ebx,var2; in ebx address of var2
    10. mov [addr2],ebx; address of val2 in addr2
    11. push [var2]
    12. pop [var3] ; var3=var2
     
  3. Zhelezka

    Zhelezka New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2008
    Сообщения:
    103
    а зачем:
    push [var2] 4 тактовых цикла (i486)
    pop [var3] 6 тактовых циклов (i486)
    можно-же так:
    mov ax, [var2] 1 тактовый цикл (i486)
    mov [var3], ax 1 тактовый цикл (i486)
    Или-же сейчас уже быстрее push, pop
     
  4. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    я не оптимизировал.. push/pop быстрее на клавиатуре набрать :)
    тогда уж
    Код (Text):
    1. mov eax, [var2]
    2. mov [var3], eax
     
  5. Zhelezka

    Zhelezka New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2008
    Сообщения:
    103
    Что делает это выражение?:
    mov [var1],var2
    var1=var2 или-же var1=address of var2
    Какая роль квадратных скобок?
    Если ответ второй, то можно-и с помощью одного выражения сделать:
    var1=var2
    Или можно только:
    регистр=var2
    var1=регистр
    Как сравнить два числа в памяти:
    cmp var1,var2 или cmp [var1],var2 или cmp var1,[var2] или cmp [var1],[var2]
     
  6. _Tai_

    _Tai_ New Member

    Публикаций:
    0
    Регистрация:
    29 авг 2008
    Сообщения:
    22
    если переменная в квадратных скобках - берется значение по адресу var1
    если без - берется непосредственно сам адрес var1

    нельзя

    через регистр
    1 из операндов всегда должен быть регистр процессора
     
  7. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
  8. Zhelezka

    Zhelezka New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2008
    Сообщения:
    103
    Дано:
    Переменные и адреса по 4 байта.
    ptr1-указатель на !разные переменные!, !изменяется!, но на данный момент указывает на какую-то переменную
    ptr2-указатель на !разные переменные!, !изменяется!, но на данный момент указывает на другую переменную
    Задание 1:
    переменная на которую указывает ptr1 = переменная на которую указывает ptr2
    Решение 1(9 тактов):
    Код (Text):
    1. mov esi, [ptr2] (1 такт   486i)
    2. mov edi, [ptr1] (1 такт   486i)
    3. movsd           (7 тактов 486i)
    Задание 2:
    переменная на которую указывает ptr1 = переменная на которую указывает ptr1 + переменная на которую указывает ptr2
    Решение 2(20 тактов):
    Код (Text):
    1. mov esi, [ptr2] (1 тактов 486i)
    2. lodsd           (5 тактов 486i)
    3. mov bx, ax      (1 такт   486i)
    4. mov esi, [ptr1] (1 такт   486i)
    5. lodsd           (5 тактов 486i)
    6. add ax, bx      (1 такт   486i)
    7. mov edi, esi    (1 такт   486i)
    8. stosd           (5 тактов 486i)
    Можно-ли как-то оптимизировать второе решение?
     
  9. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    Код (Text):
    1. 1)
    2. mov eax,[ptr2]
    3. mov [ptr1],eax
    4. 2)
    5. mov eax,[ptr2]
    6. add [ptr1],eax
     
  10. Zhelezka

    Zhelezka New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2008
    Сообщения:
    103
    У тебя:
    1)ptr1=ptr2
    2)ptr1=ptr1+ptr2
    А мне надо:
    1)переменная на которую указывает ptr1 = переменная на которую указывает ptr2
    2)переменная на которую указывает ptr1 =
    = переменная на которую указывает ptr1 + переменная на которую указывает ptr2
     
  11. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Zhelezka
    ptr1=ptr2 будет так:
    Код (Text):
    1. mov eax, ptr2
    2. mov ptr1, eax
    посмотри внимательнее на предложенный Freeman'ом вариант и найди 2 отличия.
    аналогично и с add

    в кваратных скобках помещается указатель
     
  12. Zhelezka

    Zhelezka New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2008
    Сообщения:
    103
    mov eax,[ptr2]
    mov [ptr1],eax
    переменная с адресом ptr1 = переменная с адресом ptr2

    mov eax,ptr2
    mov ptr1,eax
    адрес ptr1 = адрес ptr2 — не выполняется

    А мне нужно:
    переменная на которую указывает переменная с адресом ptr1 = переменная на которую указывает переменная с адресом ptr2
    Не дописал: сорри.

    Если не понимаете:
    посмотрите на код с объяснением:
    Код (Text):
    1. mov esi, [ptr2] (1 такт   486i) в ESI содержание переменной ptr2
    2. mov edi, [ptr1] (1 такт   486i) в EDI содержание переменной ptr1
    3. movsd           (7 тактов 486i) Пересылка двойного слова из DS:[(E)SI] в ES:[(E)DI]
    Вроде его оптимизировать нельзя, но сложение мне совсем не нравится.
     
  13. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    Zhelezka
    Код (Text):
    1.  mov ebx, ptr1
    2.  mov ecx, ptr2
    3.  mov eax, [ebx]
    4.  mov [ecx], eax
    косвенная адресация - через регистры (mov eax, [ebx])
    но сомневаюсь, что это будет быстрее чем movsd