AFAIK, the only register that can be used as the second operand to "rol" is cl. Try...
SECTION .data
SECTION .text
global _main
_main:
mov r8d, 0xF000FF00
mov r9d, 0xF000FF00
rol r8d, 62 ; could be any uint32 by scenario
mov eax, 62 ; ok let's reduce it by
mov ebx, 32 ; edx = eax % ebx
xor edx, edx ; "div" divides edx:eax by ebx!!!
div ebx ; edx = 30
; rol r9d, [edx] ; r9d << [edx] ????
; error: invalid combination of opcode and operands
; even if this assembled, attempting to access memory
; at [30] would surely crash
mov cl, dl
rol r9d, cl
ret
Untested!!!
Best,
Frank