| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Asm: Общие вопросы > Что делает этот код? |
| Автор: kindDevil 24.9.2006, 20:44 |
| через паскаль procedure x(var k1:byte;var r:byte); var k:byte;re:byte; begin re:= k1; k := k1; ASM MOV AL,RE NOT AL; MOV AH, AL MOV CL, 7 SHR AH,1; MOV CL,4; SHR AH,CL; MOV K.AL MOV RE,AH END; R := RE; K1 := K; не знаю ассемблера, откомментируйте каждый шаг кода, плз (разумеется кроме паскалевской части). и что конкретно этот код выполняет? |
| Автор: Sartorius 24.9.2006, 21:22 | ||
K:= ~RE; RE:= ~RE >> 5; ИМХО глубокого смысла нет в этом коде, где ты его откопал? |
| Автор: sgi1981 24.9.2006, 22:36 | ||||
От себя... оптимизация небольшая
|
| Автор: kindDevil 25.9.2006, 21:50 |
| Sartorius, програмулина на паскале, работает с внешним устройством через лпт. так вот после считывания значения из порта оно подвергается такой вот обработке, затем оператор выбора... к1 - значение, r - хрен знает что. то есть оно оставляет примерно те же значения, что и были введены? или что оно вообще творит? |
| Автор: Sartorius 26.9.2006, 09:12 | ||
В К - инвертированное RE В RE - инвертированное RE, cдвинутое вправо на 5 бит |
| Автор: dumb 26.9.2006, 10:05 |
| kindDevil, сдвиг вправо на n бит - по сути целочисленное деление числа на 2^n. т.е. RE = RE / 32 Добавлено @ 10:09 ну да, еще инверсия... хотя, применительно к работе с LPT, сдвиг вправо вряд ли имеет смысл именно деления... при работе с портами, как правило, смысл именно в операциях с битами... мутно как-то сказал, но, думаю, примерно понятно... |
| Автор: kindDevil 26.9.2006, 19:55 |
| а аналог кода на паскале можно отобразить? а то я все-таки мало чего понял. понял про смещение. не понял что такое инверсия. инверсия - превращение в противоположное число-1? |
| Автор: Sartorius 26.9.2006, 21:40 | ||
Инверсия - обращение бит : ~00011100 = 11100011 Аналог на паскале: k := not re; re := (not re) shr 5; |
| Автор: kindDevil 26.9.2006, 22:36 |
| спасибо! =) разобрался. |