我正在尝试使用 rdtscp 计时子程序。这是我的程序:
; Setting up time
rdtscp ; Getting time
push rax ; Saving timestamp
; for(r9=0; r9<LOOP_SIZE; r9++)
mov r9, 0
lup0:
call subr
inc r9
cmp r9, LOOP_SIZE
jnz lup0
; Calculating time taken
pop rbx ; Loading old time
rdtscp ; Getting time
sub rax, rbx ; Calculating difference
如果LOOP_SIZE足够小,我会得到一致且预期的结果。但是,当我让它足够大(大约 10^9)时,我会从 10^9 飙升到 10^20。
; Result with "LOOP_SIZE equ 100000000"
971597237
; Result with "LOOP_SIZE equ 1000000000"
18446744072281657066
我用来显示数字的方法将它们显示为无符号,所以我想显示的大数字实际上是一个负数并且发生了溢出。但是,971597237甚至没有接近 64 位整数限制,所以,假设问题是溢出,为什么会发生呢?