|
|
| Посл.отвђт | Сообщен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 |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.116 |