Форум: "Потрепаться";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];
ВнизБлочное копирование данных Найти похожие ветки
← →
SergP © (2004-07-11 17:17) [0]Сегодня разглядывая один исходник, натолкнулся на такой кусок кода:
asm
...
@Loop:
Mov AL, [ESI]
Inc ESI
mov [EDI], AL
Inc EDI
Dec ECX
Jnz @Loop
...
end;
Причем подобные решения мне еще встречались в нескольких местах.
Мне пока еще не приходилось интересоваться асмом, поэтому его я не знаю, но меня заинтересовала такая вещь: Неужели у процессора нет команд для блочного копирования данных?
Просто помню что даже у Z80 (если кто помнит Спектрум) они были: (LDIR, LDDR) и они естественно работали быстрее чем тот кусок кода который они могли заменять.
Неужели у камней семейства 8086 (имеется ввиду от 8086 до Пентиума) нет подобных команд?
← →
cyborg © (2004-07-11 17:55) [1]Меня тоже эта мысль мучала, интересно бы узнать.
← →
DiamondShark © (2004-07-11 18:14) [2]rep movsb
Полный эквивалент приведённого цикла.
А ещё лучше копировать не побайтно, а двойными словами.
← →
SergP © (2004-07-11 18:19) [3]
> [2] DiamondShark © (11.07.04 18:14)
Значит все-таки есть . А почему же тогда ее никто не использует?
> А ещё лучше копировать не побайтно, а двойными словами.
А насчет двойных слов - хз... А вдруг кол-во байтов не кратно 4 ?
← →
SammIk © (2004-07-11 18:34) [4]Она работает медленно, быстрее в цикле копироватся будет.
Есле не кратно, то копируешь пока кратно, потом доляпываешь сколько осталось.
И получается как не странно, быстрее.
В мануалах написано что команды с префиксом реп, ваполняются на пару(или десятком, чето не помню точно) тактов дольше.
← →
SammIk © (2004-07-11 18:39) [5]Instruction Operands Clock cycles Pairability
NOP 1 uv
MOV r/m, r/m/i 1 uv
MOV r/m, sr 1 np
MOV sr , r/m >= 2 b) np
MOV m , accum 1 uv h)
XCHG (E)AX, r 2 np
XCHG r , r 3 np
XCHG r , m >15 np
XLAT 4 np
PUSH r/i 1 uv
POP r 1 uv
PUSH m 2 np
POP m 3 np
PUSH sr 1 b) np
POP sr >= 3 b) np
PUSHF 3-5 np
POPF 4-6 np
PUSHA POPA 5-9 i) np
PUSHAD POPAD 5 np
LAHF SAHF 2 np
MOVSX MOVZX r , r/m 3 a) np
LEA r , m 1 uv
LDS LES LFS LGS LSS m 4 c) np
ADD SUB AND OR XOR r , r/i 1 uv
ADD SUB AND OR XOR r , m 2 uv
ADD SUB AND OR XOR m , r/i 3 uv
ADC SBB r , r/i 1 u
ADC SBB r , m 2 u
ADC SBB m , r/i 3 u
CMP r , r/i 1 uv
CMP m , r/i 2 uv
TEST r , r 1 uv
TEST m , r 2 uv
TEST r , i 1 f)
TEST m , i 2 np
INC DEC r 1 uv
INC DEC m 3 uv
NEG NOT r/m 1/3 np
MUL IMUL r8/r16/m8/m16 11 np
MUL IMUL all other versions 9 d) np
DIV r8/m8 17 np
DIV r16/m16 25 np
DIV r32/m32 41 np
IDIV r8/m8 22 np
IDIV r16/m16 30 np
IDIV r32/m32 46 np
CBW CWDE 3 np
CWD CDQ 2 np
SHR SHL SAR SAL r , i 1 u
SHR SHL SAR SAL m , i 3 u
SHR SHL SAR SAL r/m, CL 4/5 np
ROR ROL RCR RCL r/m, 1 1/3 u
ROR ROL r/m, i(><1) 1/3 np
ROR ROL r/m, CL 4/5 np
RCR RCL r/m, i(><1) 8/10 np
RCR RCL r/m, CL 7/9 np
SHLD SHRD r, i/CL 4 a) np
SHLD SHRD m, i/CL 5 a) np
BT r, r/i 4 a) np
BT m, i 4 a) np
BT m, i 9 a) np
BTR BTS BTC r, r/i 7 a) np
BTR BTS BTC m, i 8 a) np
BTR BTS BTC m, r 14 a) np
BSF BSR r , r/m 7-73 a) np
SETcc r/m 1/2 a) np
JMP CALL short/near 1 e) v
JMP CALL far >= 3 e) np
conditional jump short/near 1/4/5/6 e) v
CALL JMP r/m 2/5 e np
RETN 2/5 e np
RETN i 3/6 e) np
RETF 4/7 e) np
RETF i 5/8 e) np
J(E)CXZ short 4-11 e) np
LOOP short 5-10 e) np
BOUND r , m 8 np
CLC STC CMC CLD STD 2 np
CLI STI 6-9 np
LODS 2 np
REP LODS 7+3*n g) np
STOS 3 np
REP STOS 10+n g) np
MOVS 4 np
REP MOVS 12+n g) np
SCAS 4 np
REP(N)E SCAS 9+4*n g) np
CMPS 5 np
REP(N)E CMPS 8+4*n g) np
BSWAP 1 a) np
CPUID 13-16 a) np
RDTSC 6-13 a) j) np
← →
jack128 © (2004-07-11 19:02) [6]
> А вдруг кол-во байтов не кратно 4 ?
всё что можно копируем двойными словами, а оставшиийся хвост побайтно..
← →
DiamondShark © (2004-07-11 22:53) [7]
> В мануалах написано что команды с префиксом реп, ваполняются
> на пару(или десятком, чето не помню точно) тактов дольше.
Дольше чем что?
← →
SergP © (2004-07-12 01:59) [8]
> [7] DiamondShark © (11.07.04 22:53)
>
> > В мануалах написано что команды с префиксом реп, ваполняются
>
> > на пару(или десятком, чето не помню точно) тактов дольше.
>
> Дольше чем что?
Может он имел ввиду сабжевый код?
Хотя я сомневаюсь. В таком случае зачем Intel вообще тогда сделал эти команды в процессоре?
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.033 c