Как считать от 0 до 18446744073709551616(2^64) в сборке x86?
Мне нужно считать от 0 до 18446744073709551616(2^64) в цикле.
Могу ли я использовать xmm regiters?
например, что-то вроде этого
MOV XMM0,0
LABEL1:
INC XMM0
CMP XMM0,18446744073709551616;(2^64)=18446744073709551616
JNE LABEL1
Если нет, что мне делать?
3 ответа
Моя сборка довольно ржавая, но вы можете получить 96-битный (32 * 3) счет с помощью adc
(Дополнение с переносом) примерно так:
; Reset our "composite register" ecx:ebx:eax to 0:
xor eax, eax
xor ebx, ebx
xor ecx, ecx
loop:
add eax, 1
adc ebx, 0 ; adds 1 to ebx if eax just overflowed, 0 otherwise
adc ecx, 0 ; adds 1 to ecx if the previous addition overflowed
cmp ecx, 1 ; This is true after 2^64 iterations
jne loop
Вам не нужен 128-битный регистр. Увеличьте 64-битный регистр и проверьте на переполнение.
xor rax, rax
again: inc rax
jz again ; zero flag is set on inc overflow
... или вы можете сделать это с помощью цикла (но инструкция цикла может быть "медленной")
xor rcx, rcx
again: loop again ; ~rcx counts UP to 2^64 as rcx counts down to 0
... add использует больше места для кода операции, чем inc, но МОЖЕТ быть быстрее
xor rax, rax
again: add rax, 1
jc again
... разверните петлю для еще большей скорости
xor rax, rax
again: add rax, 1
add rax, 1
add rax, 1
add rax, 1
add rax, 1
add rax, 1
add rax, 1
add rax, 1
jc again ; only test needed as we know final_value % 8 == 0
Кроме того, каждое ядро процессора всегда выполняет функцию, которую вы запрашивали с момента загрузки. Вы можете опросить его прогресс с помощью инструкции RDTSC.
rdtsc ; progress reported in rdx:rax
Каждый хочет знать суть вашего вопроса. Я предполагаю, что есть один, потому что вы спросили это. Для тех, кто не может рассмотреть причину:
a) progress will be inspected before completion
b) fool unreachable code "error" detection
c) wasQuantumComputerInvented() function
d) easier to ask than "real" question
e) OP didn't originally realize how long it might take
f) or simply a learning exercise
... а если серьезно, какой смысл?
loop:
JMP loop
Через ~400 лет этот цикл достигнет 2^64.
Любой, кто запускает это так долго, не достигнув 2^64, дайте мне знать, но не было сообщений о сбое этого алгоритма, так как для всех намерений и целей он так же полезен, как принятый ответ.