· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.WIN32 —› Проблема синтаксиса

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Ноя 20, 2003 10:50:57

Народ!
До меня ни как не дойдёт один текст кода, а именно не весь текст, конечно, а один параметр: (!eax) и
и что значит подряд идущие команды .BREAK .IF (!eax)
Полный текст программы: "Урок Iczelion'а Win32 API. № 3. Простое окно".
Больше всего меня волнует (!eax), потому как ни где найти это не могу.

.WHILE TRUE ; Enter message loop
invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW

Заранее СПаСибЫ!


Дата: Ноя 20, 2003 11:29:53 · Поправил: q_q

Ivan_S
Прервать цикл если еах равно нулю.

Восклицательный знак взят из синтаксиса Си, там, в логических выражениях все, что не ноль истина, а все что ноль - ложь, если ко лжи применить логическое отрицание, то получится истина.

Можно изменить на
.break .if eax == 0


Дата: Ноя 20, 2003 18:04:16

q_q

Вот поэтому у меня этот ублюдочный синтаксис MASM вызывает только отвращение. На фига, спрашивается, это все надо, если я это на С напишу? А если на асме писать, то на кой коверкать самый важный смысл асма - ЦИКЛЫ! test/jnz, cmp/jp, sbb заменяются на всякую, прости господи, херню.


Дата: Ноя 21, 2003 04:11:42

volodya
Согласен. Уж лучше писать на Си, чем на asm'е в стиле invoke/.if/.while/...
Однако, с точки зрения размера исходного кода, например, надо запостить на форум, или когда необходимо обратить внимание на алгоритм, а не реализацию, разумнее использовать "высокоуровневые" конструкции masm'а.


Дата: Ноя 21, 2003 10:53:03

q_q
volodya
Я с вами не согласен, использование макросов это преимущество MASM, по моему чем меньше строк кода тем легче будет в нём розобраться (а для програм примеров это крайне важно). Если взять какой нибудь справочник, то легко разобраться зачем нужны макросы.
.BREAK .IF (!eax) - писать это в одну строчку, действительно не стоило.


Дата: Ноя 21, 2003 11:42:32

Chib777
чем меньше строк кода тем легче будет в нём розобраться ... писать это в одну строчку, действительно не стоило
Противоречие, однако.
Почему именно это? Afaik .break .if прямо Си'шный if (...) break;.

Imho если взялся за ассемблер, значит, есть необходимость сваять нечто особенное, по размеру и/или скорости. "Высокоуровневые" конструкции расслабляют.


Дата: Ноя 21, 2003 13:08:52

q_q

Если нужно сделать что-то типа:
.if (al>="0" && al<="9") || (al>="A" && al<="F") || (al>="a" && al<="f") || al==VK_BACK
          .if al>="a" && al<="f"


то чем расставлять переходы(je, jbe, jb, ja) вручную уж лучше
через стандартные макросы .IF/.ENDIF, так меньше возможностей
ошибиться, да и оптимизации в данном случае никакой, .IF/.ENDIF
здесь вполне нормально ассемблируется.


Дата: Ноя 21, 2003 13:15:59 · Поправил: q_q

Asterix
Imho реализация проверки такого условия при помощи cmp - не лучший вариант.

Например 'a' от 'A' отличается на 20h, условие можно сократить, а ты уже расслабился и пишешь все.


Дата: Ноя 21, 2003 17:38:24

Asterix
Chib777

Не путайте грешное с праведным. Исходя из вашей же логики вообще на асме писать не нужно. Эти ваши макроопределения - довольно ублюдочная штука - возможностей почти никаких. Препроцессор C гораздо мощнее и гибче. А использовать .BREAK .IF (!eax) на АССЕМБЛЕРЕ, это, пардон, извращение. Не более.


Дата: Ноя 21, 2003 17:41:03

Да, и еще.
WHILE TRUE - полный отстой, потому что трансформируется в нечто вроде
mov eax,1
test eax, eax
jz exit

А С мне эту конструкцию дает возможность описывать более оптимально:
for(;;), что преобразуется в jmp! На асме можно сделать также эффективно, а на этих ублюдочных макроопределениях... Ну, тоже можно, но только, ей богу, я лучше С использовать буду.


Дата: Ноя 21, 2003 18:17:16

Ivan_S
До меня ни как не дойдёт один текст кода...
Извините за возможно глупый совет.
До меня тоже часто не доходит синтаксис cc+.
Тогда я нажимаю в RadASM кнопку, которая вызывает дизассемблер.
Потом иногда доходит :)
Да, IF - это HLL, в asm'e есть флаги.


Дата: Ноя 21, 2003 21:36:56

[ volodya: Да, и еще.
WHILE TRUE - полный отстой, потому что трансформируется в нечто вроде...
]

Скорее в
cmp eax, 1
jne exit


Дата: Ноя 21, 2003 22:19:59

Какая разница? Главное - искажение СМЫСЛА.


Дата: Ноя 22, 2003 04:22:22

Asterix
.if (al>="0" && al<="9") || (al>="A" && al<="F") || (al>="a" && al<="f") || al==VK_BACK
.if al>="a" && al<="f"


Лучше это переделать хотя бы в такое:
if (al>="0" && al<="9")
{
}
else if ((al>="0" && al<="9") || (al>="A" && al<="F") || al==VK_BACK) 
{
}

Хотя подозреваю что на VK_BACK тоже проверять нужно отдельно.

А на асме можно написать так:
  cmp al,VK_BACK
  jz label2
  xor ebx,ebx
  cmp al,'A'
  sbb ebx,-1
  cmp al,'F'+1
  sbb ebx,0
  cmp al,'0'
  sbb ebx,-1
  cmp al,'9'+1
  sbb ebx,0
  jnz label2
  cmp al,'a'
  sbb ebx,-1
  cmp al,'f'+1
  sbb ebx,0
  jz endif
label1:  

  jmp endif
label2:

endif:

Не так уж много тут переходов, хотя конечно писать такое лень.


Дата: Ноя 22, 2003 05:06:39 · Поправил: Asterix

Black_mirror

Я выдрал код из контекста поэтому меня не очень поняли, полностью
это должно быть так:
CheckMask proc
option PROLOGUE:NONE
option EPILOGUE:NONE
  .if (al>="0" && al<="9") || (al>="A" && al<="F") || (al>="a" && al<="f") || al==VK_BACK
      .if al>="a" && al<="f"
         sub al,20h
      .endif
      ret
  .endif
  xor eax,eax
  ret
option PROLOGUE:PROLOGUEDEF
option EPILOGUE:EPILOGUEDEF
CheckMask endp


Что будет ассемблировано в такой код:
10001128   3C 30            CMP AL,30
1000112A   72 04            JB SHORT DLL_DUMP.10001130
1000112C   3C 39            CMP AL,39
1000112E   76 14            JBE SHORT DLL_DUMP.10001144
10001130   3C 41            CMP AL,41
10001132   72 04            JB SHORT DLL_DUMP.10001138
10001134   3C 46            CMP AL,46
10001136   76 0C            JBE SHORT DLL_DUMP.10001144
10001138   3C 61            CMP AL,61
1000113A   72 04            JB SHORT DLL_DUMP.10001140
1000113C   3C 66            CMP AL,66
1000113E   76 04            JBE SHORT DLL_DUMP.10001144
10001140   3C 08            CMP AL,8
10001142   75 0B            JNZ SHORT DLL_DUMP.1000114F
10001144   3C 61            CMP AL,61
10001146   72 06            JB SHORT DLL_DUMP.1000114E
10001148   3C 66            CMP AL,66
1000114A   77 02            JA SHORT DLL_DUMP.1000114E
1000114C   2C 20            SUB AL,20
1000114E   C3               RETN
1000114F   33C0             XOR EAX,EAX
10001151   C3               RETN

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.116