У меня возникли пробелы в знании FASM. Мне нужно узнать как в FASM работать с памятью с помощью mov Объясните как решить эту задачу: Переменные: var1-неизвестно(адрес этой переменной хранится в addr1) addr1-извесно var2-извесно addr2-неизвестно(помещается адрес переменной var2) var3-неизвестно( var3=var2 ) Как найти все неизвестные?
Код (Text): var1 dd 'unk' addr1 dd var1 var2 dd 'knw' addr2 dd ? var3 dd ? mov esi,[addr1] lodsd; - in eax value of var1 mov ebx,var2; in ebx address of var2 mov [addr2],ebx; address of val2 in addr2 push [var2] pop [var3] ; var3=var2
а зачем: push [var2] 4 тактовых цикла (i486) pop [var3] 6 тактовых циклов (i486) можно-же так: mov ax, [var2] 1 тактовый цикл (i486) mov [var3], ax 1 тактовый цикл (i486) Или-же сейчас уже быстрее push, pop
я не оптимизировал.. push/pop быстрее на клавиатуре набрать тогда уж Код (Text): mov eax, [var2] mov [var3], eax
Что делает это выражение?: 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]
если переменная в квадратных скобках - берется значение по адресу var1 если без - берется непосредственно сам адрес var1 нельзя через регистр 1 из операндов всегда должен быть регистр процессора
В Intel Manuals приведены все примеры для каждой из команд процессора: http://www.intel.com/products/processor/manuals/ Volumes 2A and 2B.
Дано: Переменные и адреса по 4 байта. ptr1-указатель на !разные переменные!, !изменяется!, но на данный момент указывает на какую-то переменную ptr2-указатель на !разные переменные!, !изменяется!, но на данный момент указывает на другую переменную Задание 1: переменная на которую указывает ptr1 = переменная на которую указывает ptr2 Решение 1(9 тактов): Код (Text): mov esi, [ptr2] (1 такт 486i) mov edi, [ptr1] (1 такт 486i) movsd (7 тактов 486i) Задание 2: переменная на которую указывает ptr1 = переменная на которую указывает ptr1 + переменная на которую указывает ptr2 Решение 2(20 тактов): Код (Text): mov esi, [ptr2] (1 тактов 486i) lodsd (5 тактов 486i) mov bx, ax (1 такт 486i) mov esi, [ptr1] (1 такт 486i) lodsd (5 тактов 486i) add ax, bx (1 такт 486i) mov edi, esi (1 такт 486i) stosd (5 тактов 486i) Можно-ли как-то оптимизировать второе решение?
У тебя: 1)ptr1=ptr2 2)ptr1=ptr1+ptr2 А мне надо: 1)переменная на которую указывает ptr1 = переменная на которую указывает ptr2 2)переменная на которую указывает ptr1 = = переменная на которую указывает ptr1 + переменная на которую указывает ptr2
Zhelezka ptr1=ptr2 будет так: Код (Text): mov eax, ptr2 mov ptr1, eax посмотри внимательнее на предложенный Freeman'ом вариант и найди 2 отличия. аналогично и с add в кваратных скобках помещается указатель
mov eax,[ptr2] mov [ptr1],eax переменная с адресом ptr1 = переменная с адресом ptr2 mov eax,ptr2 mov ptr1,eax адрес ptr1 = адрес ptr2 — не выполняется А мне нужно: переменная на которую указывает переменная с адресом ptr1 = переменная на которую указывает переменная с адресом ptr2 Не дописал: сорри. Если не понимаете: посмотрите на код с объяснением: Код (Text): mov esi, [ptr2] (1 такт 486i) в ESI содержание переменной ptr2 mov edi, [ptr1] (1 такт 486i) в EDI содержание переменной ptr1 movsd (7 тактов 486i) Пересылка двойного слова из DS:[(E)SI] в ES:[(E)DI] Вроде его оптимизировать нельзя, но сложение мне совсем не нравится.
Zhelezka Код (Text): mov ebx, ptr1 mov ecx, ptr2 mov eax, [ebx] mov [ecx], eax косвенная адресация - через регистры (mov eax, [ebx]) но сомневаюсь, что это будет быстрее чем movsd