Как считать от 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, дайте мне знать, но не было сообщений о сбое этого алгоритма, так как для всех намерений и целей он так же полезен, как принятый ответ.

Другие вопросы по тегам