E
mov
Size: a a a
E
mov
d
mov esi, src[esp]
mov edi, dest[esp]
mov ecx, esi
sub ecx, edi
test ecx, 1
jnz .Lmemcpy1
test ecx, 2
jnz .Lmemcpy2
но ещё есть вариант не использовать ecx и потом снова со стека загрузить esi/ediE
d
d
E
mov r, m
- пропускная способность = 1/2, так что не имеет смысла вставлять сразу 3 mov r, m
, ибо для этого процессора они не выполнятся параллельно, процессор перенесёт 3-й в дублированный исполнительный блок - AGU1
)mov esi, src[esp] ; AGU0 0.0 - 3.0
mov edi, dest[esp] ;
sub esi, edi ; ALU0 0.0 - 1.0
mov ecx, size[esp] ; AGU0 3.0 - 6.0
;sub esi, edi
test esi, 1 ; ALU0 1.0 - 2.0
jnz .Lmemcpy1 ; ALU0 (ZF 2.0 - 4.0) (!ZF 2.0 - 6.0)
E
rep movs
ВВ
E
0x400000: example1: db 'Test 1', 0Другой пример:
0x400007: example2: db 'Test 2', 0
0x40000E: example3: db 'Test 3', 0
0x400015: offset_table:
; Смещение = Размер одного элемента (должны быть все одинаковы размером)*Элемент
dd example1 ; Offset = 4*0 = 0 = 1-й элемент = адрес на строку "Test 1"
dd example2 ; Offset = 4*1 = 4 = 2-й элемент = адрес на строку "Test2"
dd example3 ; Offset = 4*2 = 8 = 3-й элемент = адрес на строку "Test 3"
Пример получения кодом:
mov eax, offset_table
mov ebx, dword[eax] ; Адрес стоит на offset_table=dd example1, нам нужно получить само значение example1, т.е сам адрес на example1, в EBX
; EBX = 'Test 1' = потому что метка offset_table уже указывает на первый элемент
add eax, 4
mov ebx, dword[eax]
; EBX = 'Test 2'
add eax, 4
mov ebx, dword[eax]
; EBX = 'Test 3'
mov eax, dword[offset_table+4] ; 'Test 2'
mov eax, dword[offset_table] ; или mov eax, dword[offset_table+0] = 'Test 1'
mov eax, dword[offset_table+8] ; 'Test 3'
d
d
d
E
mov r32, m
= 1/2, или выше (вот если выше - тогда плохо, потому что тогда можно пожертвовать третьим mov r32, m
, и перенести sub
- ниже, но я не слежу за процессорами, и таких ещё не знаю, поэтому 1/2), на старых - ниже, и вот как раз если ниже, тогда тебе нужно как можно раньше дать процессору выполнить инструкцию в sub
, потому что для r32, m
нужен AGU
, и ещё хорошо отделаешься, если они дублированные, и их хватит. Ибо если не хватит - придётся ждать освобождения занятого исполнительного блока, что вызовет доп. задержку.sub
ближе к mov r32, m
(ну, то есть, как я и скинул выше)d
E
d
E
E
d