Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Код


  MOV AL,RE; AL:=RE
  NOT AL      ;инвертировать AL
  MOV AH, AL; AH:=AL
  MOV CL, 7; CL := 7
  SHR AH,1; сдвинуть AH вправо на бит
  MOV CL,4; CL := 4; зачем...?
  SHR AH,CL; сдвинуть AH на CL(4) бит вправо
  MOV K.AL ;K := AL
  MOV RE,AH ; RE:=AH


K:= ~RE;
RE:= ~RE >> 5;
ИМХО глубокого смысла нет в этом коде, где ты его откопал? smile 

Автор: sgi1981 24.9.2006, 22:36
Цитата(Sartorius @ 24.9.2006,  21:22)
K:= ~RE;
RE:= ~RE >> 5;
ИМХО глубокого смысла нет в этом коде, где ты его откопал? smile

От себя... оптимизация небольшая

Код

 MOV AL,RE
  NOT AL;
  MOV K,AL
  SHR AL,5;
  MOV RE,AL


Автор: kindDevil 25.9.2006, 21:50
Sartorius, 
програмулина на паскале, работает с внешним устройством через лпт.
так вот после считывания значения из порта оно подвергается такой вот обработке, затем оператор выбора...
к1 - значение, r - хрен знает что.
то есть оно оставляет примерно те же значения, что и были введены? 
или что оно вообще творит?


Автор: Sartorius 26.9.2006, 09:12
Цитата(kindDevil @ 25.9.2006,  22:50)
Sartorius, 
програмулина на паскале, работает с внешним устройством через лпт.
так вот после считывания значения из порта оно подвергается такой вот обработке, затем оператор выбора...
к1 - значение, r - хрен знает что.
то есть оно оставляет примерно те же значения, что и были введены? 
или что оно вообще творит?

 В К - инвертированное RE
 В RE - инвертированное RE, cдвинутое вправо на 5 бит

Автор: dumb 26.9.2006, 10:05
kindDevil,
Цитата(Sartorius @  26.9.2006,  09:12 Найти цитируемый пост)
В RE - инвертированное RE, cдвинутое вправо на 5 бит

сдвиг вправо на n бит - по сути целочисленное деление числа на 2^n. т.е. RE = RE / 32

Добавлено @ 10:09 
ну да, еще инверсия... хотя, применительно к работе с LPT, сдвиг вправо вряд ли имеет смысл именно деления... при работе с портами, как правило, смысл именно в операциях с битами... мутно как-то сказал, но, думаю, примерно понятно... smile

Автор: kindDevil 26.9.2006, 19:55
а аналог кода на паскале можно отобразить? а то я все-таки мало чего понял.
понял про смещение. 
не понял что такое инверсия. инверсия - превращение в противоположное число-1? 

Автор: Sartorius 26.9.2006, 21:40
Цитата(kindDevil @ 26.9.2006,  20:55)
а аналог кода на паскале можно отобразить? а то я все-таки мало чего понял.
понял про смещение. 
не понял что такое инверсия. инверсия - превращение в противоположное число-1?

 Инверсия - обращение бит : ~00011100 = 11100011
Аналог на паскале:
k := not re;
re := (not re) shr 5;

Автор: kindDevil 26.9.2006, 22:36
спасибо! =) 
разобрался.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)