Внимание: Вы не вошли в систему. Ваш IP-адрес будет общедоступен, если вы запишете какие-либо изменения. Если вы
войдёте или
создадите учётную запись, её имя будет использоваться вместо IP-адреса, наряду с другими преимуществами.
Правка может быть отменена.
Пожалуйста, просмотрите сравнение версий ниже, чтобы убедиться, что это нужная вам правка, и запишите страницу ниже, чтобы отменить правку.
Текущая версия |
Ваш текст |
Строка 76: |
Строка 76: |
| 1980 CMOVER0: 1 − M4 ; Прединкримент | | 1980 CMOVER0: 1 − M4 ; Прединкримент |
| 1981 CMOVERL: Cx KRM4 KM5 FL0 CMOVERL KGOTO9 | | 1981 CMOVERL: Cx KRM4 KM5 FL0 CMOVERL KGOTO9 |
| </pre>
| |
| Реализация из SP-Forth 4.20:
| |
| <pre>
| |
| CODE CMOVE ( c-addr1 c-addr2 u -- ) \ 94 STRING
| |
| \ Если u больше нуля, копировать u последовательных символов из пространства
| |
| \ данных начиная с адреса c-addr1 в c-addr2, символ за символом, начиная с
| |
| \ младших адресов к старшим.
| |
| MOV EDX, EDI
| |
| MOV ECX, EAX
| |
| MOV EDI, [EBP]
| |
| MOV ESI, 4 [EBP]
| |
| CLD
| |
| \ перекрываются ли области данных?
| |
| \ если нет, то можно копировать DWORD
| |
| MOV EBX, EDI
| |
| SUB EBX, ESI
| |
| JG SHORT @@2
| |
| NEG EBX
| |
| @@2: CMP EBX, EAX
| |
| JL SHORT @@1
| |
|
| |
| \ если выровняем на 4, то копируется в 3 раза быстрее
| |
| MOV EBX, EDI
| |
| AND EBX, # 3
| |
| JZ SHORT @@3
| |
| MOV ECX, # 4
| |
| SUB ECX, EBX
| |
|
| |
| CMP ECX, EAX
| |
| JL SHORT @@4
| |
| MOV ECX, EAX
| |
| JMP @@1 \ нечего выравнивать
| |
| @@4:
| |
| SUB EAX, ECX
| |
| REP MOVS BYTE
| |
| MOV ECX, EAX
| |
| @@3:
| |
| SAR ECX, # 2
| |
| \ вот здесь хорошо бы в MMX копировать
| |
| REP MOVS DWORD
| |
| MOV ECX, EAX
| |
| AND ECX, # 3
| |
| @@1:
| |
| REP MOVS BYTE
| |
| LEA EBP, 0C [EBP]
| |
| MOV EAX, -4 [EBP]
| |
| MOV EDI, EDX
| |
| RET
| |
| END-CODE
| |
| </pre> | | </pre> |
|
| |
|